找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2117|回复: 0
打印 上一主题 下一主题
收起左侧

用单片机解码再用595驱动数码管显示出红外遥控接收来的解码数据

[复制链接]
跳转到指定楼层
楼主
自己写的程序,已经验证过有实物


单片机源程序如下:
  1. #include "SC92F732X_C.H"
  2. #define        uchar         unsigned        char
  3. #define        uint         unsigned    int
  4. #define        ul         unsigned    long

  5. ///////////////////////////引脚
  6. #define   mosout               P00                 //输出引脚
  7. #define   baiout               P11
  8. #define   lvout_510r               P17
  9. #define   huangout_510r               P27
  10. #define   hongout               P24

  11. #define   usbfout               P12



  12. #define   led               P26                               
  13. #define   on               P13
  14. #define   vin               P10

  15. #define   CLK               P02
  16. #define   DATA_1           P01
  17. #define   CKSHX               P05

  18. #define   hwpin               P16


  19. #define   vbatt              0x41
  20. #define   v1              0x40
  21. ////////////////////////////// 变量定义
  22. bit  ON_OFF,bi;
  23. bit irpro_ok,irok,jsok;
  24. uint  sleep_data;

  25. uchar bb,hs,h,ied;

  26. ul v1_add,v1_data;
  27. ul vb_add,vb_data;



  28. uchar  irtime,irdet;


  29. uchar kehuh,kehul,keyma,keyfanma;

  30. uchar keydata,jsokadd;
  31. ///////////////////////////////////
  32. unsigned char IRcord[4];
  33. unsigned char irdata[33];
  34. /////////////////////////////////
  35. unsigned char const code shuma[] =
  36. {0xfc,0x60,0xda,0xf2,0x66,0xb6,0xbe,0xe0,0xfe,0xf6};// 0--9 //
  37. //////////////////////////////////////////////////// 上电初始化程序
  38. void mcu_init(void)
  39. {
  40. /* 初始化I/O口 */
  41.         P0CON =0xff;          // 0为输入,1为输出
  42.         P0PH=0;                  //        1有效
  43.         P0 =0;

  44.         P1CON = 0x86;
  45.         P1PH=0x48;
  46.         P1 = 0x49;

  47.         P2CON = 0xf0;
  48.         P2PH=0;
  49.         P2 = 0;
  50. /*初始化AD*/
  51.         ADCCFG1 = 0;                                        // AIN8通道开关 //
  52.         ADCCFG0 = 0x3;                               
  53.         ADCCON = 0;
  54. /////////////////打开外部中断
  55.     EA=1;
  56.     EINT0=0;
  57.         IPINT0=0;

  58.         INT0F=0;
  59.         INT0R=0;


  60.         EINT1=1;
  61.         INT1F=0x4;        //INT12
  62.         INT1R=0;

  63.         IP1=0x8;
  64. /////////////////打开定时器
  65.     ET0=1;           //**** T0使能
  66.     TMCON=0;   //*****频率来自FSYS/12(系统时钟) 12M
  67.     TMOD=0x1A; //****8位自动重装定时器,溢出时将TH0的值自动装入TL0
  68.     TR0=1;           //*****定时器1的开始计数

  69.     TL0=0;
  70.         TH0=156;        //256-120
  71. //////////////////////AD参考电压2.4
  72.     OPINX=0xC2;
  73.     OPREG=0X80;
  74. ////////////////// 初始化变量
  75.                                                                                                                
  76. }
  77. //////////////////////////////////////////////////////////////////       
  78. void waibu12_int(void) interrupt 2
  79. {

  80.          irdet=irtime;
  81.          irtime=0;

  82.     if((irdet<140)&&(irdet>=130))//引导码 TC9012的头码,9ms+4.5ms
  83.        {
  84.                    ied=0;
  85.                    jsok=1;
  86.            }


  87.            if(irdet>160)//引导码大于16MS
  88.        {
  89.               irdet=0;
  90.                    ied=0;
  91.                    jsok=0;
  92.            }

  93.            if(jsok)
  94.            {
  95.             irdata[ied]=irdet;//存储每个电平的持续时间,用于以后判断是0还是1
  96.             ied++;
  97.              if(ied>=33)
  98.                 {
  99.                  irok=1;
  100.                  ied=0;
  101.                                  jsok=0;
  102.                 }
  103.                 }

  104. }
  105. ////////////////////////////////////////////////定时中断
  106. void time_int(void) interrupt 1
  107. {

  108.   irtime++;  //用于计数2个下降沿之间的时间
  109.   /*if(irtime>250)
  110.   {
  111.    irtime=0;
  112.   }         */
  113. //************************************
  114. }
  115. /////////////////////////////////////////////////////////////
  116. unsigned int ad_conver(uchar ad_pin)
  117. {
  118.         uint ad_res_data,ad_h,ad_l;
  119.         uchar as;
  120.     ADCCON=0x80;
  121.         ad_h=0;ad_l=0;
  122.         ADCCON|=ad_pin;                  //ADCS=1; 00001000  on ad
  123.         while(!(ADCCON&0x10)){as=0;}
  124.         ad_l=ADCVL;       
  125.         ad_h=ADCVH;
  126.         ad_h<<=4;
  127.         ad_l>>=4;
  128.         ad_res_data=ad_h|ad_l;
  129.         ADCCON=0;
  130.         return(ad_res_data);         
  131. }
  132. ///////////////////////////////////
  133. void dalay_1(uint yanshi)
  134. {          
  135.     uint sb;
  136.    for(sb=0;sb<yanshi;sb++){}
  137. }
  138. ////////////////////////////////////////////////
  139. /////////////////////////////////////////////IO口组合
  140. void in_74ls595(uchar p)
  141. {       
  142.       uchar id;
  143.           for(id=0;id<8;id++)
  144.      {        
  145.              if(p&0x80){DATA_1=1;}
  146.              else{DATA_1=0;}
  147.                  CLK=0;
  148.                  CLK=1;
  149.                  p<<=1;
  150.           }       
  151. }
  152. //////////////////////////////////////////
  153. void  led_display(uint display_data )
  154. {       
  155.    uchar qian,bai,shi,ge;
  156.    qian=display_data/1000;
  157.    bai=(display_data%1000)/100;
  158.    shi=(display_data%100)/10;
  159.    ge=display_data%10;

  160. //************************************************扫描

  161.           if(qian==0){in_74ls595(0);}
  162.           else{in_74ls595(shuma[qian]);}
  163.           in_74ls595(0x10);
  164.           CKSHX=1;
  165.           dalay_1(5);
  166.           CKSHX=0;
  167.           dalay_1(100);
  168.           in_74ls595(0);
  169.           in_74ls595(0);
  170.           CKSHX=1;
  171.           dalay_1(3);
  172.           CKSHX=0;
  173.           dalay_1(3);


  174.           if((qian==0)&&(bai==0)){in_74ls595(0);}
  175.           else{in_74ls595(shuma[bai]);}
  176.           in_74ls595(0x20);
  177.           CKSHX=1;
  178.           dalay_1(5);
  179.           CKSHX=0;
  180.           dalay_1(100);
  181.           in_74ls595(0);
  182.           in_74ls595(0);
  183.           CKSHX=1;
  184.           dalay_1(3);
  185.           CKSHX=0;
  186.           dalay_1(3);


  187.           if((qian==0)&&(bai==0)&&(shi==0)){in_74ls595(0);}
  188.           else{in_74ls595(shuma[shi]);}
  189.           in_74ls595(0x40);
  190.           CKSHX=1;
  191.           dalay_1(5);
  192.           CKSHX=0;
  193.           dalay_1(100);
  194.           in_74ls595(0);
  195.           in_74ls595(0);
  196.           CKSHX=1;
  197.           dalay_1(3);
  198.           CKSHX=0;
  199.           dalay_1(3);




  200.           in_74ls595(shuma[ge]);
  201.           in_74ls595(0x80);
  202.           CKSHX=1;
  203.           dalay_1(5);
  204.           CKSHX=0;
  205.           dalay_1(100);
  206.           in_74ls595(0);
  207.           in_74ls595(0);
  208.           CKSHX=1;
  209.           dalay_1(3);
  210.           CKSHX=0;
  211.           dalay_1(3);

  212. }
  213. //////////////////////////////////////////
  214. void  ledoff_display()
  215. {       
  216. //************************************************扫描

  217.           in_74ls595(0);
  218.           in_74ls595(0);
  219.           CKSHX=1;
  220.           dalay_1(3);
  221.           CKSHX=0;
  222.           dalay_1(400);


  223. }
  224. ///////////////////////////////////////////////
  225. void key_in()
  226. {

  227. //*********************************************开关键

  228.         if(!on)
  229.         {         
  230.               bb++;
  231.          if((bb>100)&&bi&&(!on))
  232.           {
  233.           bb=0;
  234.           ON_OFF=!ON_OFF;
  235.           bi=0;
  236.           }       
  237.      }
  238.           else
  239.           {
  240.                           bi=1;
  241.                         bb=0;
  242.           }
  243. //********************************************遥控功能键

















  244. }
  245. /////////////////////////////////////////////////////////
  246. void vbat_in()
  247. {
  248.                    h++;  
  249.         vb_add+=ad_conver(vbatt);
  250.             if(h>=200)
  251.             {
  252.              h=0;
  253.              vb_data=vb_add/200;
  254.              vb_add=0;                         
  255.             }
  256. }
  257. /////////////////////////////////////////////////////////////
  258. void v1_in()
  259. {       
  260.                          hs++;  
  261.         v1_add+=ad_conver(v1);
  262.             if(hs>=200)
  263.             {
  264.             hs=0;
  265.             v1_data=v1_add/200;
  266.             v1_add=0;
  267.             }

  268. }
  269. ////////////////////////////////////////// //红外码值处理
  270.                
  271. void Ircordpro(void)//红外码值处理函数
  272. {
  273.   uchar i, j, k,value;
  274.   uchar cord;

  275.   k=1;
  276.   for(i=0;i<4;i++)      //处理4个字节
  277.      {
  278.       for(j=1;j<=8;j++) //处理1个字节8位
  279.          {
  280.           cord=irdata[k];
  281.           if(cord>20)////////高电平2.25MS,低电平1.125MS
  282.                   {
  283.              value|=0x80;
  284.                   }
  285.           if(j<8)
  286.             {
  287.              value>>=1;
  288.             }
  289.            k++;
  290.          }
  291.      IRcord[i]=value;
  292.      value=0;     
  293.      }
  294.      irpro_ok=1;//处理完毕标志位置1
  295. }
  296. //////////////////////////////////////////////////////////////////////
  297. void Ir_work(void)
  298. {
  299.         kehuh=IRcord[0];
  300.         kehul=IRcord[1];
  301.         keyma=IRcord[2];
  302.         keyfanma=IRcord[3];

  303.         if(keyma||keyfanma==255)
  304.         {
  305.          keydata=keyma;
  306.         }
  307. }
  308. //////////////////////////////////////////////////////////////////////////////////////////////////////
  309. void main(void)
  310. {
  311.       mcu_init();
  312.          while(1)
  313.          {
  314.            v1_in();
  315.            vbat_in();
  316.            key_in();

  317. //************************
  318.           if(irok)         //如果接收好了进行红外处理
  319.          {  
  320.               irok=0;
  321.           Ircordpro();
  322.          }

  323.          if(irpro_ok)         //如果处理好后进行工作处理,如按对应的按键后显示对应的数字等
  324.           {
  325.               irpro_ok=0;
  326.           Ir_work();
  327.           }




  328.          if(jsok)
  329.          {
  330.           jsokadd++;
  331.           if(jsokadd>250)
  332.           {
  333.            jsokadd=0;
  334.            jsok=0;
  335.           }
  336.          }
  337.          else
  338.          {
  339.           jsokadd=0;
  340.          }
  341. //*********************
  342.            if(ON_OFF)
  343.            {
  344.               if(irok)         //如果接收好了进行红外处理
  345.          {  
  346.               irok=0;
  347.           Ircordpro();
  348.          }

  349.          if(irpro_ok)         //如果处理好后进行工作处理,如按对应的按键后显示对应的数字等
  350.           {
  351.               irpro_ok=0;
  352.           Ir_work();
  353.           }
  354.             led_display(keydata);
  355.             led=irok;
  356.            }
  357.            else
  358.            {
  359.                 ledoff_display();
  360.             keydata=0;
  361.                 led=0;
  362.            }
  363.      }  
  364. }
复制代码

所有程序51hei提供下载:
四位74hc595.rar (2.58 KB, 下载次数: 19)


评分

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

查看全部评分

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

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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