FMD辉芒微MS80F0801单片机小结1

MS80F0801 8位(8pin/6pin)单片机

该单片机配置信息如下:

*Memory: Flash 1KX14b, EEPROM 256X8b, SRAM 64X8b

*振荡器:内部RC 4MHz

*引脚定义:

*                         ----------------

* VDD-----------|1(VDD) (GND)8|------------GND

* NC ------------|2(RA2) (RA4)7|-------------OUTPUT

* NC ------------|3(RA1) (RA5)6|-------------NC

* NC ------------|4(RA3) (RA0)5|-------------NC

*                         ----------------

* MS80F0801 SOP8

 

1、IO口

PA端口可设置为输入、输出以及端口的上拉/下拉。

设置PA端口的操作如下:

PORTA = 0B00000000; //初始化PORTA的电平,默认为0

//PA3端口只具有输入功能,不存在对应的数据寄存器

TRISA = 0B00101111; //设置PA端口的输入/输出,0--输出,1--输入

WPUA = 0B00000000; //PA端口上拉控制,1--开上拉,0--关上拉

 

2、中断

从中断控制器INTCON寄存器的描述可看出,MS80F0801单片机支持的中断源有外部中断(PA2/INT)、PORTA端口电平中断、Timer0定时器中断、外设中断(如Timer2),以端口RA2为例,

(1)当RA2作为PORTA端口电平中断源时,相关的操作函数如下:

1)中断处理函数如下:

void interrupt ISR(void)

{

if (PAIE && PAIF)

{

PAIF = 0; //清除PORTA电平变化中断标志位

/* 实现功能 */

}

}

2)RA2端口配置寄存器如下:

PORTA = 0B00000000;

TRISA = 0B00101111; //PA输入输出 0-输出 1-输入

WPUA = 0B00000100; //PA端口上拉控制 1-开上拉 0-关上拉

//端口RA2开上拉

3)开启中断

void ENABLE_INTERRUPT(void)

{

IOCA2 = 1; //开启RA2电平变化中断

PAIF = 0; //清除PORTA电平变化中断标志位

PAIE = 1; //允许PORTA电平变化中断

GIE = 1; //开启总中断

}

 

(2)当RA2作为外部中断源时,相关的操作函数如下:

1)中断处理函数如下:

void interrupt ISR(void)

{

if(INTE && INTF)

{

INTF = 0; //清除外部中断标志位

if(INTEDG==1) //上升沿

{

INTEDG = 0;

RA4 = 1;

}

else //下升沿

{

INTEDG = 1;

RA4 = 0;

}

}

}

2)RA2端口配置寄存器如下:

PORTA = 0B00000000;

TRISA = 0B00101111; //PA输入输出 0-输出 1-输入

WPUA = 0B00000100; //PA端口上拉控制 1-开上拉 0-关上拉

//端口RA2开上拉

INTEDG = 0; //下降沿触发中断

3)开启程序所需要的中断源

void ENABLE_INTERRUPT(void)

{

INTEDG = 0; //下降沿触发中断

INTF = 0; //清除外部中断标志位

INTE = 1; //允许外部中断

GIE = 1; //开启总中断

}

 

3、定时器Timer0、Timer2

(1)TImer0

TImer0为8位,可配置为计数器或定时器使用。作为定时器时,其计数时钟为系统时钟的 4 分频,即每一指令周期递增一次。有一个与 WDT 共用的 8 位预分频器,PSA 为 0 时该预分频器分配给定时器 0 使用。

注意:当改变PSA的值时,硬件会自动把预分频器清0.

相关的操作函数如下:

1)定时器0中断处理函数

void interrupt ISR(void)

{

if (T0IF && T0IE)

{

T0IF = 0; //清除Timer0中断标志位

TMR0 = 6; //Timer0计数结果寄存器重新赋值

...

}

}

 

2)初始化定时器0

void TIMER0_INIT(void)

{

OPTION = 0B00000001; //Bit4=0 TIMER0 MODE,PS=001=1:4 TIMER0 RATE

//TIMER0溢出时间计算:

//1.单指令周期=(1/4MHz)*4=1us

//2.TIMER0自加1所需时间=单指令周期*分频比=1us*4=4us

//3.TIMER0溢出时间=(256-TIMER0初值)*自加1所需时间=(256-6)*4us=1ms

}

 

3)开启定时器Timer0

void ENABLE_INTERRUPT(void)

{

T0IF = 0; //清除Timer0中断标志位

T0IE = 1; //使能Timer0中断

GIE = 1; //开启总中断

}

 

(2)Timer2

定时器2为8位定时器,包含预分配和后分频计数器操作,Timer2的溢出时长计算如下:

设置TIMER2的预分频比为1:4,内部振荡器为4MHz,

PR2值为100,后分频比为1:5

所以溢出时长=(1/Fosc)*指令周期*PR2*预分频比*后分频比

=(1/4MHz)*4T*100*4*5=2000us

 

相关的操作函数如下:

1)Timer2中断处理函数

void interrupt ISR(void)

{

if (TMR2IE && TMR2IF)

{

TMR2IF = 0; //清除Timer2中断标志位

...

}

}

 

2)初始化Timer2

void TIMER2_INIT(void)

{

TMR2 = 0;

PR2 = 100;

T2CON = 0B00100001; //Bit6~Bit3,后分频比=1:5

//Bit2,暂时不开启Timer2

//Bit1~Bit0,预分频比=1:4

//溢出时长=(1/Fosc)*指令周期*PR2*预分频比*后分频比

// =(1/4MHz)*4T*100*4*5=2000us

}

 

3)开启Timer2中断

void ENABLE_INTERRUPT(void)

{

TMR2IF = 0; //清除Timer2中断标志位

TMR2IE = 1; //使能Timer2中断

TMR2ON = 1; //开启Timer2

PEIE = 1; //开启外设中断总闸

GIE = 1; //开启总中断

//注:Timer2属于外设,所以要开启Timer2溢出中断,必须把外设总闸PEIE开启

}

你可能感兴趣的:(单片机)