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开启
}