找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 2180|回復(fù): 9
收起左側(cè)

單片機(jī)串口通信程序求助

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

       剛學(xué)定時(shí)器和串口,項(xiàng)目要求是 按下key1之后led燈亮5s后熄滅(定時(shí)器定時(shí)),然后串口接收到6的時(shí)候led燈全部亮,然后按下key2之后讓前面亮起來(lái)的led燈熄滅,并且向串口發(fā)送 “Hello World!”。  這三部分每一部分單獨(dú)拿出來(lái)當(dāng)作一個(gè)小程序都沒(méi)有問(wèn)題,但是這三部分合起來(lái)寫(xiě)成一個(gè)程序就出現(xiàn)問(wèn)題了。             我寫(xiě)的這個(gè)程序運(yùn)行之后,第一部分按下key1之后led燈亮五秒鐘熄滅沒(méi)任何問(wèn)題; 第二部分串口接收到6的時(shí)候led燈也可以全亮,但是亮一段時(shí)間之后就會(huì)自動(dòng)熄滅,按照要求應(yīng)該是不讓他熄滅的;第三部分是按下key2之后第二部分亮起來(lái)的led燈可以正常熄滅,但是不會(huì)向串口發(fā)送“Hello World!”。
       請(qǐng)幫我看一下是哪里有問(wèn)題。
單片機(jī)源程序如下:
  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延時(shí)
  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;//打開(kāi)定時(shí)器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) ;//松手檢測(cè)
  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. }


復(fù)制代碼




回復(fù)

使用道具 舉報(bào)

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

使用道具 舉報(bào)

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

這個(gè)定時(shí)是準(zhǔn)的,就是5s,不過(guò)第二部分串口接收到6應(yīng)該讓led燈一直亮著的,但是這個(gè)亮一會(huì)兒他會(huì)熄滅,并不是定時(shí)不準(zhǔn)
回復(fù)

使用道具 舉報(bào)

ID:161164 發(fā)表于 2022-2-19 22:56 | 顯示全部樓層
真機(jī)實(shí)測(cè)
串口傳6沒(méi)有樓主說(shuō)的自動(dòng)關(guān)燈現(xiàn)像
KEY2如樓主所說(shuō)不能傳回Hello world
但按代碼分析
分開(kāi)寫(xiě)也沒(méi)可能傳回Hello world
回復(fù)

使用道具 舉報(bào)

ID:1002906 發(fā)表于 2022-2-19 23:07 | 顯示全部樓層
lkc8210 發(fā)表于 2022-2-19 22:56
真機(jī)實(shí)測(cè)
串口傳6沒(méi)有樓主說(shuō)的自動(dòng)關(guān)燈現(xiàn)像
KEY2如樓主所說(shuō)不能傳回Hello world

但是我這個(gè)單片機(jī)確實(shí)是會(huì)自動(dòng)關(guān)燈..我等用我?guī)熜值脑囋嚒ey2向串口發(fā)送 hello world 的那一部分能改一下讓它能發(fā)送么?
回復(fù)

使用道具 舉報(bào)

ID:625730 發(fā)表于 2022-2-19 23:10 | 顯示全部樓層
AnRan_ 發(fā)表于 2022-2-19 20:46
這個(gè)定時(shí)是準(zhǔn)的,就是5s,不過(guò)第二部分串口接收到6應(yīng)該讓led燈一直亮著的,但是這個(gè)亮一會(huì)兒他會(huì)熄滅,并 ...

串口接收到的6是是字符,對(duì)應(yīng)的ascii碼值是0x36;如果你要判斷應(yīng)該用temp=='6';或者temp==0x36。
回復(fù)

使用道具 舉報(bào)

ID:213173 發(fā)表于 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延時(shí)
  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;//打開(kāi)定時(shí)器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);//松手檢測(cè)
  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. }
復(fù)制代碼
回復(fù)

使用道具 舉報(bào)

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

我剛試了,按下key2還是不能發(fā)送Hello World
回復(fù)

使用道具 舉報(bào)

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

使用道具 舉報(bào)

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

原來(lái)如此
大意了
難怪仿真時(shí)沒(méi)問(wèn)題
我按仿真習(xí)慣把他改了
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表