/*使用C8051F410,内部晶振24.5M不分频*/
//波特率设为115200
#include "c8051f410.h"
sbit S2=P0^2; // S ='0' means switch pressed
sbit S3=P0^3;
sbit LED3=P1^2; // LED ='0' means ON
sbit LED2=P1^3;
bit key2_down_flag=0;
bit key3_down_flag=0;
bit serial_busy=0;
void delay(int i)
{
while(--i);
}
main(void)
{
PCA0MD &= ~0x40; // WDTE = 0 关闭看门狗,上电默认打开
XBR0|=0x01; //在外设连接寄存器0上把UART0连接到引脚P0.4和P0.5
XBR1= 0x40; //打开交叉开关,使能弱上拉,要使GPIO生效,必须打开交叉开关
OSCICN |=0x07; //系统时钟选择为内部振荡器不分频,即24.5M
while (!(OSCICN & 0x40)); //等待内部振荡器输出稳定后离开循环
/*初始化定时器1*/
TMOD|=0x20; //定时器1工作在8位自动重装方式
CKCON|=0x08; //定时器1时钟源选择为系统时钟不分频
TH1=150; //采用默认的24.5M时钟,根据公式计算当波特率为115200时,TH1=150;
TL1=0;
TR1=1;
//ET1=1; //开启定时器1中断允许
/*初始化串口*/
S0MODE=0; //8位的UART工作方式
REN0=1; //接收允许
ES0=1; //打开串口中断
EA=1; //允许所有中断
while (1)
{
if (S2 == 0)
{
if(!key2_down_flag)
{
while(serial_busy);
SBUF0='A';
serial_busy=1;
while(serial_busy);
SBUF0='B';
serial_busy=1;
while(serial_busy);
SBUF0='C';
serial_busy=1;
key2_down_flag=1;
LED2=0; // Turn on LED
}
}
else
{
key2_down_flag=0;
LED2=1; // Else, turn it off
}
if (S3 == 0)
{
if(!key3_down_flag)
{
while(serial_busy);
SBUF0='a';
serial_busy=1;
while(serial_busy);
SBUF0='b';
serial_busy=1;
while(serial_busy);
SBUF0='c';
serial_busy=1;
key3_down_flag=1;
LED3=0; // Turn on LED
}
}
else
{
key3_down_flag=0;
LED3=1; // Else, turn it off
}
delay(3000);
} // end of while(1)
}
/*串口中断服务程序*/
void uart0(void) interrupt 4
{
if(TI0)
{
TI0=0;
serial_busy=0;
}
else
RI0=0;
}