找回密码
 立即注册

QQ登录

只需一步,快速开始

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

红外遥控报警器制作(原理图+PCB图+程序+说明文档)

  [复制链接]
跳转到指定楼层
楼主
分享一个红外遥控报警器含有原理图+PCB图+程序+说明文档
                                                    作品解说文档
这次比赛制作的红外控制温度报警器制作历时半个月,是一个用AT89S52做的以液晶12864为显示平台,包含红外远程控制,温度测量,时间显示,闹铃提醒和图片浏览等功能的简易红外控制温度传感器,
1)  红外数据接收部分:用HS38B作为红外接收器,接收头接收到数据后送入单片机处理。
2)温度采集部分:执行温度采集的芯片是温度传感器DS18B20,其精度是可达到0.1℃。
3)时间显示部分:利用单片机AT89S52内置的定时器进行时间更新。
这个制作的最大的特色是多层菜单设计和通过电脑上位机给串口发送数据代替遥控送数,单片机上电开机后会出现一个开机图片,之后进入基本页面,基本界面上包括年月日,星期,时分秒和现在温度。 按按键代码为0x1e的按键后,进入主菜单,主菜单上会有四个选项,分别是温度上下限设置,显示时间设置,闹铃时间设置和图片浏览。按相应按键进入下一级设置子菜单,再按相应按键进行相应处理。
由于电路连接错误,PCB板上的点阵部分无法用上。作品介绍大概就是这些。

附加:
按键代码:
0x01 :  进入主菜单                            0x01 :返回基本界面
0x02 :进入温度上下限编辑界面               0x03 :进入显示时间编辑界面
0x06 :进入闹铃时间修改界面                 0x07 :进入图片浏览界面
0x0b :进入温度上限或闹铃时编辑状态              0x1a :进入温度下限或闹铃分编辑状态
0x19 :在显示时间设置时按此键可调整编辑对象
0x10 :使需要修改的数据按一次加1             0x11:使需要修改的数据按一次减1

ad格式的原理图:

ad格式的pcb文件:


单片机源程序(部分内容预览):
  1. #include<reg52.h>
  2. #include<intrins.h>
  3. #define uchar unsigned char
  4. #define uint unsigned int
  5. /********************************位定义区**********************************************************/
  6. sbit DQ=P1^0;
  7. sbit en=P1^2;
  8. sbit rw=P1^3;
  9. sbit rs=P1^4;
  10. sbit dat=P3^2;

  11. sbit LED_second=P1^1;                                                                //跳秒指示;满一秒时亮
  12. sbit hongwai_key=P3^7;                                                                //红外按键指示;有键按下时亮
  13. sbit fenmingqi=P3^3;                                                                //蜂鸣器控制;蜂鸣器鸣叫控制脚
  14. /*********************************各变量定义区*********************************************************/
  15. uchar jump=1,count_time=0,k=0,count_LED=0;
  16. uchar get_data[4],key,hui_sign=0;
  17. uchar Toptemp=30,Downtemp=0;
  18. uchar sec=50,min=59,hour=23,date=1,month=1,weekday=3;
  19. uint year=2009;
  20. uchar a,b,c,d;
  21. uchar nao_shi=6,nao_fen=0,naoling_sign=0,count_nao=0,count_keep_nao=0;
  22. uchar jump_sign=0;
  23. uchar *kaiji;
  24. /**********************************基本显示页面显示内容******************************************************/
  25. unsigned char dis1[16]={"2009年06月20日"};
  26. unsigned char dis2[6]={"星期三"};
  27. unsigned char dis3[14]={"17: 54: 00  PM"};
  28. unsigned char dis4[16]={"现在温度:  . ℃"};
  29. /***********************************主菜单显示内容*******************************************************/
  30. unsigned char code menu1[16]={"1.温度上下限值"};
  31. unsigned char code menu2[16]={"2.时间日期调整"};
  32. unsigned char code menu3[16]={"3.闹铃时间调整"};
  33. unsigned char code menu4[16]={"4.图片播放浏览"};
  34. /**********************************各设置时子菜单显示内容***************************************************/
  35. unsigned char idata wendu1[12]={"1.上限:  ℃"};
  36. unsigned char idata wendu2[12]={"2.下限:  ℃"};
  37. unsigned char code character[10]={'0','1','2','3','4','5','6','7','8','9'};
  38. unsigned char code weekdate[15]={" 一二三四五六天"};
  39. unsigned char idata naoling[16]={"闹铃时间:00:00"};
  40. /*********************************图片显示代码区************************************************************/
  41. uchar code pic1[]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,                                //图片1显示代码
  42.                               0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  43.                               0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  44.                               0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  45.                               0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  46.                               0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  47.                               0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  48.                               0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  49.                               0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  50.                               0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  51.                               0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  52.                               0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

  53. …………余下代码请下载附件…………

  54.                               0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,
  55.                               0x7F,0xFF,0xFF,0xC0,0x00,0x3F,0xFF,0xFF,
  56.                               0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,
  57.                               0x7F,0xFF,0xFF,0xE3,0x03,0xFF,0xFF,0xFF,
  58.                               0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,
  59.                               0x7F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
  60.                               0xFF,0xFF,0xFF,0xE0,0x00,0x00,0x00,0x00};                        
  61. /*****************************************延时程序*************************************************/
  62. void delay(uchar n)                                                         //6微妙延时子程序
  63. {
  64.         while(n--)
  65.         {;}
  66. }
  67. void delay1(uint n1)                                                        //开机图片现显示时间
  68. {
  69.         uchar i,j,k;
  70.         for(i=0;i<200;i++)
  71.         {
  72.                 for(j=0;j<200;j++)
  73.                 {
  74.                         for(k=0;k<n1;k++)
  75.                         {}
  76.                 }
  77.         }
  78. }

  79. /**************************************开机图片显示及基本页面显示******************************************/
  80. void dis_data()                                                        //开机初始化显示                                
  81. {
  82.         dis1[0]=character[year/1000];
  83.         dis1[1]=character[(year%1000)/100];
  84.         dis1[2]=character[(year%100)/10];
  85.         dis1[3]=character[year%10];
  86.         dis1[6]=character[month/10];
  87.         dis1[7]=character[month%10];
  88.         dis1[10]=character[date/10];
  89.         dis1[11]=character[date%10];
  90.         dis2[4]=weekdate[weekday];
  91.         dis2[5]=weekdate[weekday+1];
  92.         dis3[0]=character[hour/10];
  93.         dis3[1]=character[hour%10];
  94.         dis3[4]=character[min/10];
  95.         dis3[5]=character[min%10];
  96.         dis3[8]=character[sec/10];
  97.         dis3[9]=character[sec%10];
  98.         if(hour>11){dis3[12]='P';}
  99.         else dis3[12]='A';
  100. }
  101. void write_com_12864(uchar com)                        //单片机对12864写指令
  102. {
  103.         rs=0;
  104.         rw=0;
  105.         en=1;
  106.         delay(20);
  107.         P2=com;
  108.         delay(20);
  109.         en=0;
  110.         delay(20);
  111. }
  112. void write_data_12864(uchar date)                //单片机写数据到12864
  113. {
  114.         rs=1;
  115.         rw=0;
  116.         en=1;
  117.         delay(20);
  118.         P2=date;
  119.         delay(20);
  120.         en=0;        
  121.         delay(20);
  122. }

  123. void Init_12864()                                                //液晶初始化子程序
  124. {
  125.         delay(20);
  126.         write_com_12864(0x30);                                //基本指令操作
  127.         delay(20);
  128.         write_com_12864(0x0c);                                //开显示,游标关,游标位置反白不允许
  129.         delay(20);        
  130.         write_com_12864(0x01);                                //写入新数据后光标右移
  131.         delay(20);
  132.         write_com_12864(0x06);                                //显示清屏
  133.         delay(20);        
  134. }
  135. void yemian()
  136. {
  137.         uchar i;
  138.         write_com_12864(0x80);                                        //基本页面第一行显示
  139.         for(i=0;i<14;i++)                                                
  140.         {
  141.                 write_data_12864(dis1[i]);
  142.                 delay(100);
  143.         }
  144.         write_com_12864(0x92);                                        //基本页面第二行显示
  145.         for(i=0;i<6;i++)
  146.         {
  147.                 write_data_12864(dis2[i]);
  148.                 delay(100);
  149.         }
  150.         write_com_12864(0x89);                                        //基本页面第三行显示
  151.         for(i=0;i<14;i++)
  152.         {
  153.                 write_data_12864(dis3[i]);
  154.                 delay(100);
  155.         }
  156.         write_com_12864(0x98);                                        //基本页面第四行显示
  157.         for(i=0;i<16;i++)
  158.         {
  159.                 write_data_12864(dis4[i]);
  160.                 delay(100);
  161.         }
  162. }

  163. void tuchu(uchar x,uchar y)                                        //图片处理子程序
  164. {
  165.         write_com_12864(0x34);
  166.         delay(20);
  167.         write_com_12864(y);
  168.         delay(20);
  169.         write_com_12864(x);
  170.         delay(20);
  171.         write_com_12864(0x30);
  172. }
  173. void dis_pic(uchar code *pic)                                //图片显示入口程序
  174. {
  175.         int i,j;
  176.         uint b=0;
  177.         int x,y;
  178.         x=0x80;
  179.         y=0x80;
  180.         for(i=0;i<32;i++)
  181.         {
  182.                 tuchu(x,y);
  183.                 for(j=0;j<16;j++)
  184.                 {        
  185.                         write_data_12864(~pic[b]);
  186.                         b++;
  187.                         delay(20);
  188.                 }
  189.                 y++;
  190.         }
  191.         x=0x88;
  192.         y=0x80;
  193.         for(i=0;i<32;i++)
  194.         {
  195.                 tuchu(x,y);
  196.                 for(j=0;j<16;j++)
  197.                 {        
  198.                         write_data_12864(~pic[b]);
  199.                         b++;
  200.                         delay(20);
  201.                 }
  202.                 y++;
  203.         }
  204.         write_com_12864(0x36);
  205.         b=0;        
  206. }

  207. void yejinxianshi()
  208. {
  209.         kaiji=pic1;
  210.         Init_12864();                                                                //开机液晶初始化
  211.         delay(250);                                
  212.         dis_pic(kaiji);                                                                //开机图片显示
  213.         delay1(12);
  214.         Init_12864();                                                                //基本页面显示前初始化
  215.         delay(100);
  216.         dis_data();                                                                        //对显示内容初始化
  217.         delay(250);
  218.         yemian();                                                                        //基本页面显示
  219. }
  220. /********************************温度采集及显示程序*****************************************************/
  221. void data_done(uchar templ,uchar temph)                                //温度数据采集后的数据整理
  222. {
  223.         uint result,temp,t,t1;
  224.         t1=templ&0x0f;
  225.         templ=templ&0xf0;
  226.         templ=templ>>4;
  227.         temph=temph&0x07;
  228.         temph=temph<<4;
  229.         temp=templ+temph;
  230.         result=temp;
  231.         a=result/100;
  232.         t=result%100;
  233.         b=t/10;
  234.         c=result%10;
  235.         if(t1>9)
  236.         {
  237.                 c=c+1;
  238.                 d=t1-10;
  239.                 if(c>9)
  240.                 {
  241.                         c=c-10;
  242.                         b=b+1;
  243.                 }
  244.         }
  245.         if(temp>=Toptemp||temp<=Downtemp)
  246.         {
  247.                 fenmingqi=0;                                                //当检测到的温度大于上限温度或小于下限温度时蜂鸣器鸣叫        
  248.         }
  249.         else
  250.                 fenmingqi=1;                                                //否则关闭蜂鸣器
  251. }
  252. read_bit_DS18B20()                                                   //传感器DS18B20读比特位
  253. {
  254.         uchar i,temp;
  255.         for(i=0;i<8;i++)
  256.         {
  257.                 DQ=0;
  258.                 temp=temp>>=1;
  259.                 DQ=1;
  260.                 if(DQ==1){temp=temp+0x80;}
  261.                 delay(4);
  262.         }
  263.         return(temp);        
  264. }
  265. void write_bit_DS18B20(uchar com)                        //传感器DS18B20写比特位
  266. {
  267.         uchar i;
  268.         for(i=0;i<8;i++)
  269.         {
  270.                 DQ=0;
  271.                 DQ=(com&0x01);
  272.                 delay(5);
  273.                 DQ=1;
  274.                 com>>=1;
  275.         }
  276. }
  277. Init_DS18B20()                                                                   //DS18B20初始化子程序,判断传感器是否存在
  278. {
  279.         uchar Judge;
  280.         DQ=1;
  281.         delay(1);
  282.         DQ=0;
  283.         delay(65);
  284.         DQ=1;
  285.         delay(5);
  286.         Judge=DQ;
  287.         delay(15);
  288.         return(Judge);
  289. }
  290. void wendu_caiji()                                                                  //温度采集子程序入口
  291. {
  292.         uchar x,TEMP_L,TEMP_H;
  293.         x=Init_DS18B20();
  294.         if(x==0)
  295.         {
  296.                 write_bit_DS18B20(0xcc);
  297.                 write_bit_DS18B20(0x44);
  298.                 delay(250);
  299.                 x=Init_DS18B20();
  300.                 if(x==0)
  301.                 {
  302.                 write_bit_DS18B20(0xcc);
  303.                 write_bit_DS18B20(0xbe);
  304.                 TEMP_L=read_bit_DS18B20();
  305.                 TEMP_H=read_bit_DS18B20();
  306.                 data_done(TEMP_L,TEMP_H);
  307.                 }        
  308.         }
  309. }
  310. /**********************************************温度和时间更新子程序*******************************************/
  311. void update_wendu()                                                                        //温度更新显示子程序
  312. {
  313.         wendu_caiji();
  314.         dis4[10]=character[b];
  315.         dis4[11]=character[c];
  316.         dis4[13]=character[d];
  317.         write_com_12864(0x9d);
  318.         write_data_12864(dis4[10]);
  319.         write_data_12864(dis4[11]);
  320.         write_data_12864('.');
  321.         write_data_12864(dis4[13]);        
  322. }
  323. update_time()                                                                                        //时间更新显示子程序
  324. {
  325.         uchar a1,b1,c1,d1;
  326.         if(naoling_sign)
  327.         {
  328.                 fenmingqi=0;
  329.                 if(count_nao==20)
  330.                 {
  331.                         count_nao=0;
  332.                         fenmingqi=~fenmingqi;
  333.                         
  334.                 }
  335.         }
  336.         if(count_LED==8)
  337.         {
  338.                 count_LED=0;
  339.                 LED_second=~LED_second;
  340.         }
  341.         if(count_time==16)
  342.         {
  343.                 count_time=0;
  344.                 sec++;
  345.                 if((min==nao_fen)&&(hour==nao_shi))
  346.                 {
  347.                         count_keep_nao++;
  348.                         if(count_keep_nao==1)
  349.                         {
  350.                                 naoling_sign=1;
  351.                         }
  352.                         if(count_keep_nao==30)
  353.                         {
  354.                                 naoling_sign=0;
  355.                         }
  356.                         if(count_keep_nao>61)
  357.                         {
  358.                                 count_keep_nao=0;
  359.                                 naoling_sign=0;
  360.                         }
  361.                 }
  362.                 a1=sec/10;
  363.                 if(a1==6){a1=0;}
  364.                 dis3[8]=character[a1];
  365.                 dis3[9]=character[sec%10];
  366.                 write_com_12864(0x8d);
  367.                 write_data_12864(dis3[8]);
  368.                 write_data_12864(dis3[9]);
  369.                 if(sec==60)
  370.                 {
  371.                         sec=0;
  372.                         min++;
  373.                         d1=min/10;
  374.                         if(d1==6){d1=0;}
  375.                         dis3[4]=character[d1];
  376.                         dis3[5]=character[min%10];
  377.                         write_com_12864(0x8b);
  378.                         write_data_12864(dis3[4]);
  379.                         write_data_12864(dis3[5]);
  380.                         if(min==60)
  381.                         {
  382.                                 min=0;
  383.                                 hour++;
  384.                                 b1=hour/10;
  385.                                 c1=hour%10;
  386.                                 if(hour>11&&hour!=24)
  387.                                 {
  388.                                         dis3[12]='P';
  389.                                         write_com_12864(0x8f);
  390.                                         write_data_12864(dis3[12]);
  391.                                 }
  392.                                 else
  393.                                 {
  394.                                         dis3[12]='A';
  395.                                         write_com_12864(0x8f);
  396.                                         write_data_12864(dis3[12]);
  397.                                 }
  398.                                 if(b1==2&&c1==4){b1=0;c1=0;}
  399.                                 dis3[0]=character[b1];
  400.                                 dis3[1]=character[c1];
  401.                                 write_com_12864(0x89);
  402.                                 write_data_12864(dis3[0]);
  403.                                 write_data_12864(dis3[1]);
  404.                                 if(hour==24)
  405.                                 {
  406.                                         hour=0;
  407.                                         date++;
  408.                                         weekday=weekday+2;
  409.                                         if(weekday>15)weekday=1;
  410.                                         if(month==1||month==3||month==5||month==7||month==8||month==10||month==12)//考虑闰年时的时间计算
  411.                                         {
  412.                                                 if(date==31)
  413.                                                 {
  414.                                                         date=1;
  415.                                                         month++;
  416.                                                         if(month>12)
  417.                                                         {
  418.                                                                 month=1;
  419.                                                                 year++;
  420.                                                         }
  421.                                                         if(month>12)
  422.                                                         {
  423.                                                                 month=1;
  424.                                                                 year++;
  425.                                                         }
  426.                                                 }
  427.                                         }        
  428.                                         if(month==4||month==6||month==9||month==11)
  429.                                         {
  430.                                                 if(date==30)
  431.                                                 {
  432.                                                         date=1;        
  433.                                                         month++;
  434.                                                         if(month>12)
  435.                                                         {
  436.                                                                 month=1;
  437.                                                                 year++;
  438.                                                         }
  439.                                                 }
  440.                                         }        
  441.                                         if(month==2)
  442.                                         {
  443.                                                 if((year%4==0&&year%100!=0)||year%400==0)
  444.                                                 {
  445.                                                         if(date==29)
  446.                                                         {
  447.                                                                 date=1;
  448.                                                                 year++;
  449.                                                         }
  450.                                                 }
  451.                                                 else
  452.                                                 {
  453.                                                         if(date==28)
  454.                                                         {
  455.                                                                 date=1;
  456.                                                                 year++;
  457.                                                         }
  458.                                                 }
  459.                                         }
  460.                                 }
  461.                                 dis1[10]=character[date/10];
  462.                                 dis1[11]=character[date%10];
  463.                                 write_com_12864(0x85);
  464.                                 write_data_12864(dis1[10]);
  465.                                 write_data_12864(dis1[11]);

  466.                                 write_com_12864(0x94);
  467.                                 write_data_12864(weekdate[weekday]);
  468.                                 write_data_12864(weekdate[weekday+1]);        

  469.                                 dis1[6]=character[month/10];
  470.                                 dis1[7]=character[month%10];
  471.                                 write_com_12864(0x83);
  472.                                 write_data_12864(dis1[6]);
  473.                                 write_data_12864(dis1[7]);        

  474.                                 dis1[0]=character[year/1000];
  475.                                 dis1[1]=character[(year%1000)/100];
  476.                                 dis1[2]=character[(year%100)/10];
  477.                                 dis1[3]=character[year%10];        
  478.                                 write_com_12864(0x80);
  479.                                 write_data_12864(dis1[0]);
  480.                                 write_data_12864(dis1[1]);
  481.                                 write_data_12864(dis1[2]);
  482.                                 write_data_12864(dis1[3]);                                
  483.                         }        
  484.                 }
  485.         }               
  486. }
  487. /********************************菜单设置及功能****************************************************/
  488.                 /************************温度上下限设置***************************/
  489. void temp_limit()                                                        //温度上下限数值设置               
  490. {
  491.         uchar flag1=0,i=0;
  492.         wendu1[8]=character[Toptemp/10];
  493.         wendu1[9]=character[Toptemp%10];
  494.         wendu2[8]=character[Downtemp/10];
  495.         wendu2[9]=character[Downtemp%10];
  496.         Init_12864();
  497.         delay(200);
  498.         write_com_12864(0x80);
  499.         delay(200);
  500.         for(i=0;i<12;i++)
  501.         {
  502.                 write_data_12864(wendu1[i]);
  503.                 delay(100);
  504.         }
  505.         write_com_12864(0x90);
  506.         for(i=0;i<12;i++)
  507.         {
  508.                 write_data_12864(wendu2[i]);
  509.                 delay(100);
  510.         }
  511.         jump=1;
  512.         while(jump)
  513.         {
  514.                 k=1;
  515.                 if(key==0x0b||key==0x1a)
  516.                 {
  517.                         if(key==0x0b)                                                                //按0x0b键进入上限温度编辑
  518.                         {
  519.                                 flag1=0;
  520.                                 write_com_12864(0x84);
  521.                                 write_com_12864(0x0f);
  522.                         }
  523.                         else if(key==0x1a)                                                        //按0x1a键进入下限温度编辑
  524.                         {
  525.                                 flag1=1;
  526.                                 write_com_12864(0x94);
  527.                                 write_com_12864(0x0f);
  528.                         }
  529.                 }
  530.                 else if(key==0x10||key==0x11)                                        //按0x10键加数据,按0x11键减数据                        
  531.                 {                                                        
  532.                         if(key==0x10)
  533.                         {
  534.                                 if(flag1==0)
  535.                                 {        
  536.                                         Toptemp++;
  537.                                         write_com_12864(0x84);
  538.                                         write_com_12864(0x0f);
  539.                                 }
  540.                                 else if(flag1==1)
  541.                                 {
  542.                                         Downtemp++;
  543.                                         write_com_12864(0x94);
  544.                                         write_com_12864(0x0f);
  545.                                 }
  546.                         }
  547.                         else if(key==0x11)
  548.                         {
  549.                                 if(flag1==0)
  550.                                 {
  551.                                         Toptemp--;
  552.                                         write_com_12864(0x84);
  553.                                         write_com_12864(0x0f);
  554.                                 }
  555.                                 else if(flag1==1)
  556.                                 {
  557.                                         Downtemp--;
  558.                                         write_com_12864(0x94);
  559.                                         write_com_12864(0x0f);
  560.                                 }
  561.                         }
  562.                 }
  563.                 else if(key==0x01)                                                                //按0x01返回到主程序
  564.                 {
  565.                         jump_sign=1;
  566.                         write_com_12864(0x0c);
  567.                         write_com_12864(0x01);
  568.                         return;
  569.                 }
  570.                 if(flag1==0)
  571.                 {
  572.                 wendu1[8]=character[Toptemp/10];
  573.                 wendu1[9]=character[Toptemp%10];
  574.                 write_com_12864(0x84);
  575.                 write_data_12864(wendu1[8]);
  576.                 write_data_12864(wendu1[9]);
  577.                 write_com_12864(0x84);
  578.                 }
  579.                 if(flag1==1)
  580.                 {
  581.                 wendu2[8]=character[Downtemp/10];
  582.                 wendu2[9]=character[Downtemp%10];
  583.                 write_com_12864(0x94);
  584.                 write_data_12864(wendu2[8]);
  585.                 write_data_12864(wendu2[9]);
  586.                 write_com_12864(0x94);
  587.                 }
  588.                 while(k);
  589.         }
  590. }
  591. /**************************************************************************************************************/
  592.                                         /**************************时间日期设置****************************/
  593. void time_setting()        
  594. {
  595.         uchar flag=0;
  596.         write_com_12864(0x01);
  597.         delay(200);
  598.         dis_data();
  599.         yemian();                                                                //显示编辑界面
  600.         jump=1;
  601.         while(jump)
  602.         {
  603.                 k=1;
  604.                 if(key==0x19)                                                //按0x19键进行编辑位置选择
  605.                 {
  606.                         flag++;                                                        //利用flag作标志,选择合适的位置并进行数据修改
  607.                         if(flag==7)
  608.                         {flag=0;}
  609.                         else if(flag==1)
  610.                         {
  611.                                 write_com_12864(0x81);
  612.                                 write_com_12864(0x0f);
  613.                         }
  614.                         else if(flag==2)
  615.                         {
  616.                                 write_com_12864(0x83);
  617.                                 write_com_12864(0x0f);
  618.                         }
  619.                         else if(flag==3)
  620.                         {
  621.                                 write_com_12864(0x85);
  622.                                 write_com_12864(0x0f);
  623.                         }
  624.                         else if(flag==4)
  625.                         {
  626.                                 write_com_12864(0x94);
  627.                                 write_com_12864(0x0f);
  628.                         }        
  629.                         else if(flag==5)
  630.                         {
  631.                                 write_com_12864(0x89);
  632.                                 write_com_12864(0x0f);
  633.                         }        
  634.                         else if(flag==6)
  635.                         {
  636.                                 write_com_12864(0x8b);
  637.                                 write_com_12864(0x0f);
  638.                         }
  639.                 }
  640.                 else if(key==0x10||key==0x11)                                                //按0x10键进行数据加,按0x11键进行数据减
  641.                 {
  642.                         if(key==0x10)
  643.                         {
  644.                                 if(flag==1)
  645.                                 {
  646.                                         year++;
  647.                                         write_com_12864(0x81);
  648.                                         write_com_12864(0x0f);
  649.                                         dis1[0]=character[year/1000];
  650.                                         dis1[1]=character[(year%1000)/100];
  651.                                         dis1[2]=character[(year%100)/10];
  652.                                         dis1[3]=character[year%10];
  653.                                         write_com_12864(0x80);
  654.                                         write_data_12864(dis1[0]);
  655.                                         write_data_12864(dis1[1]);
  656.                                         write_data_12864(dis1[2]);
  657.                                         write_data_12864(dis1[3]);
  658.                                         write_com_12864(0x81);        
  659.                                 }
  660.                                 else if(flag==2)
  661.                                 {
  662.                                         month++;
  663.                                         if(month==13)month=0;
  664.                                         write_com_12864(0x83);
  665.                                         write_com_12864(0x0f);        
  666.                                         dis1[6]=character[month/10];        
  667.                                         dis1[7]=character[month%10];        
  668.                                         write_com_12864(0x83);
  669.                                         write_data_12864(dis1[6]);
  670.                                         write_data_12864(dis1[7]);
  671.                                         write_com_12864(0x83);
  672.                                 }
  673.                                 else if(flag==3)
  674.                                 {
  675.                                         date++;
  676.                                         if(date==32)date=0;
  677.                                         write_com_12864(0x85);
  678.                                         write_com_12864(0x0f);
  679.                                         dis1[10]=character[date/10];        
  680.                                         dis1[11]=character[date%10];        
  681.                                         write_com_12864(0x85);
  682.                                         write_data_12864(dis1[10]);
  683.                                         write_data_12864(dis1[11]);
  684.                                         write_com_12864(0x85);
  685.                                 }
  686.                                 else if(flag==4)
  687.                                 {
  688.                                         weekday=weekday+2;
  689.                                         if(weekday==16)weekday=1;
  690.                                         write_com_12864(0x94);
  691.                                         write_com_12864(0x0f);
  692.                                         dis2[4]=character[weekday];        
  693.                                         dis2[5]=character[weekday+1];        
  694.                                         write_com_12864(0x94);
  695.                                         write_data_12864(dis2[4]);
  696.                                         write_data_12864(dis2[5]);
  697.                                         write_com_12864(0x94);
  698.                                 }
  699.                                 else if(flag==5)
  700.                                 {
  701.                                         hour++;
  702.                                         if(hour==24)hour=0;
  703.                                         write_com_12864(0x89);
  704.                                         write_com_12864(0x0f);
  705.                                         dis3[0]=character[hour/10];        
  706.                                         dis3[1]=character[hour%10];               
  707.                                         write_com_12864(0x89);
  708.                                         write_data_12864(dis3[0]);
  709.                                         write_data_12864(dis3[1]);
  710.                                         write_com_12864(0x89);
  711.                                 }
  712.                                 else if(flag==6)
  713.                                 {
  714.                                         min++;
  715.                                         if(min==60)min=0;
  716.                                         write_com_12864(0x8b);
  717.                                         write_com_12864(0x0f);
  718.                                         dis3[4]=character[min/10];        
  719.                                         dis3[5]=character[min%10];               
  720.                                         write_com_12864(0x8b);
  721.                                         write_data_12864(dis3[4]);
  722.                                         write_data_12864(dis3[5]);
  723.                                         write_com_12864(0x8b);
  724.                                 }
  725.                         }
  726.                         else if(key==0x11)
  727.                         {
  728.                                 if(flag==1)
  729.                                 {
  730.                                         year--;
  731.                                         write_com_12864(0x81);
  732.                                         write_com_12864(0x0f);
  733.                                         dis1[0]=character[year/1000];
  734.                                         dis1[1]=character[(year%1000)/100];
  735.                                         dis1[2]=character[(year%100)/10];
  736.                                         dis1[3]=character[year%10];
  737.                                         write_com_12864(0x80);
  738.                                         write_data_12864(dis1[0]);
  739.                                         write_data_12864(dis1[1]);
  740.                                         write_data_12864(dis1[2]);
  741.                                         write_data_12864(dis1[3]);
  742.                                         write_com_12864(0x81);        
  743.                                 }
  744.                                 else if(flag==2)
  745.                                 {
  746.                                         month--;
  747.                                         if(month<0)month=12;
  748.                                         write_com_12864(0x83);
  749.                                         write_com_12864(0x0f);        
  750.                                         dis1[6]=character[month/10];        
  751.                                         dis1[7]=character[month%10];        
  752.                                         write_com_12864(0x83);
  753.                                         write_data_12864(dis1[6]);
  754.                                         write_data_12864(dis1[7]);
  755.                                         write_com_12864(0x83);
  756.                                 }
  757.                                 else if(flag==3)
  758.                                 {
  759.                                         date--;
  760.                                         if(date<0)date=31;
  761.                                         write_com_12864(0x85);
  762.                                         write_com_12864(0x0f);
  763.                                         dis1[10]=character[date/10];        
  764.                                         dis1[11]=character[date%10];        
  765.                                         write_com_12864(0x85);
  766.                                         write_data_12864(dis1[10]);
  767.                                         write_data_12864(dis1[11]);
  768.                                         write_com_12864(0x85);
  769.                                 }
  770.                                 else if(flag==4)
  771.                                 {
  772.                                         weekday=weekday-2;
  773.                                         if(weekday==0)weekday=13;
  774.                                         write_com_12864(0x94);
  775.                                         write_com_12864(0x0f);
  776.                                         dis2[4]=character[weekday];        
  777.                                         dis2[5]=character[weekday+1];        
  778.                                         write_com_12864(0x94);
  779.                                         write_data_12864(dis2[4]);
  780.                                         write_data_12864(dis2[5]);
  781.                                         write_com_12864(0x94);
  782.                                 }
  783.                                 else if(flag==5)
  784.                                 {
  785.                                         hour--;
  786.                                         if(hour<0)hour=24;
  787.                                         write_com_12864(0x89);
  788.                                         write_com_12864(0x0f);
  789.                                         dis3[0]=character[hour/10];        
  790.                                         dis3[1]=character[hour%10];               
  791.                                         write_com_12864(0x89);
  792.                                         write_data_12864(dis3[0]);
  793.                                         write_data_12864(dis3[1]);
  794.                                         write_com_12864(0x89);
  795.                                 }
  796.                                 else if(flag==6)
  797.                                 {
  798.                                         min--;
  799.                                         if(min<0)min=59;
  800.                                         write_com_12864(0x8b);
  801.                                         write_com_12864(0x0f);
  802.                                         dis3[4]=character[min/10];        
  803.                                         dis3[5]=character[min%10];               
  804.                                         write_com_12864(0x8b);
  805.                                         write_data_12864(dis3[4]);
  806.                                         write_data_12864(dis3[5]);
  807.                                         write_com_12864(0x8b);
  808.                                 }
  809.                         }
  810.                 }
  811.                 else if(key==0x01)                                                                //按0x01键返回主程序
  812.                 {
  813.                         jump_sign=1;
  814.                         write_com_12864(0x0c);
  815.                         write_com_12864(0x01);
  816.                         return;
  817.                 }
  818.                 while(k);
  819.         }
  820. }
  821. /*****************************************************************************************************/
  822.                                                 /*******************闹铃时间设置*********************/
  823. void bell_setting()
  824. {
  825.         uchar i,flag2=0;
  826.         naoling[10]=character[nao_shi/10];
  827.         naoling[11]=character[nao_shi%10];
  828.         naoling[14]=character[nao_fen/10];
  829.         naoling[15]=character[nao_fen%10];

  830.         write_com_12864(0x01);
  831.         delay(20);
  832.         
  833.         write_com_12864(0x80);
  834.         delay(20);
  835.         for(i=0;i<16;i++)
  836.         {
  837.                 write_data_12864(naoling[i]);
  838.                 delay(200);
  839.         }
  840.         jump=1;
  841.         while(jump)
  842.         {
  843.                 k=1;
  844.                 if(key==0x0b||key==0x1a)
  845.                 {
  846.                         if(key==0x0b)                                                //按0x0b键进入闹铃时钟编辑
  847.                         {
  848.                                 flag2=0;
  849.                                 write_com_12864(0x85);
  850.                                 write_com_12864(0x0f);
  851.                         }
  852.                         else if(key==0x1a)                                        //按返回键进入闹铃分钟编辑
  853.                         {
  854.                                 flag2=1;
  855.                                 write_com_12864(0x87);
  856.                                 write_com_12864(0x0f);
  857.                         }
  858.                  }
  859.                 else if(key==0x10||key==0x11)                        //按0x10键进行数据加,按0x11键进行数据减        
  860.                 {                                                        
  861.                         if(key==0x10)
  862.                         {
  863.                                 if(flag2==0)
  864.                                 {        
  865.                                         nao_shi++;
  866.                                         if(nao_shi==24)nao_shi=0;
  867.                                         write_com_12864(0x85);
  868.                                         write_com_12864(0x0f);
  869.                                         naoling[10]=character[nao_shi/10];
  870.                                         naoling[11]=character[nao_shi%10];
  871.                                         write_com_12864(0x85);
  872.                                         write_data_12864(naoling[10]);
  873.                                         write_data_12864(naoling[11]);
  874.                                         write_com_12864(0x85);
  875.                                 }
  876.                                 else if(flag2==1)
  877.                                 {
  878.                                         nao_fen++;
  879.                                         if(nao_fen==60)nao_fen=0;
  880.                                         write_com_12864(0x87);
  881.                                         write_com_12864(0x0f);
  882.                                         naoling[14]=character[nao_fen/10];
  883.                                         naoling[15]=character[nao_fen%10];
  884.                                         write_com_12864(0x87);
  885.                                         write_data_12864(naoling[14]);
  886.                                         write_data_12864(naoling[15]);
  887.                                         write_com_12864(0x87);
  888.                                 }
  889.                         }
  890.                         else if(key==0x11)
  891.                         {
  892.                                 if(flag2==0)
  893.                                 {
  894.                                         nao_shi--;
  895.                                         if(nao_shi<0)nao_shi=59;
  896.                                         write_com_12864(0x85);
  897.                                         write_com_12864(0x0f);
  898.                                         naoling[10]=character[nao_shi/10];
  899.                                         naoling[11]=character[nao_shi%10];
  900.                                         write_com_12864(0x85);
  901.                                         write_data_12864(naoling[10]);
  902.                                         write_data_12864(naoling[11]);
  903.                                         write_com_12864(0x85);
  904.                                 }
  905.                                 else if(flag2==1)
  906.                                 {
  907.                                         nao_fen--;
  908.                                         if(nao_fen<0)nao_fen=59;
  909.                                         write_com_12864(0x87);
  910.                                         write_com_12864(0x0f);
  911.                                         naoling[14]=character[nao_fen/10];
  912.                                         naoling[15]=character[nao_fen%10];
  913.                                         write_com_12864(0x87);
  914.                                         write_data_12864(naoling[14]);
  915.                                         write_data_12864(naoling[15]);
  916.                                         write_com_12864(0x87);
  917.                                 }
  918.                         }
  919.                 }
  920.                 else if(key==0x01)                                                        //按0x01键返回主程序
  921.                 {
  922.                         jump_sign=1;
  923.                         write_com_12864(0x0c);
  924.                         write_com_12864(0x01);
  925.                         return;
  926.                 }
  927.                 while(k);
  928.          }
  929. }
  930. /*********************************************************************************************************/
  931.                                                         /********************图片浏览显示**********************/
  932. void pic_show()
  933. {
  934.         Init_12864();                                                                //液晶初始化
  935.         delay(250);                                
  936.         dis_pic(pic1);                                                                //图片1显示
  937.         delay1(5);
  938.         
  939.         Init_12864();                                                                //液晶初始化
  940.         delay(250);                                
  941.         dis_pic(pic2);                                                                //图片2显示        
  942.         delay1(5);
  943.         
  944.         Init_12864();                                                                //液晶初始化
  945.         delay(250);                                
  946.         dis_pic(pic3);                                                                //图片3显示
  947.         delay1(5);


  948.         key=0x1e;
  949.         jump=0;
  950.         k=0;
  951. }
  952. /************************************************************************************************************/
  953. /*************************************************主菜单显示子程序*******************************************/
  954. void function1()
  955. {
  956.         uchar i;
  957.         Init_12864();
  958.         delay(200);
  959.         write_com_12864(0x80);
  960.         delay(100);
  961.         for(i=0;i<14;i++)                                                                //主菜单第一行显示
  962.         {
  963.                 write_data_12864(menu1[i]);
  964.                 delay(100);
  965.         }
  966.         write_com_12864(0x90);
  967.         for(i=0;i<14;i++)                                                                //主菜单第二行显示
  968.         {
  969.                 write_data_12864(menu2[i]);
  970.                 delay(100);
  971.         }
  972.         write_com_12864(0x88);
  973.         for(i=0;i<14;i++)                                                                //主菜单第三行显示
  974.         {
  975.                 write_data_12864(menu3[i]);
  976.                 delay(100);
  977.         }
  978.         write_com_12864(0x98);
  979.         for(i=0;i<14;i++)                                                                //主菜单第四行显示
  980.         {
  981.                 write_data_12864(menu4[i]);
  982.                 delay(100);
  983.         }
  984.         jump=1;
  985.         while(jump)
  986.         {
  987.                 k=1;
  988.                 switch(key)
  989.                 {
  990.                         case 0x02: temp_limit();break;                                //按0x02键进入温度上下限设置
  991.                         case 0x03: time_setting();break;                        //按0x03键进入时间日期设置
  992.                         case 0x06: bell_setting();break;                        //按0x06键进入闹铃时间设置
  993.                         case 0x07: pic_show();break;                                //按0x07键进入图片浏览
  994.                         case 0x01: return; break;                                        //按0x01键返回主程序
  995.                 }
  996.                 while(k);
  997.         }
  998. }
  999. function2()                                                                                        //返回主程序标志设置
  1000. {
  1001.         uchar hui;
  1002.         hui=0;
  1003.         hui_sign=1;
  1004.         return(hui);
  1005. }
  1006. /********************************************主程序***********************************************/
  1007. void main()               
  1008. {
  1009.         uchar hui;
  1010.         LED_second=0;
  1011.         yejinxianshi();
  1012.         TMOD=0x21;
  1013.         TH0=0x3C;
  1014.         TL0=0xB0;
  1015.         TH1=0xfd;
  1016.         TL1=0xfd;
  1017.         SCON=0x50;
  1018.         IP=0x01;
  1019.         ES=1;
  1020.         ET0=1;
  1021.         IT0=1;
  1022.         TR1=1;
  1023.         TR0=1;
  1024.         EX0=1;
  1025.         EA=1;
  1026.         delay(5);
  1027.         while(1)
  1028.         {
  1029.                 write_com_12864(0x01);
  1030.                 delay(200);
  1031.                 write_com_12864(0x0c);
  1032.                 yemian();
  1033.                 hui=1;
  1034.                 while(hui)
  1035.                 {
  1036.                         if(hui_sign==1)
  1037.                         {
  1038.                                 hui_sign=0;
  1039.                                 key=0x09;
  1040.                         }
  1041.                         if(key!=0x00)
  1042.                         {
  1043.                                 switch(key)
  1044.                                 {        
  1045.                                 
  1046.                                         case 0x1e: function1();     break;                                //显示菜单
  1047.                                         case 0x01: hui=function2(); break;                                //退出到日历
  1048.                                 }
  1049.                         }
  1050.                         update_wendu();
  1051.                         update_time();
  1052.                 }
  1053.         }
  1054. }

  1055. /*********************************外部中断0入口程序(红外按键中断)******************************************************/
  1056. void int0(void) interrupt 0
  1057. {
  1058.         uchar i,j,N=0;
  1059.         EA=0;
  1060.         fenmingqi=1;
  1061.         if(jump_sign==1)
  1062.         {
  1063.                 jump_sign=0;
  1064.                 jump=0;
  1065.         }
  1066.         k=0;
  1067.         hongwai_key=0;
  1068.         if(dat==1)
  1069.         {
  1070.                 EA=1;
  1071.                 return;
  1072.         }
  1073.     while(!dat);                 //跳过引导码4.5ms低电平
  1074.         while(dat);                  //跳过引导码4.5ms高电平
  1075.         for(i=0;i<4;i++)                         //开始接收4组共32位数据
  1076.         {        
  1077.                 for(j=0;j<8;j++)                  //开始接收8bit数据
  1078.                 {
  1079.                         while(!dat);                          //跳过低电平,等待高电平到来比较
  1080.                         while(dat)
  1081.                         {
  1082.                                 delay(83);
  1083.                                 N++;
  1084.                                 if(N>30)
  1085.                                 {
  1086.                                         EA=1;
  1087.                                         return;
  1088.                                 }        
  1089.                         }        
  1090.                         get_data[i]=get_data[i]>>1;
  1091.                         if(N>2&&N<6){get_data[i]=get_data[i]|0x80;}
  1092.                         N=0;
  1093.                 }
  1094.         }
  1095.         if(get_data[2]!=(~get_data[3]))
  1096.         {
  1097.                 EA=1;
  1098.                 return;
  1099.         }
  1100.         key=get_data[2];                                        //将得到的数据送给变量key
  1101.         delay(5000);
  1102.         delay(5000);
  1103.         hongwai_key=1;
  1104.         fenmingqi=0;
  1105.         EA=1;
  1106. }

  1107. /*****************************************定时中断0入口程序(时钟时间更新)***********************************************************/
  1108. void update_time0() interrupt 1
  1109. {
  1110.         TH0=0x3C;
  1111.         TL0=0xB0;
  1112.         count_time++;
  1113.         count_nao++;
  1114.         count_LED++;

  1115. }
  1116. /******************************************串口中断入口程序(串口代替红外)**********************************************************/
  1117. void chuankou() interrupt 4
  1118. {
  1119.         TR0=0;



  1120.         …………余下代码请下载附件…………
复制代码




单片机红外遥控报警器全部制作资料下载:
红外遥控报警器(原理图 PCB图 程序 说明文档).zip (319.77 KB, 下载次数: 213)

评分

参与人数 4黑币 +132 收起 理由
zb12138 + 10 赞一个!
练氏 + 12
zhaok2013 + 10 很给力!
admin + 100 共享资料的黑币奖励!

查看全部评分

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

使用道具 举报

沙发
ID:165838 发表于 2017-3-11 22:13 | 只看该作者
谢了,拿去学习学习
回复

使用道具 举报

板凳
ID:139323 发表于 2017-4-11 11:33 | 只看该作者
不错,想学习一下
回复

使用道具 举报

地板
ID:171746 发表于 2017-4-16 20:31 | 只看该作者
程序有错误啊,没通过。
回复

使用道具 举报

5#
ID:237063 发表于 2017-10-2 22:44 | 只看该作者
好东西,学习下。
回复

使用道具 举报

6#
ID:102702 发表于 2017-10-3 01:43 | 只看该作者
好资料,学习一下
回复

使用道具 举报

7#
ID:241788 发表于 2017-10-22 13:26 | 只看该作者
能不能发到我邮箱里
回复

使用道具 举报

8#
ID:287527 发表于 2018-3-4 20:11 | 只看该作者

好东西,学习下。
回复

使用道具 举报

9#
ID:146746 发表于 2018-3-8 16:08 | 只看该作者
赞一个!
回复

使用道具 举报

10#
ID:289262 发表于 2018-3-29 09:40 | 只看该作者
好东西,下载学习下。
回复

使用道具 举报

11#
ID:350853 发表于 2018-7-5 21:41 | 只看该作者
请问电路原理图有?
回复

使用道具 举报

12#
ID:380389 发表于 2018-7-29 10:15 来自手机 | 只看该作者
珍藏了
回复

使用道具 举报

13#
ID:436061 发表于 2018-11-29 20:42 | 只看该作者
javacc 发表于 2017-3-11 22:13
谢了,拿去学习学习

我也要学习
回复

使用道具 举报

14#
ID:462924 发表于 2019-1-6 11:21 | 只看该作者
学习一下
回复

使用道具 举报

15#
ID:466131 发表于 2019-6-21 11:52 | 只看该作者
谢谢了,大哥、
回复

使用道具 举报

16#
ID:573572 发表于 2019-6-27 17:04 | 只看该作者
只能说一声牛批
回复

使用道具 举报

17#
ID:114330 发表于 2019-10-29 10:33 | 只看该作者
学习一下,谢谢了
回复

使用道具 举报

18#
ID:780117 发表于 2020-6-15 17:03 | 只看该作者
学习一下,谢谢了

回复

使用道具 举报

19#
ID:781499 发表于 2020-6-16 23:08 | 只看该作者
好东西,学习下
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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