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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2238|回復: 9
收起左側

單片機串口通信程序求助

[復制鏈接]
ID:1002906 發表于 2022-2-19 16:27 | 顯示全部樓層 |閱讀模式
本帖最后由 AnRan_ 于 2022-2-19 21:16 編輯

       剛學定時器和串口,項目要求是 按下key1之后led燈亮5s后熄滅(定時器定時),然后串口接收到6的時候led燈全部亮,然后按下key2之后讓前面亮起來的led燈熄滅,并且向串口發送 “Hello World!”。  這三部分每一部分單獨拿出來當作一個小程序都沒有問題,但是這三部分合起來寫成一個程序就出現問題了。             我寫的這個程序運行之后,第一部分按下key1之后led燈亮五秒鐘熄滅沒任何問題; 第二部分串口接收到6的時候led燈也可以全亮,但是亮一段時間之后就會自動熄滅,按照要求應該是不讓他熄滅的;第三部分是按下key2之后第二部分亮起來的led燈可以正常熄滅,但是不會向串口發送“Hello World!”。
       請幫我看一下是哪里有問題。
單片機源程序如下:
  1. #include <reg52.h>
  2. #include <intrins.h>
  3. #include <stdio.h>

  4. sbit key1=P3^0;
  5. sbit key2=P3^1;

  6. void delay(unsigned char z)//zms延時
  7. {
  8.         unsigned char i, j;
  9.         while(z>0)
  10.         {
  11.                 _nop_();
  12.                 i = 2;
  13.                 j = 199;
  14.                 do
  15.                 {
  16.                         while (--j);
  17.                 } while (--i);
  18.                 z--;
  19.         }
  20. }

  21. void timer0Init()  //50ms
  22. {
  23.         TR0=1;
  24.         TMOD|=0X01;
  25.         TH0=(65535-46082)/256;
  26.         TL0=(65535-46082)%256;
  27. }
  28. void UARTInit()
  29. {
  30.         EA=1;
  31.         ES=1;
  32.         REN=1;
  33.         SM0=0; SM1=1;
  34.         TR1=1;//打開定時器1
  35.         TMOD|=0X20;
  36.         TH1=0XFD;
  37.         TL1=0XFD;
  38. }
  39. void main()
  40. {                 
  41.         unsigned char msec;        

  42.         while(1)
  43.         {        
  44.                 UARTInit();        
  45.                 if(key1==0)
  46.                 {        
  47.                         delay(20); //消抖
  48.                         if(key1==0)
  49.                                 while(!key1) ;//松手檢測
  50.                         P1=0x00;
  51.                         timer0Init();
  52.                 }        
  53.                 if(TF0==1)
  54.                 {
  55.                         TF0=0;
  56.                         msec++;
  57.                         TH0=(65535-46082)/256;
  58.                         TL0=(65535-46082)%256;
  59.                         if(msec==100)
  60.                         {
  61.                                 P1=0XFF;
  62.                                 TR0=0;
  63.                         }                        
  64.                 }                        
  65.                 if(key2==0)
  66.                 {        
  67.                         delay(20);
  68.                         if(key2==0)
  69.                                 while(!key2) ;
  70.                         P1=0xff;
  71.                         TI=1;
  72.                         printf("Hello World!\n");
  73.                         while(!TI) ;
  74.                         TI=0;
  75.                 }                                
  76.         }
  77. }
  78. void UART() interrupt 4
  79. {
  80.         unsigned char temp;
  81.         if(RI)
  82.         {
  83.                 RI=0;
  84.                 temp=SBUF;
  85.                 if(temp==6)
  86.                         P1=0x00;
  87.         }
  88.         if(TI)
  89.                 TI=0;
  90. }


復制代碼




回復

使用道具 舉報

ID:1003077 發表于 2022-2-19 19:51 | 顯示全部樓層
按你描述的要求看程序,delay()沒有用到,所以是多余的,timer0Init()也沒有用用到,而在主程序里有TR0=1,所以定時不準。建議定時器用中斷。
回復

使用道具 舉報

ID:1002906 發表于 2022-2-19 20:46 | 顯示全部樓層
Hjc12345678 發表于 2022-2-19 19:51
按你描述的要求看程序,delay()沒有用到,所以是多余的,timer0Init()也沒有用用到,而在主程序里有TR0=1, ...

這個定時是準的,就是5s,不過第二部分串口接收到6應該讓led燈一直亮著的,但是這個亮一會兒他會熄滅,并不是定時不準
回復

使用道具 舉報

ID:161164 發表于 2022-2-19 22:56 | 顯示全部樓層
真機實測
串口傳6沒有樓主說的自動關燈現像
KEY2如樓主所說不能傳回Hello world
但按代碼分析
分開寫也沒可能傳回Hello world
回復

使用道具 舉報

ID:1002906 發表于 2022-2-19 23:07 | 顯示全部樓層
lkc8210 發表于 2022-2-19 22:56
真機實測
串口傳6沒有樓主說的自動關燈現像
KEY2如樓主所說不能傳回Hello world

但是我這個單片機確實是會自動關燈..我等用我師兄的試試。key2向串口發送 hello world 的那一部分能改一下讓它能發送么?
回復

使用道具 舉報

ID:625730 發表于 2022-2-19 23:10 | 顯示全部樓層
AnRan_ 發表于 2022-2-19 20:46
這個定時是準的,就是5s,不過第二部分串口接收到6應該讓led燈一直亮著的,但是這個亮一會兒他會熄滅,并 ...

串口接收到的6是是字符,對應的ascii碼值是0x36;如果你要判斷應該用temp=='6';或者temp==0x36。
回復

使用道具 舉報

ID:213173 發表于 2022-2-20 09:05 | 顯示全部樓層
  1. #include <reg52.h>
  2. #include <intrins.h>
  3. #include <stdio.h>

  4. sbit key1=P3^0;
  5. sbit key2=P3^1;

  6. void delay(unsigned char z)//zms延時
  7. {
  8.         unsigned char i, j;
  9.         while(z--)
  10.         {
  11.                 _nop_();
  12.                 i = 2;
  13.                 j = 199;
  14.                 do
  15.                 {
  16.                         while (--j);
  17.                 } while (--i);
  18.         }
  19. }

  20. void timer0Init()  //50ms
  21. {
  22.         TMOD|=0X01;
  23.         TH0=(65535-46082)/256;
  24.         TL0=(65535-46082)%256;
  25.         TF0=0;
  26.         TR0=0;
  27. }

  28. void UARTInit()
  29. {
  30.         EA=1;
  31.         ES=1;
  32.         REN=1;
  33.         SM0=0; SM1=1;
  34.         TR1=1;//打開定時器1
  35.         TMOD|=0X20;
  36.         TH1=0XFD;
  37.         TL1=0XFD;
  38. }

  39. void Send_byte(unsigned char dat)
  40. {
  41.         SBUF = dat;
  42.         while(!TI);
  43.         TI = 0;
  44. }

  45. void Send_string(unsigned char *p)
  46. {
  47.         while(*p)
  48.         {
  49.                 Send_byte(*p++);
  50.         }
  51. }

  52. void main()
  53. {                 
  54.         unsigned char msec;        
  55.         delay(10);
  56.         timer0Init();
  57.         UARTInit();
  58.         while(1)
  59.         {               
  60.                 if(TF0==1)
  61.                 {
  62.                         TF0=0;
  63.                         TH0=(65535-46082)/256;
  64.                         TL0=(65535-46082)%256;
  65.                         msec++;
  66.                         if(msec==100)
  67.                         {
  68.                                 msec=0;
  69.                                 P1=0XFF;
  70.                                 TR0=0;
  71.                         }
  72.                 }   
  73.                 if(key1==0)
  74.                 {        
  75.                         delay(20); //消抖
  76.                         if(key1==0)
  77.                         {
  78.                                 P1=0x00;
  79.                                 TR0=1;
  80.                                 while(!key1);//松手檢測
  81.                         }
  82.                 }                             
  83.                 if(key2==0)
  84.                 {
  85.                         delay(20);
  86.                         if(key2==0)
  87.                         {
  88.                                 P1=0xff;
  89.                                 TR0=0;
  90.                                 TF0=0;
  91.                                 Send_string("Hello World!\n");
  92.                                 while(!key2);
  93.                         }
  94.                 }                                
  95.         }
  96. }

  97. void UART() interrupt 4
  98. {
  99.         if(RI)
  100.         {
  101.                 RI=0;
  102.                 if(SBUF==6)
  103.                         P1=0x00;
  104.         }
  105. }
復制代碼
回復

使用道具 舉報

ID:1002906 發表于 2022-2-21 10:07 | 顯示全部樓層

我剛試了,按下key2還是不能發送Hello World
回復

使用道具 舉報

ID:1006035 發表于 2022-2-21 15:07 | 顯示全部樓層
P3.0 P3.1不是串口嗎?你用它做了按鍵?
回復

使用道具 舉報

ID:161164 發表于 2022-2-21 16:21 | 顯示全部樓層
liuzz2k 發表于 2022-2-21 15:07
P3.0 P3.1不是串口嗎?你用它做了按鍵?

原來如此
大意了
難怪仿真時沒問題
我按仿真習慣把他改了
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 亚洲最新在线 | 久久久精品视频一区二区三区 | 伊人久久国产 | 成人一区av | 另类一区 | 国产成人精品久久久 | 99re在线视频 | 黄色在线观看网站 | 亚洲激精日韩激精欧美精品 | 91香蕉嫩草 | 久久婷婷色| 性色av一区二区三区 | 久久国产精品网站 | 欧美日韩黄色一级片 | 综合色播| 日韩91| 国产精品资源在线 | 亚洲精品美女视频 | 成人免费视频网 | 免费欧美| 久久99久久99久久 | 日韩在线一区二区 | 国产综合久久 | 91久操网 | 日本一区二区三区在线观看 | 日韩在线免费 | 三级成人在线 | 色网站在线 | 国产乱码一二三区精品 | 青青草视频网 | 精品福利视频一区二区三区 | 国产欧美精品一区二区 | 欧美一区二区三区在线看 | 国产成人a亚洲精品 | 国产精品毛片一区二区三区 | 久久久精品影院 | 国产精品视频一区二区三区四蜜臂 | 婷婷色综合| 欧美日韩免费在线 | 天天天天天天天干 | 一区二区三区免费 |