设计要求
通过串口发送字符控制数码管的显示,
串口接收字符’A’,数码管显示’A’,且LED1指示灯亮;
串口接收字符’S’,数码管显示’S’,且LED3指示灯亮;
接收其它非法字符时,数码管显示’E’。
数码管显示格式如下:
备注
单片机IRC振荡器频率设置为12MHz。
串口通信波特率:9600bps。
按键模式:BTN;扩展方式:IO模式。
上电时数码管处于熄灭状态。
除字符’A’和’S’外,其它字符均为非法字符。
代码
sys.h
#ifndef __SYS_H__
#define __SYS_H__
#include <STC15F2K60S2.H>
void init74hc138(unsigned char n);
void init();
void seg(unsigned char num);
void led_show(unsigned char n);
#endif
main.c
#include "sys.h"
unsigned char str;
bit flag=0;
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 main(){
init();
UartInit();
while(1){
if(flag){
if(str=='A'){
seg(0);
led_show(0);
}else if(str=='S'){
seg(1);
led_show(1);
}else{
seg(2);
init();
}
}
flag=0;
}
}
void uart() interrupt 4
{
if(RI){
RI=0;
str=SBUF;
flag=1;
}
}
sys.c
#include "sys.h"
void init74hc138(unsigned char n){
P2=(P2&0x1f)|(n<<5);
P2&=0x1f;
}
void init(){
P0=0x00;
init74hc138(5);
P0=0xff;
init74hc138(4);
}
void led(unsigned char n){
P0=0x01<<n-1;
P0=~P0;
init74hc138(4);
P0=0xff;
}
void led_show(unsigned char n){
switch(n){
case 0:led(1);break;
case 1:led(3);break;
}
}
seg.c
#include "sys.h"
//本题只需要一段数码管
code unsigned char Seg_Table[]={
0x88,//A 0
0x92,//S 1
0x86,//E 2
0xff //熄灭 3
};
void seg(unsigned char num){
P0=0xff;
init74hc138(7);
P0=0x80;
init74hc138(6);
P0=Seg_Table[num];
init74hc138(7);
}