標(biāo)題: 單片機(jī)串口控制數(shù)碼管的動(dòng)態(tài)顯示程序問題 [打印本頁]

作者: Wang123wan    時(shí)間: 2021-4-14 21:49
標(biāo)題: 單片機(jī)串口控制數(shù)碼管的動(dòng)態(tài)顯示程序問題
制作出來的實(shí)物圖如下:


怎么才能讓四個(gè)燈都亮,串口可以接受數(shù)據(jù)

單片機(jī)源程序如下:
  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;                                                                     //顯示的時(shí)間
  8. uchar flagStart;                                                         //啟動(dòng)標(biāo)志位,1表示啟動(dòng),0表示暫停
  9. char num;                                                                        //自加,自減數(shù)

  10. uchar code charLed[]=                                                                  //數(shù)碼管數(shù)字0~9
  11.         {0x05,0x7D,0x46,0x54,0x3C,
  12.         0x94,0x84,0x5D,0x04,0x14};
  13. uchar code whoLed[] = {0xEF,0xDF,0xBF,0x7F};                  //P2對應(yīng)的數(shù)碼管位選(從左到右)
  14. uchar bufLed[] = {0x05,0x01,0x05,0x05};                                  //sec顯示緩存區(qū)
  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();                                                                        //初始化(串口初始化包含在內(nèi))

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

  35. }

  36. /*初始化函數(shù)*/
  37. void Init()
  38. {
  39.         TMOD = 0x00;                                                          //設(shè)置定時(shí)器0,定時(shí)器1為16位自動(dòng)重裝模式
  40.         TH0  = 0xFC;                                                          //定時(shí)器0周期設(shè)置1ms
  41.         TL0  = 0x66;
  42.         IE   = 0x87;                                                          //啟動(dòng)總中斷,定時(shí)器0中斷,外部中斷0,外部中斷1
  43.         TCON = 0x15;                                                          //啟動(dòng)定時(shí)器0,設(shè)置外部中斷0,外部中斷1觸發(fā)方式為下降沿觸發(fā)
  44.     uart_init_hardware();                                                                  //串口1,定時(shí)器1初始化(9600bps,11.0592MHz)
  45.         sec  = 0;                                                              //初始顯示的秒數(shù)
  46.         flagStart = 0;                                                         //啟動(dòng)標(biāo)志位,1表示啟動(dòng),0表示暫停
  47.         num  = 1;                                                                //開始為自加模式
  48. }

  49. /*串口硬件初始化*/
  50. void uart_init_hardware()
  51. {
  52.                 SCON=0x50;//關(guān)于sm1 sm0 ren的編輯,0101 0000 即方式01且允許串口中斷接收
  53.                 PCON=0x00;//電源相關(guān)寄存器配置 最高位為smod 即波特率翻倍標(biāo)志位
  54.                 TMOD&=0x0f;//保留用于中斷定時(shí)器1的配置
  55.                 TMOD|=0x20;//設(shè)置定時(shí)器1方式為2
  56.                 EA=1;//開總中斷
  57.                 ES=1;//串口中斷允許位
  58.                 TL1=0xfd;//定時(shí)器1配置 (11059200/(12*9600))/32=3    0xff-3=0xfd
  59.                 TH1=0xfd;
  60.                 TR1=1;//開啟定時(shí)器1,等待中斷
  61.                
  62. }

  63. /*數(shù)碼管顯示函數(shù)*/
  64. void Display()
  65. {
  66.         static uchar i=0;
  67.         P0 = 0xFF;                                                                                  //消隱
  68.         P2 = whoLed[i];                                                                          //選擇位選
  69.         P0 = bufLed[i];                                                                          //顯示數(shù)字
  70.         i++;
  71.         i&=0x03;
  72. }

  73. /*顯示數(shù)字改變*/
  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];                                          //從高位到低位提取數(shù)字
  86.                 x/=10;                                                                                //清除低位
  87.         }
  88.         bufLed[0] &= 0xFB;                                                                    //添加小數(shù)點(diǎn)
  89. }


  90. void send_single_byte_hardware(uchar by)
  91. {
  92.                 SBUF = by;//參數(shù)傳遞,向SBUF中寫入數(shù)據(jù)
  93.                 while(!TI);//通過讀取標(biāo)志位,等待寫入完成
  94.                 TI = 0;//標(biāo)志位清零   
  95. }



  96. void send_string_hardware(uchar *p)//發(fā)送數(shù)據(jù)直到遇到結(jié)束符
  97. {

  98.             while(*p!= '\0')//在數(shù)組中未完之前一直發(fā)送
  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                        //啟動(dòng),暫停模式切換
  130. {
  131.         IE  &= 0xfe;                                                         //關(guān)外部中斷0
  132.         flagStart = ~flagStart;
  133.         IE  |= 0x01;                                                        //開外部中斷0
  134. }

  135. /*外部中斷1*/
  136. void InterruptExint_1()interrupt 2                        //自加,自減模式切換
  137. {
  138.         IE &= 0xFB;                                                                 //關(guān)外部中斷1
  139.         num = -num;                                                                 //自加,自減模式切換
  140.         IE |= 0x04;                                                                 //開外部中斷1
  141. }

  142. /*定時(shí)器0*/
  143. void InterruptTime_0()interrupt 1                        //動(dòng)態(tài)掃描,串口監(jiān)測
  144. {
  145.         static uchar cnt = 0;                                        //計(jì)時(shí)累加位ms
  146.         Display();                                                                //動(dòng)態(tài)掃描
  147.         if(flagStart)                                                        //判斷是否啟動(dòng)
  148.         {        
  149.                 cnt++;                                                                //累加
  150.                 if (cnt >= 10)                                                //10ms后
  151.                 {
  152.                         cnt = 0;                                                //累加位清零
  153.                         sec += num;                                                //sec自加或自減
  154.                         Change();                                                //改變顯示函數(shù)
  155.                 }
  156.         }
  157.         
  158. }

  159. void ser() interrupt 4
  160. {                 

  161.             RI=0;//標(biāo)志位清零
  162.             cnt_all--;
  163.             if(cnt_all||(SBUF!='\0'))                                                
  164.                     read_buff[cnt_all]=SBUF;//數(shù)據(jù)讀取                        
  165.         else
  166.                 {
  167.               cnt_all=50;
  168.                        flag_rx=1;
  169.                 }                                 
  170.                                                                                                          
  171. }

復(fù)制代碼






歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1