找回密码
 立即注册

QQ登录

只需一步,快速开始

帖子
查看: 4278|回复: 8
打印 上一主题 下一主题
收起左侧

51单片机8X8键盘,红外线收发,串口收发,1602显示按键源程序+仿真图

[复制链接]
跳转到指定楼层
楼主
3个89C52
8x8键盘
U3单片机检测8X8键盘,对按键红外线编码发出。
U2单片机接收,U3单片机发出的红外信号,解码后由串口发出。
U1接收U2单片机发出的串口数据。



单片机源程序如下:
  1. #include <STC89C5xRC.h>
  2. #define uchar unsigned char
  3. #define uint unsigned int
  4. bit overflag, datafinish;                //开始接收数据,数据处理完毕
  5. bit Updata = 0;
  6. uchar times;                                                                 //定时器T0溢出次数
  7. uchar orders[33];                                                //接收输入的代码序列(times组成的33字节级数)
  8. uchar IRCODE[4];                                                //地址码,地址反码,数据码,数据反码

  9. void initial()                                                        //初始化
  10. {

  11.         SCON=0X50;                        //设置为工作方式1
  12.         TMOD=0X21;                        //设置计数器工作方式2
  13.         PCON=0X80;                        //波特率加倍
  14.         TH0=0xfe;                                                                        //晶振频率为12MHz
  15.         TL0=0x0c;                                                                        //T0定时间隔为0.5ms
  16.         TH1=0XF3;                                //计数器初始值设置,注意波特率是4800的
  17.         TL1=0XF3;
  18.         TR1=1;                                        //打开计数器
  19.         IT0=1;                                                                                //外部中断INT1下降沿触发
  20.         EX0=1;                                                                                //允许外部中断INT1
  21.         ET0=1;                                                                                //允许定时器T0中断
  22.         TR0=1;                                                                                //启动定时器T0
  23.         EA=1;                                                                                        //打开总中断
  24. }

  25. /*******************************************************************************
  26. * 函数名         :UsartInit()
  27. * 函数功能                   :设置串口
  28. * 输入           : 无
  29. * 输出                  : 无
  30. *******************************************************************************/
  31. void UsartInit()
  32. {
  33.         SCON=0X50;                        //设置为工作方式1
  34.         TMOD=0X20;                        //设置计数器工作方式2
  35.         PCON=0X80;                        //波特率加倍
  36.         TH1=0XF3;                                //计数器初始值设置,注意波特率是4800的
  37.         TL1=0XF3;
  38.         TR1=1;                                        //打开计数器
  39. }
  40. void time0() interrupt 1    //T0中断,每0.5ms计数一次
  41. {
  42.         TH0=0xfe;                                                                        //重新载入定时参数
  43.         TL0=0x0c;
  44.         times++;                                                                        //计算每位的宽度
  45. }

  46. void infrared()interrupt 0                //外部中断,接收一个数据位
  47. {                                                                                                                //每接收到一个下降沿,中断发生一次
  48.         static bit startflag;                        //定义“开始接收”标志
  49.         static uchar i;
  50.         if(startflag)                                                        //开始接收标志
  51.         {
  52.                 if(times<32 && times>=16)
  53.                         i=0;                                                                        //记下引导码长度(正常为9ms)
  54.                 orders[i]=times;                                //记录一个数据位的长度
  55.                 times=0;                                                                //下次中断发生重新计数
  56.                 i++;                                                                                //数组指针指向下个存储单元
  57.                 if(i==33)                                                                //如果记满了32字节数据和引导码
  58.                 {
  59.                         overflag=1;                                                //建立“已记满”标志
  60.                         i=0;                                                                        //数组指针指向开头
  61.                 }
  62.         }
  63.         else                                                                                        //如果尚未开始接收数据
  64.         {
  65.                 startflag=1;                                                //建立“开始接收”标志
  66.                 times=0;
  67.         }
  68. }

  69. void process()                                                                //把接收33字节序列信息转换成地址和数据代码
  70. {
  71.         uchar i,j,k=1;                                                //指向33字节数组,跳过引导段计数
  72.         for(i=0;i<4;i++)                                        //处理四组数据
  73.         {
  74.                 for(j=1;j<=8;j++)                                //处理一组数据8字节
  75.                 {
  76.                         IRCODE[i]>>=1;                                //先假定当前位为“0”
  77.                         if(orders[k]>3)
  78.                                 IRCODE[i]|=0x80;                //大于1.5ms为“1”
  79.                         k++;
  80.                 }
  81.         }
  82.         datafinish=1;
  83. }

  84. void main()
  85. {
  86.         uchar i;
  87.         initial();                                                        //初始化
  88.         while(1)                                                                //等待中断发生
  89.         {
  90.                 if(Updata ==1)
  91.                 {
  92.                         Updata = 0;
  93.                         for(i=0;i<4;i++)
  94.                         {
  95.                                 SBUF=IRCODE[i];     //将接收到的数据放入到发送寄存器
  96.                                 while(!TI);                         //等待发送数据完成
  97.                                 TI=0;                                                 //清除发送完成标志位
  98.                         }
  99.                 }
  100.                 if(overflag)                                        //数据接收完毕
  101.                 {
  102.                         process();                                        //处理数据,完成标志datafinish
  103.                         overflag=0;
  104.                 }
  105.                 if(datafinish)
  106.                 {
  107.                         datafinish=0;
  108.                         Updata = 1;
  109.                 }
  110.                
  111.         }
  112. }
  113. ……………………

  114. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

所有资料51hei提供下载:
IrSend_UartSend_UartReceive.rar (150.92 KB, 下载次数: 64)



评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶1 踩
回复

举报

沙发
ID:516922 发表于 2019-4-20 09:48 | 只看该作者
谢谢分享
回复

举报

板凳
ID:516953 发表于 2019-4-20 10:21 | 只看该作者
谢谢分享
回复

举报

地板
ID:45306 发表于 2019-4-20 11:47 | 只看该作者

谢谢分享
回复

举报

5#
ID:417092 发表于 2019-4-26 11:45 | 只看该作者

不用谢
回复

举报

6#
ID:417092 发表于 2019-4-26 11:46 | 只看该作者

不用谢
回复

举报

7#
ID:333678 发表于 2019-4-27 05:52 | 只看该作者
谢谢分享。
回复

举报

8#
ID:561971 发表于 2019-8-25 10:52 | 只看该作者
谢谢分享
回复

举报

9#
ID:384562 发表于 2019-8-28 13:01 | 只看该作者
楼主能不能分享一下你的仿真
回复

举报

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

本版积分规则

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

Powered by 单片机教程网

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