找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机红外遥控可调时钟程序源代码

[复制链接]
跳转到指定楼层
楼主
数码管显示部分的原理图(开发板中只需要截图显示部分即可):http://www.51hei.com/f/51hei-5.pdf

电路:红外接收头接在 单片机的外部中断0口。数码管用8位共阴极数码管,2个573锁存 详见上面的51hei单片机开发板的pdf图,本人测试成了.

程序源代码:


  1. #include<reg52.h>
  2. #define uchar unsigned char
  3. #define uint  unsigned int
  4. sbit wela=P2^7;
  5. sbit dula=P2^6;
  6. uchar smg_du[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
  7. uchar smg_we[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
  8. uchar miao,fen,shi,flag_set,key_can;
  9. uchar startflag,bitnum,irtime;
  10. uchar irreceok,irprosok,flag_s;
  11. bit flag_500ms;
  12. uchar dis_smg[6];
  13. uchar irdata[33];
  14. uchar ircode[4];
  15. uchar bdata bdat;
  16. sbit dat0=bdat^0;
  17. sbit dat1=bdat^1;
  18. sbit dat2=bdat^2;
  19. sbit dat3=bdat^3;
  20. sbit dat4=bdat^4;
  21. sbit dat5=bdat^5;
  22. sbit dat6=bdat^6;
  23. sbit dat7=bdat^7;
  24. void smg_s(uchar dat)     //用于闪烁
  25. {
  26. bdat=dat;
  27. if(dat0==1)
  28.     dis_smg[0]=0x00;
  29. if(dat1==1)
  30.     dis_smg[1]=0x00;
  31. if(dat2==1)
  32.     dis_smg[2]=0x00;
  33. if(dat3==1)
  34.     dis_smg[3]=0x00;
  35. if(dat4==1)
  36.     dis_smg[4]=0x00;
  37. if(dat5==1)
  38.     dis_smg[5]=0x00;
  39. if(dat6==1)
  40.     dis_smg[6]=0x00;
  41. if(dat7==1)
  42.     dis_smg[7]=0x00;
  43. }      
  44.       
  45. void dis_init()        //显示初始化
  46. {
  47. dis_smg[0]=smg_du[miao%10];
  48. dis_smg[1]=smg_du[miao/10];
  49. dis_smg[2]=smg_du[fen%10]|0x80;
  50. dis_smg[3]=smg_du[fen/10];
  51. dis_smg[4]=smg_du[shi%10]|0x80;
  52. dis_smg[5]=smg_du[shi/10];
  53. }
  54. void display()
  55. {
  56. static uchar i;
  57. P0=0x00;
  58. dula=1;
  59. dula=0;
  60. P0=smg_we[5-i];
  61. wela=1;
  62. wela=0;
  63. P0=dis_smg[i];
  64. dula=1;
  65. dula=0;
  66. i++;
  67. if(i==6)
  68. i=0;
  69. }
  70. void timer0_init()        //定时器0方式1,用于时钟定时
  71. {

  72. TH0=0;
  73. TL0=0;
  74. ET0=1;
  75. TR0=1;
  76. }   
  77.            //定时器1方式2,用于红外时间加数
  78. void timer1_init()
  79. {
  80. TMOD=0X20|0x01;       //选择定时器0和定时器1
  81. TH1=0;
  82. TL1=0;
  83. ET1=1;
  84. TR1=1;
  85. EA=1;
  86. }
  87.               //外部中断0,用于确定红外数据
  88. void int0_init()
  89. {              //下降沿触发
  90. IT0=1;
  91. EX0=1;
  92. EA=1;
  93. }
  94. void irpros()     //红外数据处理函数
  95. {
  96. uchar k=1,value;
  97. uchar i,j;
  98. for(j=0;j<4;j++)
  99. {
  100.   for(i=0;i<8;i++)
  101.   {
  102.    value=value>>1;   //低位在前,高位在后
  103.    if(irdata[k]>6)     //比较数据,确定数据为1还是为0
  104.    {
  105.     value=value|0x80; //数据为一
  106.    }
  107.    k++;
  108.   }
  109.   ircode[j]=value;
  110. }
  111. irprosok=1;
  112. }
  113. void keyinit()     //按键初始化
  114. {
  115. switch(ircode[3])
  116. {
  117.   case 0xfe:key_can=1;break;   //选择键
  118.   case 0xfd:key_can=2;break;   //加键
  119.   case 0xff:key_can=3;break;   //减键
  120. }
  121. ircode[3]=0;     //红外数据最后一位
  122. }
  123. void clock_can()    //时间调整
  124. {
  125. if(key_can==1)
  126. {
  127.      key_can=0;
  128.   flag_set++;
  129.   if(flag_set>=4)
  130.   {
  131.    flag_set=0;
  132.    flag_s=0x00;
  133.   }
  134.   if(flag_set==1)
  135.      flag_s=0x30;
  136.   if(flag_set==2)
  137.      flag_s=0x0c;
  138.   if(flag_set==3)
  139.      flag_s=0x03;
  140. }
  141. if(key_can==2)
  142. {
  143.   key_can=0;
  144.   if(flag_set==1)
  145.   {
  146.    shi++;
  147.    if(shi>=24)
  148.    shi=0;
  149.   }
  150.   if(flag_set==2)
  151.   {
  152.    fen++;
  153.    if(fen>=60)
  154.    fen=0;
  155.   }
  156.   if(flag_set==3)
  157.   {
  158.    miao++;
  159.    if(miao>=60)
  160.    miao=0;
  161.   }
  162. }
  163. if(key_can==3)
  164. {
  165.   key_can=0;
  166.   if(flag_set==1)
  167.   {
  168.    if(shi==0)
  169.     shi=24;
  170.     shi--;
  171.   }
  172.   if(flag_set==2)
  173.   {
  174.    if(fen==0)
  175.     fen=60;
  176.     fen--;
  177.   }
  178.   if(flag_set==3)
  179.   {
  180.    if(miao==0)
  181.     miao=60;
  182.     miao--;
  183.   }
  184. }
  185. }   
  186. void main()
  187. {
  188. timer0_init();  
  189. timer1_init();
  190. int0_init();
  191. dis_init();
  192. while(1)
  193. {
  194.      if(flag_500ms)
  195.    dis_init();
  196.   else
  197.    smg_s(flag_s);
  198.   if(irreceok)
  199.   {
  200.    irpros();
  201.    irreceok=0;
  202.   }
  203.   if(irprosok)
  204.   {
  205.    irprosok=0;
  206.    dis_init();
  207.   }
  208.   keyinit();
  209.   clock_can();
  210.   display();
  211. }
  212. }
  213. void timer0() interrupt 1
  214. {
  215. static uchar i,j;
  216.   TH0=0x3c;
  217.   TL0=0xb0;
  218.   j++;
  219.   if(j>=10)
  220.   {
  221.    j=0;
  222.   flag_500ms=~flag_500ms;
  223.   }
  224.   i++;
  225.   if(flag_set==0)
  226.   if(i>=20)
  227.   {
  228.    i=0;
  229.   miao++;
  230.   if(miao>=60)
  231.   {
  232.    miao=0;
  233.    fen++;
  234.    if(fen>=60)
  235.    {
  236.     fen=0;
  237.     shi++;
  238.     if(shi>=24)
  239.     {
  240.      shi=0;
  241.     }
  242.    }
  243.   }
  244.   }
  245. }      
  246. void timer1() interrupt 3
  247. {
  248. irtime++;
  249. }
  250. void int0() interrupt 0
  251. {
  252. if(startflag)
  253. {
  254.   if(irtime>32)
  255.   {
  256.    bitnum=0;
  257.   }
  258.   irdata[bitnum]=irtime;
  259.   irtime=0;
  260.   bitnum++;
  261.   if(bitnum==33)
  262.   {
  263.     bitnum=0;
  264.    irreceok=1;
  265.   }
  266. }
  267. else
  268. {
  269.   startflag=1;
  270.   irtime=0;
  271. }
  272. }
复制代码



评分

参与人数 1黑币 +5 收起 理由
luo22 + 5 很给力!

查看全部评分

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

举报

沙发
ID:194701 发表于 2017-5-1 16:55 | 只看该作者
能提供一下电路图吗?
回复

举报

板凳
ID:140489 发表于 2017-5-2 14:20 | 只看该作者
本帖最后由 lids 于 2017-5-2 14:24 编辑

用的什么遥控器,是不是图片这种遥控器,我把程序下载到单片机,6位数码管能显示走时,但是按遥控器没反应

QQ截图20170502142309.png (93.13 KB, 下载次数: 43)

QQ截图20170502142309.png
回复

举报

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

本版积分规则

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

Powered by 单片机教程网

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