找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2136|回复: 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 单片机教程网

快速回复 返回顶部 返回列表