找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1557|回复: 2
收起左侧

简单8数码管显示红外编码 单片机程序

[复制链接]
ID:55129 发表于 2019-4-13 02:31 | 显示全部楼层 |阅读模式
无需复杂的电路,使用8个数码管既可显示出红外遥控的编码,电路简单,代码少,适合新手玩,不知道论坛有没有人发过,新人新帖

单片机源程序如下:
  1. /***************************************************************************
  2. 标题:        红外遥控解码器数码管显示   使用12mhz晶振
  3. 管脚:P33红外接收数据,P0口数码管数据口,P10数码管千位,P11数码管百位,P12数码管十位,P13数码管个位
  4. 效果:        运行程序,按遥控器按键,在数码管上显示相应的地址码-控制码(以16进制显示)
  5.                         分两段,前段是地址码,后段为控制码,用点隔开,显示两字节,忽略反码,使用共阴数码管

  6. ******************************************************************************/

  7. #include <reg51.h>

  8. sbit SMG_0 = P1^0;        //定义数码管(千万位)
  9. sbit SMG_1 = P1^1;        //定义数码管(百万位)
  10. sbit SMG_2 = P1^2;        //定义数码管(十万位)
  11. sbit SMG_3 = P1^3;        //定义数码管(万位)
  12. sbit SMG_4 = P1^4;        //定义数码管(千位)
  13. sbit SMG_5 = P1^5;        //定义数码管(百位)
  14. sbit SMG_6 = P1^6;        //定义数码管(十位)
  15. sbit SMG_7 = P1^7;        //定义数码管(个位)

  16. /********数据定义*************************************************************/
  17. sbit hwx=P3^3;                  //红外接收数据引脚,
  18. code unsigned char table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};        //数码管段值表 0-9 a-f
  19. unsigned char ly_disdate[8]={0,0,0,0,0,0,0,0};        //显示缓冲
  20. unsigned char ly_lhj[4];        //保存NEC的四个字节数据
  21. unsigned char ly_ct=0;    //计数时间
  22. bit ly_flag=1;                  //成功接收标志

  23. //函数声明:
  24. void display();//定义显示函数,直接显示缓冲区数值
  25. void delay(void);
  26. void delay100us(void);

  27. /***********外中断1入口函数,P33引脚,红外线接收IC数据脚**************************/
  28. void hongwai(void) interrupt 2
  29.         {
  30.                 unsigned char i,ia;
  31. /**************开始判断是否为NEC波形引导码的前9MS和后4.5MS******************************/
  32.                 ly_ct=0;              //计数时间清0

  33.                 while(!hwx)     //hwx红外管脚

  34.                 delay100us();         //调用0.1MS延时计数,ly_ct每调用一次加1

  35.                 if(ly_ct<80||ly_ct>100)            //NEC引导码前9MS,ly_ct约等于90,给个误差值,用80-100之间来判断

  36.                 return;

  37.                 ly_ct=0;              //计数时间请0

  38.                 while(hwx)

  39.                 {
  40.                         delay100us();

  41.                         if(ly_ct>50)        //NEC引导码引导码的后4.5MS,ly_ct约45

  42.                         return;

  43.                 }
  44.                
  45.                 if(ly_ct<40)        //NEC引导码引导码的后4。5MS,ly_ct约45

  46.                 return;

  47. /***********开始接收四个字节内容**************************************/

  48.                 for(i=0;i<4;i++)
  49.                 {
  50.                        
  51.                         for(ia=0;ia<8;ia++)
  52.                         {

  53.                                 while(!hwx);        //低电平开始,不处理只等待高电平接收

  54.                                 ly_ct=0;

  55.                                 while(hwx)   //高电平开始,
  56.                                         {       
  57.                                                
  58.                                                 delay100us();

  59.                                                 if(ly_ct>20)

  60.                                                 return;

  61.                                         }

  62. //高电平结束,判断数据1或0向变量移入

  63.                                                 ly_lhj[i]>>=1;        //数据由高位移入低位

  64.                                                 if(ly_ct>10)        //时间量TH1高于10,即高于1MS判断为1

  65.                                                 ly_lhj[i]|=0x80;

  66.                                 }

  67.                 }

  68.                 ly_flag=1;        //接收成功

  69.                 TF1=0;

  70. }

  71. //显示函数,参数为显示内容,只显示两位数

  72.         void display()
  73.         {

  74.                 SMG_0=0;        //选择千万位数码管

  75.                 P0=table[ly_disdate[0]];        //

  76.                 delay();        //

  77.                 P0=0XFF;        //

  78.                 SMG_0=1;        //

  79.                 SMG_1=0;        //选择百万位数码管SMG_b

  80.                 P0=table[ly_disdate[1]]|0x80;        //加上小数点

  81.                 delay();        //延时

  82.                 P0=0XFF;        //

  83.                 SMG_1=1;        //

  84.                 SMG_2=0;        //选择十位数码管

  85.                 P0=table[ly_disdate[2]];        //

  86.                 delay();        //

  87.                 P0=0XFF;        //

  88.                 SMG_2=1;        //

  89.                 SMG_3=0;        //选择个位数码管

  90.                 P0=table[ly_disdate[3]]|0x80;        //加上小数点;        //

  91.                 delay();        //

  92.                 P0=0XFF;        //

  93.                 SMG_3=1;        //
  94.                
  95.                 SMG_4=0;        //选择千万位数码管

  96.                 P0=table[ly_disdate[4]];        //

  97.                 delay();        //

  98.                 P0=0XFF;        //

  99.                 SMG_4=1;        //

  100.                 SMG_5=0;        //选择百万位数码管SMG_b

  101.                 P0=table[ly_disdate[5]]|0x80;        //加上小数点

  102.                 delay();        //延时

  103.                 P0=0XFF;        //

  104.                 SMG_5=1;        //

  105.                 SMG_6=0;        //选择十位数码管

  106.                 P0=table[ly_disdate[6]];        //

  107.                 delay();        //

  108.                 P0=0XFF;        //

  109.                 SMG_6=1;        //

  110.                 SMG_7=0;        //选择个位数码管

  111.                 P0=table[ly_disdate[7]];        //加上小数点

  112.                 delay();        //

  113.                 P0=0XFF;        //

  114.                 SMG_7=1;        //

  115.         }

  116. //延时子函数,短暂延时

  117. void delay(void)
  118.         {

  119.                 unsigned char i=10;

  120.                 while(i--);

  121.         }

  122. void delay100us(void)
  123.         {
  124.                 unsigned char i=15;
  125.                 while(i--);
  126.                 ly_ct++;
  127.         }

  128. void main(void)
  129.         {
  130.                 EA=1;        //首先开启总中断
  131.                 EX1=1; //开启外部中断1,红外接收数据引脚
  132.                 IT1=1; //设置成下降沿触发方式
  133.                 while(1)
  134.                         {
  135.                                 if(ly_flag)
  136.                                         {                 //接收成功处理显示缓冲,以16进制显示
  137.                                                 ly_flag=0;
  138.                                                 ly_disdate[0]=ly_lhj[0]/16;
  139.                                                 ly_disdate[1]=ly_lhj[0]%16;
  140.                                                 ly_disdate[2]=ly_lhj[1]/16;
  141.                                                 ly_disdate[3]=ly_lhj[1]%16;
  142.                                                 ly_disdate[4]=ly_lhj[2]/16;
  143.                                                 ly_disdate[5]=ly_lhj[2]%16;
  144.                                                 ly_disdate[6]=ly_lhj[3]/16;
  145.                                                 ly_disdate[7]=ly_lhj[3]%16;
  146.                                         }
  147.                                         display();//显示缓冲内容

  148.                         }

  149.         }
复制代码

所有资料51hei提供下载:
红外遥控解码8数码管显示.zip (36.27 KB, 下载次数: 30)
回复

使用道具 举报

ID:1 发表于 2019-4-13 03:13 | 显示全部楼层
本帖需要重新编辑补全电路原理图,源码,详细说明与图片即可获得100+黑币(帖子下方有编辑按钮)
回复

使用道具 举报

ID:254123 发表于 2019-4-13 09:55 | 显示全部楼层
大佬,牛逼了
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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