制作出来的实物图如下:
怎么才能让四个灯都亮,串口可以接受数据
单片机源程序如下:
- #include "reg52.h"
- #define uchar unsigned char
- #define uint unsigned int
-
- sbit key1=P3^2;
- sbit key2=P3^3;
- int sec; //显示的时间
- uchar flagStart; //启动标志位,1表示启动,0表示暂停
- char num; //自加,自减数
- uchar code charLed[]= //数码管数字0~9
- {0x05,0x7D,0x46,0x54,0x3C,
- 0x94,0x84,0x5D,0x04,0x14};
- uchar code whoLed[] = {0xEF,0xDF,0xBF,0x7F}; //P2对应的数码管位选(从左到右)
- uchar bufLed[] = {0x05,0x01,0x05,0x05}; //sec显示缓存区
- uchar read_cnt;
- uchar read_buff[50];
- uchar timimg[]="12:00";
- uchar cnt_all=50;
- bit flag_rx=0;
- void Display();
- void Change();
- void Init();
- void dealing();
- void uart_init_hardware();
- void send_single_byte_hardware(uchar by);
- void send_string_hardware(uchar *p);
- void main()
- {
- Init(); //初始化(串口初始化包含在内)
- while(1)
- {
- dealing();
- send_string_hardware( timimg);
- }
- }
- /*初始化函数*/
- void Init()
- {
- TMOD = 0x00; //设置定时器0,定时器1为16位自动重装模式
- TH0 = 0xFC; //定时器0周期设置1ms
- TL0 = 0x66;
- IE = 0x87; //启动总中断,定时器0中断,外部中断0,外部中断1
- TCON = 0x15; //启动定时器0,设置外部中断0,外部中断1触发方式为下降沿触发
- uart_init_hardware(); //串口1,定时器1初始化(9600bps,11.0592MHz)
- sec = 0; //初始显示的秒数
- flagStart = 0; //启动标志位,1表示启动,0表示暂停
- num = 1; //开始为自加模式
- }
- /*串口硬件初始化*/
- void uart_init_hardware()
- {
- SCON=0x50;//关于sm1 sm0 ren的编辑,0101 0000 即方式01且允许串口中断接收
- PCON=0x00;//电源相关寄存器配置 最高位为smod 即波特率翻倍标志位
- TMOD&=0x0f;//保留用于中断定时器1的配置
- TMOD|=0x20;//设置定时器1方式为2
- EA=1;//开总中断
- ES=1;//串口中断允许位
- TL1=0xfd;//定时器1配置 (11059200/(12*9600))/32=3 0xff-3=0xfd
- TH1=0xfd;
- TR1=1;//开启定时器1,等待中断
-
- }
- /*数码管显示函数*/
- void Display()
- {
- static uchar i=0;
- P0 = 0xFF; //消隐
- P2 = whoLed[i]; //选择位选
- P0 = bufLed[i]; //显示数字
- i++;
- i&=0x03;
- }
- /*显示数字改变*/
- void Change()
- {
- uint x;
- char i;
- if(sec >= 6000) //如果sec大于6000
- sec = 0; //置零
- if(sec < 0 ) //如果sec小于0
- sec = 5999; //置为5999
- x=sec;
- for(i=3;i>=0;i--)
- {
- bufLed[i] = charLed[x%10]; //从高位到低位提取数字
- x/=10; //清除低位
- }
- bufLed[0] &= 0xFB; //添加小数点
- }
- void send_single_byte_hardware(uchar by)
- {
- SBUF = by;//参数传递,向SBUF中写入数据
- while(!TI);//通过读取标志位,等待写入完成
- TI = 0;//标志位清零
- }
- void send_string_hardware(uchar *p)//发送数据直到遇到结束符
- {
- while(*p!= '\0')//在数组中未完之前一直发送
- {
- send_single_byte_hardware(*p);
- p++;
- }
- }
- void dealing()
- {
- char z=0;
- if(flag_rx)
- {
- flag_rx=0;
- for(;read_cnt<50;read_cnt++)
- {
- if(read_buff[read_cnt]=='{'&&read_buff[read_cnt+1]=='|'&&read_cnt<=40&&read_buff[read_cnt+6]=='|'&&read_buff[read_cnt+7]=='}')
- for(;z<5;z++)
- {
- if(read_buff[read_cnt+2+z]>='0'&&read_buff[read_cnt+2+z]<='9')
- timimg[z]=read_buff[read_cnt+2+z];
- else break;
- }
- else if(read_buff[read_cnt]=='S'&&read_buff[read_cnt+1]=='T'&&read_buff[read_cnt+1]=='O'&&read_buff[read_cnt+1]=='P')
- {
- flagStart=1;
- flagStart=~flagStart;
- }
- else if(read_buff[read_cnt]=='B'&&read_buff[read_cnt+1]=='A'&&read_buff[read_cnt+1]=='C'&&read_buff[read_cnt+1]=='K') ;
- }
- }
- }
- /*外部中断0*/
- void InterruptExint_0()interrupt 0 //启动,暂停模式切换
- {
- IE &= 0xfe; //关外部中断0
- flagStart = ~flagStart;
- IE |= 0x01; //开外部中断0
- }
- /*外部中断1*/
- void InterruptExint_1()interrupt 2 //自加,自减模式切换
- {
- IE &= 0xFB; //关外部中断1
- num = -num; //自加,自减模式切换
- IE |= 0x04; //开外部中断1
- }
- /*定时器0*/
- void InterruptTime_0()interrupt 1 //动态扫描,串口监测
- {
- static uchar cnt = 0; //计时累加位ms
- Display(); //动态扫描
- if(flagStart) //判断是否启动
- {
- cnt++; //累加
- if (cnt >= 10) //10ms后
- {
- cnt = 0; //累加位清零
- sec += num; //sec自加或自减
- Change(); //改变显示函数
- }
- }
-
- }
- void ser() interrupt 4
- {
- RI=0;//标志位清零
- cnt_all--;
- if(cnt_all||(SBUF!='\0'))
- read_buff[cnt_all]=SBUF;//数据读取
- else
- {
- cnt_all=50;
- flag_rx=1;
- }
-
- }
复制代码
|