找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 764|回复: 0
打印 上一主题 下一主题
收起左侧

单片机串口控制数码管的动态显示程序问题

[复制链接]
跳转到指定楼层
楼主
制作出来的实物图如下:


怎么才能让四个灯都亮,串口可以接受数据

单片机源程序如下:
  1. #include "reg52.h"
  2. #define uchar unsigned char
  3. #define uint unsigned int
  4.         
  5. sbit key1=P3^2;
  6. sbit key2=P3^3;


  7. int sec;                                                                     //显示的时间
  8. uchar flagStart;                                                         //启动标志位,1表示启动,0表示暂停
  9. char num;                                                                        //自加,自减数

  10. uchar code charLed[]=                                                                  //数码管数字0~9
  11.         {0x05,0x7D,0x46,0x54,0x3C,
  12.         0x94,0x84,0x5D,0x04,0x14};
  13. uchar code whoLed[] = {0xEF,0xDF,0xBF,0x7F};                  //P2对应的数码管位选(从左到右)
  14. uchar bufLed[] = {0x05,0x01,0x05,0x05};                                  //sec显示缓存区
  15. uchar read_cnt;
  16. uchar read_buff[50];
  17. uchar timimg[]="12:00";
  18. uchar cnt_all=50;

  19. bit flag_rx=0;
  20. void Display();
  21. void Change();
  22. void Init();
  23. void dealing();
  24. void uart_init_hardware();
  25. void send_single_byte_hardware(uchar by);
  26. void send_string_hardware(uchar *p);



  27. void main()
  28. {

  29.    Init();                                                                        //初始化(串口初始化包含在内)

  30. while(1)
  31.   {               
  32.      dealing();
  33.            send_string_hardware( timimg);
  34.   }

  35. }

  36. /*初始化函数*/
  37. void Init()
  38. {
  39.         TMOD = 0x00;                                                          //设置定时器0,定时器1为16位自动重装模式
  40.         TH0  = 0xFC;                                                          //定时器0周期设置1ms
  41.         TL0  = 0x66;
  42.         IE   = 0x87;                                                          //启动总中断,定时器0中断,外部中断0,外部中断1
  43.         TCON = 0x15;                                                          //启动定时器0,设置外部中断0,外部中断1触发方式为下降沿触发
  44.     uart_init_hardware();                                                                  //串口1,定时器1初始化(9600bps,11.0592MHz)
  45.         sec  = 0;                                                              //初始显示的秒数
  46.         flagStart = 0;                                                         //启动标志位,1表示启动,0表示暂停
  47.         num  = 1;                                                                //开始为自加模式
  48. }

  49. /*串口硬件初始化*/
  50. void uart_init_hardware()
  51. {
  52.                 SCON=0x50;//关于sm1 sm0 ren的编辑,0101 0000 即方式01且允许串口中断接收
  53.                 PCON=0x00;//电源相关寄存器配置 最高位为smod 即波特率翻倍标志位
  54.                 TMOD&=0x0f;//保留用于中断定时器1的配置
  55.                 TMOD|=0x20;//设置定时器1方式为2
  56.                 EA=1;//开总中断
  57.                 ES=1;//串口中断允许位
  58.                 TL1=0xfd;//定时器1配置 (11059200/(12*9600))/32=3    0xff-3=0xfd
  59.                 TH1=0xfd;
  60.                 TR1=1;//开启定时器1,等待中断
  61.                
  62. }

  63. /*数码管显示函数*/
  64. void Display()
  65. {
  66.         static uchar i=0;
  67.         P0 = 0xFF;                                                                                  //消隐
  68.         P2 = whoLed[i];                                                                          //选择位选
  69.         P0 = bufLed[i];                                                                          //显示数字
  70.         i++;
  71.         i&=0x03;
  72. }

  73. /*显示数字改变*/
  74. void Change()
  75. {
  76.         uint x;
  77.         char i;
  78.         if(sec >= 6000)                                                                           //如果sec大于6000
  79.                 sec = 0;                                                                        //置零
  80.         if(sec < 0 )                                                                        //如果sec小于0
  81.                 sec = 5999;                                                                        //置为5999
  82.         x=sec;
  83.         for(i=3;i>=0;i--)                                                         
  84.         {
  85.                 bufLed[i] = charLed[x%10];                                          //从高位到低位提取数字
  86.                 x/=10;                                                                                //清除低位
  87.         }
  88.         bufLed[0] &= 0xFB;                                                                    //添加小数点
  89. }


  90. void send_single_byte_hardware(uchar by)
  91. {
  92.                 SBUF = by;//参数传递,向SBUF中写入数据
  93.                 while(!TI);//通过读取标志位,等待写入完成
  94.                 TI = 0;//标志位清零   
  95. }



  96. void send_string_hardware(uchar *p)//发送数据直到遇到结束符
  97. {

  98.             while(*p!= '\0')//在数组中未完之前一直发送
  99.                 {
  100.                 send_single_byte_hardware(*p);
  101.                 p++;        
  102.             }
  103. }



  104. void dealing()
  105. {
  106. char z=0;
  107.                                 if(flag_rx)
  108.                                         {
  109.                                    flag_rx=0;
  110.                                                 for(;read_cnt<50;read_cnt++)
  111.                                                         {
  112.                                                          if(read_buff[read_cnt]=='{'&&read_buff[read_cnt+1]=='|'&&read_cnt<=40&&read_buff[read_cnt+6]=='|'&&read_buff[read_cnt+7]=='}')
  113.                                                                                         for(;z<5;z++)
  114.                                                                                         {        
  115.                                                                                         if(read_buff[read_cnt+2+z]>='0'&&read_buff[read_cnt+2+z]<='9')                                                               
  116.                                                                                         timimg[z]=read_buff[read_cnt+2+z];
  117.                                                                                                 else break;        
  118.                                                                                         }                                                                                
  119.                                                          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')        
  120.                                                                                  {
  121.                                                                                    flagStart=1;
  122.                                                                                    flagStart=~flagStart;
  123.                                                                                  }        
  124.                                                          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')        ;         
  125.                                                         }
  126.                                         }

  127. }



  128. /*外部中断0*/
  129. void InterruptExint_0()interrupt 0                        //启动,暂停模式切换
  130. {
  131.         IE  &= 0xfe;                                                         //关外部中断0
  132.         flagStart = ~flagStart;
  133.         IE  |= 0x01;                                                        //开外部中断0
  134. }

  135. /*外部中断1*/
  136. void InterruptExint_1()interrupt 2                        //自加,自减模式切换
  137. {
  138.         IE &= 0xFB;                                                                 //关外部中断1
  139.         num = -num;                                                                 //自加,自减模式切换
  140.         IE |= 0x04;                                                                 //开外部中断1
  141. }

  142. /*定时器0*/
  143. void InterruptTime_0()interrupt 1                        //动态扫描,串口监测
  144. {
  145.         static uchar cnt = 0;                                        //计时累加位ms
  146.         Display();                                                                //动态扫描
  147.         if(flagStart)                                                        //判断是否启动
  148.         {        
  149.                 cnt++;                                                                //累加
  150.                 if (cnt >= 10)                                                //10ms后
  151.                 {
  152.                         cnt = 0;                                                //累加位清零
  153.                         sec += num;                                                //sec自加或自减
  154.                         Change();                                                //改变显示函数
  155.                 }
  156.         }
  157.         
  158. }

  159. void ser() interrupt 4
  160. {                 

  161.             RI=0;//标志位清零
  162.             cnt_all--;
  163.             if(cnt_all||(SBUF!='\0'))                                                
  164.                     read_buff[cnt_all]=SBUF;//数据读取                        
  165.         else
  166.                 {
  167.               cnt_all=50;
  168.                        flag_rx=1;
  169.                 }                                 
  170.                                                                                                          
  171. }

复制代码

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表