久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

標題: 51單片機通過串口實現雙機通信的問題 [打印本頁]

作者: nimab    時間: 2020-3-29 22:17
標題: 51單片機通過串口實現雙機通信的問題
我用主機的點陣弄了個9-0秒的倒計時,從機給主機發送按鍵值(主機倒計時是用定時器0,串口用了定時器一,串口的通信是ok的)。
我要實現的功能是:從機掃描按下按鍵,主機開始顯示倒計時。
我現在的問題是:
我的點陣只能顯示9(不會變成8),我顯示是放在串口中斷里面,定時器0只用來計時(50ms一次溢出),串口波特率4800
請問:1.顯示的函數應該在哪個地方,中斷還是while循環
          2.中斷的優先級需不需要改
請大神們幫幫忙。
看看哪里需要修改。

這是單片機代碼

  1. u8 Time=0,second=0;
  2. u8 Val=0;

  3. void zhongduan_Init(void)
  4. {
  5.         TMOD = 0x21; //開啟定時器0、1
  6.           TH0 = 0x3C;         //設置初始值,定時50ms
  7.           TL0 = 0xB0;
  8.         TH1=0xF3;         //計數器初始值設置,注意波特率是4800
  9.         TL1=0xF3;
  10.           ET0 = 1;  //打開定時器0中斷
  11.           TR0 = 0;  //不啟動定時器0
  12.         TR1=1;          //打開定時器1
  13.         SM0=0;//設置串口工作方式
  14.         SM1=1;
  15.         REN=1;        //打開串口接收中斷
  16.         IP=0x10;
  17.         EA=1;          //打開總中斷
  18.         ES=1;//打開串口中斷
  19.         
  20. }
  21. void main()
  22. {        
  23.         zhongduan_Init();
  24.         while(1)
  25.         {
  26.         }
  27.         
  28. }
  29. void Timer0() interrupt 1                //中斷服務函數
  30. {
  31.     TH0 = 0x3C;        
  32.     TL0 = 0xB0;
  33.         Time++;
  34.         if(Time==20)
  35.         {
  36.                 Time=0;
  37.                 second++;        //一秒時間
  38.                 //if(second>=1)convert();        //心形移位
  39.         }
  40. }
  41. void Usart() interrupt 4
  42. {
  43.         Val=SBUF;
  44.          switch(Val)
  45.         {
  46.                 case 1:
  47.                         display(Val);//顯示
  48.                         break;
  49.         }
  50.         RI=0;
  51. }
  52. [\code]
  53. [code=c]
  54. void display(u8 DATa)//點陣顯示函數
  55. {        
  56.         u8 j;
  57.         P0=0x7f;
  58.         
  59.         switch(DATa)
  60.         {
  61.                 case 0:                                                //初始畫面
  62.                                 for(j=0;j<8;j++)
  63.                                 {
  64.                                         P0=bubian[j];
  65.                                         Senddata(ten[j]);
  66.                                         delay(10);
  67.                                         Senddata(0x00);//消隱
  68.                                 }
  69.                                 break;
  70.                 case 1:        
  71.                                 show_1();
  72.                                 break;
  73.         }
  74. }
  75. void show_1(void)//倒計時顯示
  76. {
  77.         u8 j;
  78.         TR0=1;//開啟定時器
  79.         
  80.         while(second<10)//時間一到回到初始頁面
  81.         {
  82.                 for(j=0;j<8;j++)
  83.                 {
  84.                         P0=bubian[j];
  85.                         Senddata(count[second][j]);
  86.                         delay(5);
  87.                         Senddata(0x00);//消隱
  88.                 }
  89.         }               
  90. }
復制代碼


作者: HC6800-ES-V2.0    時間: 2020-3-30 08:35
顯示函數還是放在主函數里好。要顯示的內容通過變量傳遞標記即可。串口中斷服務函數只需要傳遞顯示標記。
作者: nimab    時間: 2020-3-30 13:54
HC6800-ES-V2.0 發表于 2020-3-30 08:35
顯示函數還是放在主函數里好。要顯示的內容通過變量傳遞標記即可。串口中斷服務函數只需要傳遞顯示標記。

好的,謝謝您,但是我現在顯示函數放在主循環里面,又有其他問題了。
我從機有幾個按鍵,按鍵一是開啟點陣倒計時,按鍵二是顯示幾個logo,我預想的效果是顯示完一個按鍵的東西后回到初始界面,可是這個串口老是發東西過來(已經沒按按鍵了),導致剛回到初始界面就又開始倒計時了,如此反復,請問怎么解決比較妥當
這是main函數:
void main()
{       
        u8 flag=0;
        zhongduan_Init();
        while(1)
        {
                if(flag==0)
                {
                        switch(Val)
                        {
                                case 1:show_1();flag=1;break;
                                case 2:show_2();flag=1;break;               
                                case 3:show_3();flag=1;break;       
                                case 4:show_4();flag=1;break;       
                                default:show_5();flag=1;break;        //初始畫面
                        }
                }
                if(flag==1)
                {
                        Val=0;
                        flag=0;
                }
        }
       
}
作者: HC6800-ES-V2.0    時間: 2020-3-31 08:38
nimab 發表于 2020-3-30 13:54
好的,謝謝您,但是我現在顯示函數放在主循環里面,又有其他問題了。
我從機有幾個按鍵,按鍵一是開啟點 ...

我猜是:你的按鍵程序中,沒有消抖啊,所以就會有由于抖動而產生的好幾個“按鍵”。機械按鍵,必須要消抖。
這不是你的完整程序,我只能猜了
作者: nimab    時間: 2020-4-1 09:25
HC6800-ES-V2.0 發表于 2020-3-31 08:38
我猜是:你的按鍵程序中,沒有消抖啊,所以就會有由于抖動而產生的好幾個“按鍵”。機械按鍵,必須要消抖 ...

你好,我是用Proteus仿真的,而且有消抖
作者: nimab    時間: 2020-4-1 09:29
HC6800-ES-V2.0 發表于 2020-3-31 08:38
我猜是:你的按鍵程序中,沒有消抖啊,所以就會有由于抖動而產生的好幾個“按鍵”。機械按鍵,必須要消抖 ...

能不能幫我調試一下,謝謝了

project_3.zip

157.11 KB, 下載次數: 8


作者: nimab    時間: 2020-4-1 17:48
HC6800-ES-V2.0 發表于 2020-3-31 08:38
我猜是:你的按鍵程序中,沒有消抖啊,所以就會有由于抖動而產生的好幾個“按鍵”。機械按鍵,必須要消抖 ...

我那個從機按鍵按下的時候,要等一會才有畫面,正常嗎




歡迎光臨 (http://www.zg4o1577.cn/bbs/) Powered by Discuz! X3.1
主站蜘蛛池模板: 精品综合久久久 | xxx视频| 欧美综合国产精品久久丁香 | 亚洲精品免费观看 | 精品视频一区二区三区 | а√中文在线8 | 日韩精品一区二区在线 | 成人在线免费电影 | 久久久精品久久久 | 久操亚洲| 国产成人高清成人av片在线看 | 国产福利资源在线 | 五月激情综合网 | 精品视频一区二区三区在线观看 | 国产无人区一区二区三区 | 中文字幕成人在线 | 国产视频精品区 | 天天操网 | 国产探花在线精品一区二区 | 91精品久久久久久久久中文字幕 | 免费在线观看h片 | 国产亚韩 | 亚洲一视频 | 免费观看www| 成人午夜看片 | 免费 视频 1级 | 国产人成精品一区二区三 | 久久久蜜臀国产一区二区 | 亚洲一区视频在线 | 成人免费区一区二区三区 | 一区二区三区在线 | 国产不卡视频在线 | 久久九九影视 | 欧洲一区二区三区 | 亚洲性视频网站 | 国产黄色大片在线观看 | 日日操日日干 | 黄在线免费观看 | 一级做受毛片免费大片 | 亚洲福利在线观看 | 国产精品中文在线 |