设计要求
通过串口接收字符控制数码管的显示,PC端发送字符'A',数码管显示'A',发送其它非法字符时,数码管显示'E'。
数码管显示格式如下:
备注:
单片机IRC振荡器频率设置为12MHz。
串口通信波特率:9600bps。
按键模式:BTN;扩展方式:IO模式
除字符'A'外,其它字符均为非法字符。
个人代码
#include <STC15F2K60S2.H>
code unsigned char Seg_Table[] =
{
0x88, //A 0
0x86, //E 1
0xff //熄灭 2
};
unsigned char Seg_Buff[]={2,2,2,2,2,2,2,2};
unsigned char flag=0,rdat='A';
void init74hc138(unsigned char n){
P2=(P2&0x1f)|(n<<5);
P2&=0x1f;
}
void init(){
P0=0x00;
init74hc138(5);
P0=0xff;
init74hc138(4);
}
void seg(unsigned char addr,num){
P0=0xff;
init74hc138(7);
P0=0x01<<addr;
init74hc138(6);
P0=Seg_Table[num];
init74hc138(7);
}
void Seg_Loop(){
static unsigned char i=0;
seg(i,Seg_Buff[i]);
i++;
if(i==8)i=0;
}
void Timer0_Init(void) //1毫秒@12.000MHz
{
AUXR |= 0x80; //定时器时钟1T模式
TMOD &= 0xF0; //设置定时器模式
TL0 = 0x20; //设置定时初始值
TH0 = 0xD1; //设置定时初始值
TF0 = 0; //清除TF0标志
TR0 = 1; //定时器0开始计时
ET0 = 1; //使能定时器0中断
EA=1;
}
void UartInit(void) //9600bps@12.000MHz
{
SCON = 0x50; //8位数据,可变波特率
AUXR |= 0x40; //定时器时钟1T模式
AUXR &= 0xFE; //串口1选择定时器1为波特率发生器
TMOD &= 0x0F; //设置定时器模式
TL1 = 0xC7; //设置定时初始值
TH1 = 0xFE; //设置定时初始值
ET1 = 0; //禁止定时器中断
TR1 = 1; //定时器1开始计时
ES=1;
EA=1;
}
//void uart_send_byte(unsigned char date){
// SBUF=date;
// while(TI==0);
// TI=0;
//}
void main(){
init();
Timer0_Init();
UartInit();
while(1){
if(flag){
flag=0;
if(rdat=='A')
Seg_Buff[7]=0;
else
Seg_Buff[7]=1;
Seg_Loop();
}
}
}
void Timer0_Isr(void) interrupt 1
{
static unsigned char count=0;
count++;
if(count==2){
count=0;
flag=1;
}
}
void uart() interrupt 4
{
if(RI){
RI=0;
rdat=SBUF;
}
}