找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1169|回复: 5
收起左侧

用单片机串口2去测试红外hx1838的按键值,但是为什么在电脑上不显示

[复制链接]
ID:923440 发表于 2021-8-23 21:18 | 显示全部楼层 |阅读模式
求大佬帮忙看看这个程序哪里出现了问题,主要是红外按键再数码管上不显示,所以想先再串口上调通。求解答
单片机源程序如下:
  1. #include <reg51.h>
  2. #include<intrins.h>

  3. #define uchar unsigned char
  4. #define uint  unsigned int


  5. #define FOSC 11059200UL
  6. #define BRT (65536 - FOSC / 9600 / 4)



  7. sfr INTCLkO = 0x8f;
  8. //#define EX2 0x10;


  9. sfr AUXR = 0x8e;
  10. sfr T2H = 0xd6;
  11. sfr T2L = 0xd7;
  12. sfr S2CON = 0x9a;
  13. sfr S2BUF = 0x9b;

  14. sfr IE2 = 0xaf;

  15. sfr P0M1 = 0x93;
  16. sfr P0M0 = 0x94;
  17. sfr P1M1 = 0x91;
  18. sfr P1M0 = 0x92;
  19. sfr P2M1 = 0x95;
  20. sfr P2M0 = 0x96;
  21. sfr P3M1 = 0xb1;
  22. sfr P3M0 = 0xb2;
  23. sfr P4M1 = 0xb3;
  24. sfr P4M0 = 0xb4;
  25. sfr P5M1 = 0xc9;
  26. sfr P5M0 = 0xca;



  27. bit busy;
  28. char wptr;
  29. char rptr;
  30. uint buffer[8];
  31. uint recv_flag=0;
  32. uint machine_step=0;
  33. uint recv_cnt=0;
  34. uint a,b,c;
  35. int s=0;
  36. uint temp;

  37. void Delay500ms();
  38. void delay_140us( void );
  39.                                                                                                                                        

  40. void Uart2Isr() interrupt 8
  41. {
  42. if (S2CON & 0x02)
  43. {
  44. S2CON &= ~0x02;
  45. busy = 0;
  46. }
  47. if (S2CON & 0x01)
  48. {
  49. S2CON &= ~0x01;
  50. buffer[wptr++] = S2BUF;
  51. wptr &= 0x0f;
  52. }
  53. }

  54. void Uart2Init()
  55. {
  56. S2CON = 0x10;
  57. T2L = BRT;
  58. T2H = BRT >> 8;
  59. AUXR = 0x14;
  60. wptr = 0x00;
  61. rptr = 0x00;
  62. busy = 0;
  63. }
  64. void Uart2Send(char dat)
  65. {
  66. while (busy);
  67. busy = 1;
  68. S2BUF = dat;
  69. }

  70. void Delay10us()                //@12.000MHz
  71. {
  72.         unsigned char i;

  73.         _nop_();
  74.         i = 2;
  75.         while (--i);
  76. }


  77. void Delay600us()                //@12.000MHz
  78. {
  79.         unsigned char i, j;

  80.         i = 2;
  81.         j = 39;
  82.         do
  83.         {
  84.                 while (--j);
  85.         } while (--i);
  86. }

  87. uchar jz;
  88. sbit IRIN =P3^6;//红外接收头
  89. uchar ircode[4];
  90. uchar ir_flag = 0;


  91. void ir_init(void)
  92.         {
  93.                
  94.                 IRIN = 1;//初始化红外接收头为1
  95.                
  96.                 INTCLkO = 0x10;//开启INT2为下降沿触发

  97.                 EA = 1;

  98.         }
  99.         
  100.         
  101.         


  102. void EX2_ISR() interrupt 10//红外中断函数
  103.         {
  104.                 unsigned char i;
  105.                 unsigned char j;
  106.                 unsigned int cnt;
  107.                 unsigned char temp = 0;
  108.                
  109.         if(IRIN == 0)
  110.         {
  111.         //判断9ms的高电平
  112.         cnt = 0;
  113.         while(IRIN == 0)
  114.         {
  115.                 cnt++;
  116.                 Delay10us();
  117.                 if(cnt > 1000)//超时判断
  118.                 return ;
  119.         }
  120.         
  121.         cnt = 0;
  122.         //4.5ms
  123.         while(IRIN)
  124.         {
  125.                 cnt++;
  126.                 Delay10us();
  127.                 if(cnt > 500)//超时等待
  128.                 return ;
  129.         }
  130.         //开始接受红外信号
  131.         for( i = 0; i<4; i++)
  132.         {

  133.                 for( j = 0; j<8;j++)
  134.                 {
  135.                         cnt = 0;
  136.                         while(IRIN == 0)//560us
  137.                         {
  138.                                 cnt++;
  139.                                 Delay10us();
  140.                                 if(cnt > 60)
  141.                                 return ;
  142.                         }
  143.                         
  144.                         Delay600us();//延时600us判断是高电平还是电平
  145.                         if(IRIN)
  146.                         {
  147.                                         temp |= 1<<j;//数据是从低位开始传输
  148.                                         cnt = 0;
  149.                                 while(IRIN)
  150.                                 {
  151.                                         cnt++;
  152.                                         Delay10us();
  153.                                         if(cnt > 110)
  154.                                         return ;
  155.                                 }
  156.                         }        

  157.                 }
  158.                         ircode[i] = temp;
  159.                         temp = 0;
  160.         }
  161.                 Delay600us();
  162.                 if(ircode[2] != ~ircode[3])//判断命令码是不是接受正确
  163.                         return;        
  164.                
  165.         }
  166. //            switch(        ircode[2])   
  167. //        {
  168. //            case 0x19:jz=0;break;
  169. //                                                case 0x45:jz=1;break;
  170. //                                                case 0x46:jz=2;break;
  171. //                                                case 0x47:jz=3;break;
  172. //                                                case 0x44:jz=4;break;
  173. //                                                case 0x40:jz=5;break;
  174. //                                                case 0x43:jz=6;break;
  175. //                                                case 0x07:jz=7;break;
  176. //                                                case 0x15:jz=8;break;
  177. //                                                case 0xD9:jz=9;break;
  178. //                                                default:break;
  179. //        }

  180.       Uart2Send(ircode[2]); //把命令码通过串口发送出去
  181.         }

  182.         

  183. void main()
  184. {
  185.         

  186.         P0M0 = 0x00;
  187. P0M1 = 0x00;
  188. P1M0 = 0x00;
  189. P1M1 = 0x00;
  190. P2M0 = 0x00;
  191. P2M1 = 0x00;
  192. P3M0 = 0x00;
  193. P3M1 = 0x00;
  194. P4M0 = 0x00;
  195. P4M1 = 0x00;
  196. P5M0 = 0x00;
  197. P5M1 = 0x00;

  198.   ir_init();
  199.         
  200.         
  201.         
  202.         
  203.         Uart2Init();
  204. IE2 = 0x01;
  205. EA = 1;

  206.         
  207.         
  208.     while(1)
  209.                 {
  210.                         
  211.                
  212. //                        if(XXX>10)
  213. //                        {
  214. //                                XXX = 0;
  215. //                                TM1637_writeCammand(0x44);
  216. //                TM1637_writeData(0xc1, SEGData[0]);
  217. //          TM1637_writeCammand(0x8a);
  218.                         
  219.                         
  220. //                        if (rptr != wptr)
  221. // {
  222. // Uart2Send(buffer[rptr++]);
  223. // rptr &= 0x0f;
  224. // }
  225.                         
  226.                         
  227.                         //        xs(jz);

  228.    }
  229.                
  230.         
  231.    }
复制代码


回复

使用道具 举报

ID:923440 发表于 2021-8-23 21:21 | 显示全部楼层
这个红外是用的nec协议的
回复

使用道具 举报

ID:752974 发表于 2021-8-24 08:17 | 显示全部楼层
用十六进制数显示看看,因为有很多ASCII是不可显示的。
回复

使用道具 举报

ID:923440 发表于 2021-8-24 09:25 | 显示全部楼层
munuc_w 发表于 2021-8-24 08:17
用十六进制数显示看看,因为有很多ASCII是不可显示的。

你好,怎么把接收的数据用16进制表示
回复

使用道具 举报

ID:161164 发表于 2021-8-24 14:41 | 显示全部楼层
51c_yang 发表于 2021-8-24 09:25
你好,怎么把接收的数据用16进制表示

你用什么串口软件?
回复

使用道具 举报

ID:923440 发表于 2021-8-24 20:35 | 显示全部楼层
lkc8210 发表于 2021-8-24 14:41
你用什么串口软件?

STC-ISP呀
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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