欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2559|回復: 6
收起左側

51單片機通過串口實現雙機通信的問題

[復制鏈接]
ID:650067 發表于 2020-3-29 22:17 | 顯示全部樓層 |閱讀模式
我用主機的點陣弄了個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. }
復制代碼

回復

使用道具 舉報

ID:164602 發表于 2020-3-30 08:35 | 顯示全部樓層
顯示函數還是放在主函數里好。要顯示的內容通過變量傳遞標記即可。串口中斷服務函數只需要傳遞顯示標記。
回復

使用道具 舉報

ID:650067 發表于 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;
                }
        }
       
}
回復

使用道具 舉報

ID:164602 發表于 2020-3-31 08:38 | 顯示全部樓層
nimab 發表于 2020-3-30 13:54
好的,謝謝您,但是我現在顯示函數放在主循環里面,又有其他問題了。
我從機有幾個按鍵,按鍵一是開啟點 ...

我猜是:你的按鍵程序中,沒有消抖啊,所以就會有由于抖動而產生的好幾個“按鍵”。機械按鍵,必須要消抖。
這不是你的完整程序,我只能猜了
回復

使用道具 舉報

ID:650067 發表于 2020-4-1 09:25 | 顯示全部樓層
HC6800-ES-V2.0 發表于 2020-3-31 08:38
我猜是:你的按鍵程序中,沒有消抖啊,所以就會有由于抖動而產生的好幾個“按鍵”。機械按鍵,必須要消抖 ...

你好,我是用Proteus仿真的,而且有消抖
回復

使用道具 舉報

ID:650067 發表于 2020-4-1 09:29 | 顯示全部樓層
HC6800-ES-V2.0 發表于 2020-3-31 08:38
我猜是:你的按鍵程序中,沒有消抖啊,所以就會有由于抖動而產生的好幾個“按鍵”。機械按鍵,必須要消抖 ...

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

project_3.zip

157.11 KB, 下載次數: 8

回復

使用道具 舉報

ID:650067 發表于 2020-4-1 17:48 | 顯示全部樓層
HC6800-ES-V2.0 發表于 2020-3-31 08:38
我猜是:你的按鍵程序中,沒有消抖啊,所以就會有由于抖動而產生的好幾個“按鍵”。機械按鍵,必須要消抖 ...

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

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表