找回密码
 立即注册

QQ登录

只需一步,快速开始

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

51单片机红外遥控12864显示源程序分享

[复制链接]
跳转到指定楼层
楼主
ID:277948 发表于 2018-1-24 08:24 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
51单片机红外遥控12864显示
单片机源程序如下:
  1. #include<reg52.h>            //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义
  2. #define uchar unsigned char
  3. #define uint  unsigned int
  4. sbit RS=P3^5;                                //命令/数据选择
  5. sbit RW=P3^6;                                               //读写口
  6. sbit  E=P3^4;                                            //锁存控制
  7. sbit PSB=P3^1;                                         //串并选择
  8. sbit IR=P3^2;                          //红外接口标志
  9. bit irpro_ok,irok;
  10. uchar code st0[]={"****遥控车***"};
  11. uchar code st1[]={"暂停"};
  12. uchar code st2[]={"床前明月光李疑是地上霜白举头望明月唐低头思故乡"};
  13. uchar code st3[]={"去年今日此门中,人面桃花相映红,人面不知何处去,桃花依旧笑春风。"};
  14.                  
  15. uchar  irtime;        //红外用全局变量
  16. uchar IRcord[4];
  17. uchar irdata[33];
  18. uchar x;
  19. void Ir_work(void);
  20. void Ircordpro(void);
  21. void delay(uint t)
  22. {
  23.    uchar j;
  24.         for(;t>0;t--)
  25.                    for(j=120;j>0;j--);
  26. }
  27. /*******************************************************12864**************************************/
  28. void write_com(uchar cmdcode)
  29. {
  30.    RS=0;                   //命令/数据选择,为0时选择命令
  31.    RW=0;                   //读/写选择,为0时选择写
  32.    E=1;                    //使能
  33.    P0=cmdcode;             //送入命令
  34.    delay(50);              //等待写入
  35.    E=0;                    //关闭读写
  36.    delay(40);
  37. }
  38. void write_date(uchar date)
  39. {
  40.    RS=1;                   //命令/数据选择,为1时选择数据
  41.    RW=0;                   //读/写选择,为0时选择写
  42.    E=1;                    //使能
  43.    P0=date;                            //送入数据
  44.    delay(10);              //等待写入
  45.    E=0;                    //关闭读写
  46. }
  47. void init()        //初始化
  48. {
  49.          PSB=1;
  50.         delay(5);
  51.   write_com(0x30);
  52.           delay(10);
  53.   write_com(0x0c);
  54.           delay(5);
  55.   write_com(0x01);
  56.           delay(5);
  57.   write_com(0x06);
  58. }
  59. /****************************************************显示****************************************/
  60. void di() //  显示
  61. {
  62.         uchar num,l;
  63.         write_date(0x00);
  64.         write_com(0x01);
  65.         switch(x)
  66.         {
  67.                 case 0x18: num=1;break;
  68.                 case 0x52: num=2;break;
  69.                 case 0x08: num=3;break;
  70.                 case 0x5a: num=0;break;
  71.                 case 0x1c: num=4;break;
  72.                 case 0x42: num=5;break;
  73.                 case 0x4A: num=6;break;

  74.         }
  75.         if(num==0)
  76.         {
  77.                 write_com(0x8e);
  78.                 write_date(0x1a);
  79.                 P1=0XF6;
  80.         }
  81.         else if(num==1)
  82.         {
  83.                 write_com(0x83);
  84.                 write_date(0x18);
  85.                 P1=0XFE;
  86.         }
  87.         else if(num==2)
  88.         {
  89.                 write_com(0x9b);
  90.                 write_date(0x19);
  91.                 P1=0XFD;
  92.         }
  93.         else if(num==3)
  94.         {
  95.                 write_com(0x89);
  96.                 write_date(0x1b);
  97.                 P1=0XFB;
  98.         }
  99.         else if(num==4)
  100.         {
  101.                 write_com(0x8a);
  102.                         while(st1[l]!='\0')
  103.                         {
  104.                                 write_date(st1[l]);
  105.                                 l++;
  106.                                 delay(100);
  107.                         }
  108.         }

  109. }
  110. void tim0_isr (void) interrupt 1 using 1
  111. {
  112.   irtime++;  //用于计数2个下降沿之间的时间
  113. }

  114. void EX0_ISR (void) interrupt 0 //外部中断0服务函数
  115. {
  116.         static unsigned char  i;             //接收红外信号处理
  117.         static bit startflag;                //是否开始处理标志位

  118.         if(startflag)                        
  119.         {
  120.                 if(irtime<63&&irtime>=33)//引导码 TC9012的头码,9ms+4.5ms
  121.             i=0;
  122.                     irdata[i]=irtime;//存储每个电平的持续时间,用于以后判断是0还是1
  123.                     irtime=0;
  124.                     i++;
  125.                            if(i==33)
  126.                       {
  127.                                   irok=1;
  128.                                 i=0;
  129.                           }
  130.         }
  131.         else
  132.         {
  133.                 irtime=0;
  134.                 startflag=1;
  135.         }
  136. }

  137. void TIM0init(void)//定时器0初始化
  138. {
  139.         TMOD=0x02;//定时器0工作方式2,TH0是重装值,TL0是初值
  140.         TH0=0x00; //重载值
  141.         TL0=0x00; //初始化值
  142.         ET0=1;    //开中断
  143.         TR0=1;   
  144. }
  145. void EX0init(void)
  146. {
  147. IT0 = 1;   //指定外部中断0下降沿触发,INT0 (P3.2)
  148. EX0 = 1;   //使能外部中断
  149. EA = 1;    //开总中断
  150. }
  151. void Ir_work(void)//红外键值散转程序
  152. {
  153.         x=IRcord[2];
  154.         di();
  155.         irpro_ok=0;//处理完成标志
  156. }
  157. void Ircordpro(void)//红外码值处理函数
  158. {
  159.         unsigned char i, j, k,cord,value;
  160.         k=1;
  161.         for(i=0;i<4;i++)      //处理4个字节
  162.         {
  163.                 for(j=1;j<=8;j++) //处理1个字节8位
  164.                 {
  165.                         cord=irdata[k];
  166.                         if(cord>7)//大于某值为1,这个和晶振有绝对关系,这里使用12M计算,此值可以有一定误差
  167.                         value=value|0x80;
  168.                         if(j<8)
  169.                         {
  170.                                 value>>=1;
  171.                         }
  172.                         k++;
  173.                 }
  174.                 IRcord[i]=value;
  175.                 value=0;     
  176.         }
  177.         irpro_ok=1;//处理完毕标志位置1
  178. }

  179. void main(void)
  180. {
  181.     uint z;
  182.         init();
  183. ……………………

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

所有资料51hei提供下载:
红外遥控车.rar (31.32 KB, 下载次数: 42)


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

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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