分享一个红外遥控报警器含有原理图+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文件:
单片机源程序(部分内容预览):
- #include<reg52.h>
- #include<intrins.h>
- #define uchar unsigned char
- #define uint unsigned int
- /********************************位定义区**********************************************************/
- sbit DQ=P1^0;
- sbit en=P1^2;
- sbit rw=P1^3;
- sbit rs=P1^4;
- sbit dat=P3^2;
- sbit LED_second=P1^1; //跳秒指示;满一秒时亮
- sbit hongwai_key=P3^7; //红外按键指示;有键按下时亮
- sbit fenmingqi=P3^3; //蜂鸣器控制;蜂鸣器鸣叫控制脚
- /*********************************各变量定义区*********************************************************/
- uchar jump=1,count_time=0,k=0,count_LED=0;
- uchar get_data[4],key,hui_sign=0;
- uchar Toptemp=30,Downtemp=0;
- uchar sec=50,min=59,hour=23,date=1,month=1,weekday=3;
- uint year=2009;
- uchar a,b,c,d;
- uchar nao_shi=6,nao_fen=0,naoling_sign=0,count_nao=0,count_keep_nao=0;
- uchar jump_sign=0;
- uchar *kaiji;
- /**********************************基本显示页面显示内容******************************************************/
- unsigned char dis1[16]={"2009年06月20日"};
- unsigned char dis2[6]={"星期三"};
- unsigned char dis3[14]={"17: 54: 00 PM"};
- unsigned char dis4[16]={"现在温度: . ℃"};
- /***********************************主菜单显示内容*******************************************************/
- unsigned char code menu1[16]={"1.温度上下限值"};
- unsigned char code menu2[16]={"2.时间日期调整"};
- unsigned char code menu3[16]={"3.闹铃时间调整"};
- unsigned char code menu4[16]={"4.图片播放浏览"};
- /**********************************各设置时子菜单显示内容***************************************************/
- unsigned char idata wendu1[12]={"1.上限: ℃"};
- unsigned char idata wendu2[12]={"2.下限: ℃"};
- unsigned char code character[10]={'0','1','2','3','4','5','6','7','8','9'};
- unsigned char code weekdate[15]={" 一二三四五六天"};
- unsigned char idata naoling[16]={"闹铃时间:00:00"};
- /*********************************图片显示代码区************************************************************/
- uchar code pic1[]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, //图片1显示代码
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- …………余下代码请下载附件…………
- 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,
- 0x7F,0xFF,0xFF,0xC0,0x00,0x3F,0xFF,0xFF,
- 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,
- 0x7F,0xFF,0xFF,0xE3,0x03,0xFF,0xFF,0xFF,
- 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,
- 0x7F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
- 0xFF,0xFF,0xFF,0xE0,0x00,0x00,0x00,0x00};
- /*****************************************延时程序*************************************************/
- void delay(uchar n) //6微妙延时子程序
- {
- while(n--)
- {;}
- }
- void delay1(uint n1) //开机图片现显示时间
- {
- uchar i,j,k;
- for(i=0;i<200;i++)
- {
- for(j=0;j<200;j++)
- {
- for(k=0;k<n1;k++)
- {}
- }
- }
- }
- /**************************************开机图片显示及基本页面显示******************************************/
- void dis_data() //开机初始化显示
- {
- dis1[0]=character[year/1000];
- dis1[1]=character[(year%1000)/100];
- dis1[2]=character[(year%100)/10];
- dis1[3]=character[year%10];
- dis1[6]=character[month/10];
- dis1[7]=character[month%10];
- dis1[10]=character[date/10];
- dis1[11]=character[date%10];
- dis2[4]=weekdate[weekday];
- dis2[5]=weekdate[weekday+1];
- dis3[0]=character[hour/10];
- dis3[1]=character[hour%10];
- dis3[4]=character[min/10];
- dis3[5]=character[min%10];
- dis3[8]=character[sec/10];
- dis3[9]=character[sec%10];
- if(hour>11){dis3[12]='P';}
- else dis3[12]='A';
- }
- void write_com_12864(uchar com) //单片机对12864写指令
- {
- rs=0;
- rw=0;
- en=1;
- delay(20);
- P2=com;
- delay(20);
- en=0;
- delay(20);
- }
- void write_data_12864(uchar date) //单片机写数据到12864
- {
- rs=1;
- rw=0;
- en=1;
- delay(20);
- P2=date;
- delay(20);
- en=0;
- delay(20);
- }
- void Init_12864() //液晶初始化子程序
- {
- delay(20);
- write_com_12864(0x30); //基本指令操作
- delay(20);
- write_com_12864(0x0c); //开显示,游标关,游标位置反白不允许
- delay(20);
- write_com_12864(0x01); //写入新数据后光标右移
- delay(20);
- write_com_12864(0x06); //显示清屏
- delay(20);
- }
- void yemian()
- {
- uchar i;
- write_com_12864(0x80); //基本页面第一行显示
- for(i=0;i<14;i++)
- {
- write_data_12864(dis1[i]);
- delay(100);
- }
- write_com_12864(0x92); //基本页面第二行显示
- for(i=0;i<6;i++)
- {
- write_data_12864(dis2[i]);
- delay(100);
- }
- write_com_12864(0x89); //基本页面第三行显示
- for(i=0;i<14;i++)
- {
- write_data_12864(dis3[i]);
- delay(100);
- }
- write_com_12864(0x98); //基本页面第四行显示
- for(i=0;i<16;i++)
- {
- write_data_12864(dis4[i]);
- delay(100);
- }
- }
- void tuchu(uchar x,uchar y) //图片处理子程序
- {
- write_com_12864(0x34);
- delay(20);
- write_com_12864(y);
- delay(20);
- write_com_12864(x);
- delay(20);
- write_com_12864(0x30);
- }
- void dis_pic(uchar code *pic) //图片显示入口程序
- {
- int i,j;
- uint b=0;
- int x,y;
- x=0x80;
- y=0x80;
- for(i=0;i<32;i++)
- {
- tuchu(x,y);
- for(j=0;j<16;j++)
- {
- write_data_12864(~pic[b]);
- b++;
- delay(20);
- }
- y++;
- }
- x=0x88;
- y=0x80;
- for(i=0;i<32;i++)
- {
- tuchu(x,y);
- for(j=0;j<16;j++)
- {
- write_data_12864(~pic[b]);
- b++;
- delay(20);
- }
- y++;
- }
- write_com_12864(0x36);
- b=0;
- }
- void yejinxianshi()
- {
- kaiji=pic1;
- Init_12864(); //开机液晶初始化
- delay(250);
- dis_pic(kaiji); //开机图片显示
- delay1(12);
- Init_12864(); //基本页面显示前初始化
- delay(100);
- dis_data(); //对显示内容初始化
- delay(250);
- yemian(); //基本页面显示
- }
- /********************************温度采集及显示程序*****************************************************/
- void data_done(uchar templ,uchar temph) //温度数据采集后的数据整理
- {
- uint result,temp,t,t1;
- t1=templ&0x0f;
- templ=templ&0xf0;
- templ=templ>>4;
- temph=temph&0x07;
- temph=temph<<4;
- temp=templ+temph;
- result=temp;
- a=result/100;
- t=result%100;
- b=t/10;
- c=result%10;
- if(t1>9)
- {
- c=c+1;
- d=t1-10;
- if(c>9)
- {
- c=c-10;
- b=b+1;
- }
- }
- if(temp>=Toptemp||temp<=Downtemp)
- {
- fenmingqi=0; //当检测到的温度大于上限温度或小于下限温度时蜂鸣器鸣叫
- }
- else
- fenmingqi=1; //否则关闭蜂鸣器
- }
- read_bit_DS18B20() //传感器DS18B20读比特位
- {
- uchar i,temp;
- for(i=0;i<8;i++)
- {
- DQ=0;
- temp=temp>>=1;
- DQ=1;
- if(DQ==1){temp=temp+0x80;}
- delay(4);
- }
- return(temp);
- }
- void write_bit_DS18B20(uchar com) //传感器DS18B20写比特位
- {
- uchar i;
- for(i=0;i<8;i++)
- {
- DQ=0;
- DQ=(com&0x01);
- delay(5);
- DQ=1;
- com>>=1;
- }
- }
- Init_DS18B20() //DS18B20初始化子程序,判断传感器是否存在
- {
- uchar Judge;
- DQ=1;
- delay(1);
- DQ=0;
- delay(65);
- DQ=1;
- delay(5);
- Judge=DQ;
- delay(15);
- return(Judge);
- }
- void wendu_caiji() //温度采集子程序入口
- {
- uchar x,TEMP_L,TEMP_H;
- x=Init_DS18B20();
- if(x==0)
- {
- write_bit_DS18B20(0xcc);
- write_bit_DS18B20(0x44);
- delay(250);
- x=Init_DS18B20();
- if(x==0)
- {
- write_bit_DS18B20(0xcc);
- write_bit_DS18B20(0xbe);
- TEMP_L=read_bit_DS18B20();
- TEMP_H=read_bit_DS18B20();
- data_done(TEMP_L,TEMP_H);
- }
- }
- }
- /**********************************************温度和时间更新子程序*******************************************/
- void update_wendu() //温度更新显示子程序
- {
- wendu_caiji();
- dis4[10]=character[b];
- dis4[11]=character[c];
- dis4[13]=character[d];
- write_com_12864(0x9d);
- write_data_12864(dis4[10]);
- write_data_12864(dis4[11]);
- write_data_12864('.');
- write_data_12864(dis4[13]);
- }
- update_time() //时间更新显示子程序
- {
- uchar a1,b1,c1,d1;
- if(naoling_sign)
- {
- fenmingqi=0;
- if(count_nao==20)
- {
- count_nao=0;
- fenmingqi=~fenmingqi;
-
- }
- }
- if(count_LED==8)
- {
- count_LED=0;
- LED_second=~LED_second;
- }
- if(count_time==16)
- {
- count_time=0;
- sec++;
- if((min==nao_fen)&&(hour==nao_shi))
- {
- count_keep_nao++;
- if(count_keep_nao==1)
- {
- naoling_sign=1;
- }
- if(count_keep_nao==30)
- {
- naoling_sign=0;
- }
- if(count_keep_nao>61)
- {
- count_keep_nao=0;
- naoling_sign=0;
- }
- }
- a1=sec/10;
- if(a1==6){a1=0;}
- dis3[8]=character[a1];
- dis3[9]=character[sec%10];
- write_com_12864(0x8d);
- write_data_12864(dis3[8]);
- write_data_12864(dis3[9]);
- if(sec==60)
- {
- sec=0;
- min++;
- d1=min/10;
- if(d1==6){d1=0;}
- dis3[4]=character[d1];
- dis3[5]=character[min%10];
- write_com_12864(0x8b);
- write_data_12864(dis3[4]);
- write_data_12864(dis3[5]);
- if(min==60)
- {
- min=0;
- hour++;
- b1=hour/10;
- c1=hour%10;
- if(hour>11&&hour!=24)
- {
- dis3[12]='P';
- write_com_12864(0x8f);
- write_data_12864(dis3[12]);
- }
- else
- {
- dis3[12]='A';
- write_com_12864(0x8f);
- write_data_12864(dis3[12]);
- }
- if(b1==2&&c1==4){b1=0;c1=0;}
- dis3[0]=character[b1];
- dis3[1]=character[c1];
- write_com_12864(0x89);
- write_data_12864(dis3[0]);
- write_data_12864(dis3[1]);
- if(hour==24)
- {
- hour=0;
- date++;
- weekday=weekday+2;
- if(weekday>15)weekday=1;
- if(month==1||month==3||month==5||month==7||month==8||month==10||month==12)//考虑闰年时的时间计算
- {
- if(date==31)
- {
- date=1;
- month++;
- if(month>12)
- {
- month=1;
- year++;
- }
- if(month>12)
- {
- month=1;
- year++;
- }
- }
- }
- if(month==4||month==6||month==9||month==11)
- {
- if(date==30)
- {
- date=1;
- month++;
- if(month>12)
- {
- month=1;
- year++;
- }
- }
- }
- if(month==2)
- {
- if((year%4==0&&year%100!=0)||year%400==0)
- {
- if(date==29)
- {
- date=1;
- year++;
- }
- }
- else
- {
- if(date==28)
- {
- date=1;
- year++;
- }
- }
- }
- }
- dis1[10]=character[date/10];
- dis1[11]=character[date%10];
- write_com_12864(0x85);
- write_data_12864(dis1[10]);
- write_data_12864(dis1[11]);
- write_com_12864(0x94);
- write_data_12864(weekdate[weekday]);
- write_data_12864(weekdate[weekday+1]);
- dis1[6]=character[month/10];
- dis1[7]=character[month%10];
- write_com_12864(0x83);
- write_data_12864(dis1[6]);
- write_data_12864(dis1[7]);
- dis1[0]=character[year/1000];
- dis1[1]=character[(year%1000)/100];
- dis1[2]=character[(year%100)/10];
- dis1[3]=character[year%10];
- write_com_12864(0x80);
- write_data_12864(dis1[0]);
- write_data_12864(dis1[1]);
- write_data_12864(dis1[2]);
- write_data_12864(dis1[3]);
- }
- }
- }
- }
- /********************************菜单设置及功能****************************************************/
- /************************温度上下限设置***************************/
- void temp_limit() //温度上下限数值设置
- {
- uchar flag1=0,i=0;
- wendu1[8]=character[Toptemp/10];
- wendu1[9]=character[Toptemp%10];
- wendu2[8]=character[Downtemp/10];
- wendu2[9]=character[Downtemp%10];
- Init_12864();
- delay(200);
- write_com_12864(0x80);
- delay(200);
- for(i=0;i<12;i++)
- {
- write_data_12864(wendu1[i]);
- delay(100);
- }
- write_com_12864(0x90);
- for(i=0;i<12;i++)
- {
- write_data_12864(wendu2[i]);
- delay(100);
- }
- jump=1;
- while(jump)
- {
- k=1;
- if(key==0x0b||key==0x1a)
- {
- if(key==0x0b) //按0x0b键进入上限温度编辑
- {
- flag1=0;
- write_com_12864(0x84);
- write_com_12864(0x0f);
- }
- else if(key==0x1a) //按0x1a键进入下限温度编辑
- {
- flag1=1;
- write_com_12864(0x94);
- write_com_12864(0x0f);
- }
- }
- else if(key==0x10||key==0x11) //按0x10键加数据,按0x11键减数据
- {
- if(key==0x10)
- {
- if(flag1==0)
- {
- Toptemp++;
- write_com_12864(0x84);
- write_com_12864(0x0f);
- }
- else if(flag1==1)
- {
- Downtemp++;
- write_com_12864(0x94);
- write_com_12864(0x0f);
- }
- }
- else if(key==0x11)
- {
- if(flag1==0)
- {
- Toptemp--;
- write_com_12864(0x84);
- write_com_12864(0x0f);
- }
- else if(flag1==1)
- {
- Downtemp--;
- write_com_12864(0x94);
- write_com_12864(0x0f);
- }
- }
- }
- else if(key==0x01) //按0x01返回到主程序
- {
- jump_sign=1;
- write_com_12864(0x0c);
- write_com_12864(0x01);
- return;
- }
- if(flag1==0)
- {
- wendu1[8]=character[Toptemp/10];
- wendu1[9]=character[Toptemp%10];
- write_com_12864(0x84);
- write_data_12864(wendu1[8]);
- write_data_12864(wendu1[9]);
- write_com_12864(0x84);
- }
- if(flag1==1)
- {
- wendu2[8]=character[Downtemp/10];
- wendu2[9]=character[Downtemp%10];
- write_com_12864(0x94);
- write_data_12864(wendu2[8]);
- write_data_12864(wendu2[9]);
- write_com_12864(0x94);
- }
- while(k);
- }
- }
- /**************************************************************************************************************/
- /**************************时间日期设置****************************/
- void time_setting()
- {
- uchar flag=0;
- write_com_12864(0x01);
- delay(200);
- dis_data();
- yemian(); //显示编辑界面
- jump=1;
- while(jump)
- {
- k=1;
- if(key==0x19) //按0x19键进行编辑位置选择
- {
- flag++; //利用flag作标志,选择合适的位置并进行数据修改
- if(flag==7)
- {flag=0;}
- else if(flag==1)
- {
- write_com_12864(0x81);
- write_com_12864(0x0f);
- }
- else if(flag==2)
- {
- write_com_12864(0x83);
- write_com_12864(0x0f);
- }
- else if(flag==3)
- {
- write_com_12864(0x85);
- write_com_12864(0x0f);
- }
- else if(flag==4)
- {
- write_com_12864(0x94);
- write_com_12864(0x0f);
- }
- else if(flag==5)
- {
- write_com_12864(0x89);
- write_com_12864(0x0f);
- }
- else if(flag==6)
- {
- write_com_12864(0x8b);
- write_com_12864(0x0f);
- }
- }
- else if(key==0x10||key==0x11) //按0x10键进行数据加,按0x11键进行数据减
- {
- if(key==0x10)
- {
- if(flag==1)
- {
- year++;
- write_com_12864(0x81);
- write_com_12864(0x0f);
- dis1[0]=character[year/1000];
- dis1[1]=character[(year%1000)/100];
- dis1[2]=character[(year%100)/10];
- dis1[3]=character[year%10];
- write_com_12864(0x80);
- write_data_12864(dis1[0]);
- write_data_12864(dis1[1]);
- write_data_12864(dis1[2]);
- write_data_12864(dis1[3]);
- write_com_12864(0x81);
- }
- else if(flag==2)
- {
- month++;
- if(month==13)month=0;
- write_com_12864(0x83);
- write_com_12864(0x0f);
- dis1[6]=character[month/10];
- dis1[7]=character[month%10];
- write_com_12864(0x83);
- write_data_12864(dis1[6]);
- write_data_12864(dis1[7]);
- write_com_12864(0x83);
- }
- else if(flag==3)
- {
- date++;
- if(date==32)date=0;
- write_com_12864(0x85);
- write_com_12864(0x0f);
- dis1[10]=character[date/10];
- dis1[11]=character[date%10];
- write_com_12864(0x85);
- write_data_12864(dis1[10]);
- write_data_12864(dis1[11]);
- write_com_12864(0x85);
- }
- else if(flag==4)
- {
- weekday=weekday+2;
- if(weekday==16)weekday=1;
- write_com_12864(0x94);
- write_com_12864(0x0f);
- dis2[4]=character[weekday];
- dis2[5]=character[weekday+1];
- write_com_12864(0x94);
- write_data_12864(dis2[4]);
- write_data_12864(dis2[5]);
- write_com_12864(0x94);
- }
- else if(flag==5)
- {
- hour++;
- if(hour==24)hour=0;
- write_com_12864(0x89);
- write_com_12864(0x0f);
- dis3[0]=character[hour/10];
- dis3[1]=character[hour%10];
- write_com_12864(0x89);
- write_data_12864(dis3[0]);
- write_data_12864(dis3[1]);
- write_com_12864(0x89);
- }
- else if(flag==6)
- {
- min++;
- if(min==60)min=0;
- write_com_12864(0x8b);
- write_com_12864(0x0f);
- dis3[4]=character[min/10];
- dis3[5]=character[min%10];
- write_com_12864(0x8b);
- write_data_12864(dis3[4]);
- write_data_12864(dis3[5]);
- write_com_12864(0x8b);
- }
- }
- else if(key==0x11)
- {
- if(flag==1)
- {
- year--;
- write_com_12864(0x81);
- write_com_12864(0x0f);
- dis1[0]=character[year/1000];
- dis1[1]=character[(year%1000)/100];
- dis1[2]=character[(year%100)/10];
- dis1[3]=character[year%10];
- write_com_12864(0x80);
- write_data_12864(dis1[0]);
- write_data_12864(dis1[1]);
- write_data_12864(dis1[2]);
- write_data_12864(dis1[3]);
- write_com_12864(0x81);
- }
- else if(flag==2)
- {
- month--;
- if(month<0)month=12;
- write_com_12864(0x83);
- write_com_12864(0x0f);
- dis1[6]=character[month/10];
- dis1[7]=character[month%10];
- write_com_12864(0x83);
- write_data_12864(dis1[6]);
- write_data_12864(dis1[7]);
- write_com_12864(0x83);
- }
- else if(flag==3)
- {
- date--;
- if(date<0)date=31;
- write_com_12864(0x85);
- write_com_12864(0x0f);
- dis1[10]=character[date/10];
- dis1[11]=character[date%10];
- write_com_12864(0x85);
- write_data_12864(dis1[10]);
- write_data_12864(dis1[11]);
- write_com_12864(0x85);
- }
- else if(flag==4)
- {
- weekday=weekday-2;
- if(weekday==0)weekday=13;
- write_com_12864(0x94);
- write_com_12864(0x0f);
- dis2[4]=character[weekday];
- dis2[5]=character[weekday+1];
- write_com_12864(0x94);
- write_data_12864(dis2[4]);
- write_data_12864(dis2[5]);
- write_com_12864(0x94);
- }
- else if(flag==5)
- {
- hour--;
- if(hour<0)hour=24;
- write_com_12864(0x89);
- write_com_12864(0x0f);
- dis3[0]=character[hour/10];
- dis3[1]=character[hour%10];
- write_com_12864(0x89);
- write_data_12864(dis3[0]);
- write_data_12864(dis3[1]);
- write_com_12864(0x89);
- }
- else if(flag==6)
- {
- min--;
- if(min<0)min=59;
- write_com_12864(0x8b);
- write_com_12864(0x0f);
- dis3[4]=character[min/10];
- dis3[5]=character[min%10];
- write_com_12864(0x8b);
- write_data_12864(dis3[4]);
- write_data_12864(dis3[5]);
- write_com_12864(0x8b);
- }
- }
- }
- else if(key==0x01) //按0x01键返回主程序
- {
- jump_sign=1;
- write_com_12864(0x0c);
- write_com_12864(0x01);
- return;
- }
- while(k);
- }
- }
- /*****************************************************************************************************/
- /*******************闹铃时间设置*********************/
- void bell_setting()
- {
- uchar i,flag2=0;
- naoling[10]=character[nao_shi/10];
- naoling[11]=character[nao_shi%10];
- naoling[14]=character[nao_fen/10];
- naoling[15]=character[nao_fen%10];
- write_com_12864(0x01);
- delay(20);
-
- write_com_12864(0x80);
- delay(20);
- for(i=0;i<16;i++)
- {
- write_data_12864(naoling[i]);
- delay(200);
- }
- jump=1;
- while(jump)
- {
- k=1;
- if(key==0x0b||key==0x1a)
- {
- if(key==0x0b) //按0x0b键进入闹铃时钟编辑
- {
- flag2=0;
- write_com_12864(0x85);
- write_com_12864(0x0f);
- }
- else if(key==0x1a) //按返回键进入闹铃分钟编辑
- {
- flag2=1;
- write_com_12864(0x87);
- write_com_12864(0x0f);
- }
- }
- else if(key==0x10||key==0x11) //按0x10键进行数据加,按0x11键进行数据减
- {
- if(key==0x10)
- {
- if(flag2==0)
- {
- nao_shi++;
- if(nao_shi==24)nao_shi=0;
- write_com_12864(0x85);
- write_com_12864(0x0f);
- naoling[10]=character[nao_shi/10];
- naoling[11]=character[nao_shi%10];
- write_com_12864(0x85);
- write_data_12864(naoling[10]);
- write_data_12864(naoling[11]);
- write_com_12864(0x85);
- }
- else if(flag2==1)
- {
- nao_fen++;
- if(nao_fen==60)nao_fen=0;
- write_com_12864(0x87);
- write_com_12864(0x0f);
- naoling[14]=character[nao_fen/10];
- naoling[15]=character[nao_fen%10];
- write_com_12864(0x87);
- write_data_12864(naoling[14]);
- write_data_12864(naoling[15]);
- write_com_12864(0x87);
- }
- }
- else if(key==0x11)
- {
- if(flag2==0)
- {
- nao_shi--;
- if(nao_shi<0)nao_shi=59;
- write_com_12864(0x85);
- write_com_12864(0x0f);
- naoling[10]=character[nao_shi/10];
- naoling[11]=character[nao_shi%10];
- write_com_12864(0x85);
- write_data_12864(naoling[10]);
- write_data_12864(naoling[11]);
- write_com_12864(0x85);
- }
- else if(flag2==1)
- {
- nao_fen--;
- if(nao_fen<0)nao_fen=59;
- write_com_12864(0x87);
- write_com_12864(0x0f);
- naoling[14]=character[nao_fen/10];
- naoling[15]=character[nao_fen%10];
- write_com_12864(0x87);
- write_data_12864(naoling[14]);
- write_data_12864(naoling[15]);
- write_com_12864(0x87);
- }
- }
- }
- else if(key==0x01) //按0x01键返回主程序
- {
- jump_sign=1;
- write_com_12864(0x0c);
- write_com_12864(0x01);
- return;
- }
- while(k);
- }
- }
- /*********************************************************************************************************/
- /********************图片浏览显示**********************/
- void pic_show()
- {
- Init_12864(); //液晶初始化
- delay(250);
- dis_pic(pic1); //图片1显示
- delay1(5);
-
- Init_12864(); //液晶初始化
- delay(250);
- dis_pic(pic2); //图片2显示
- delay1(5);
-
- Init_12864(); //液晶初始化
- delay(250);
- dis_pic(pic3); //图片3显示
- delay1(5);
- key=0x1e;
- jump=0;
- k=0;
- }
- /************************************************************************************************************/
- /*************************************************主菜单显示子程序*******************************************/
- void function1()
- {
- uchar i;
- Init_12864();
- delay(200);
- write_com_12864(0x80);
- delay(100);
- for(i=0;i<14;i++) //主菜单第一行显示
- {
- write_data_12864(menu1[i]);
- delay(100);
- }
- write_com_12864(0x90);
- for(i=0;i<14;i++) //主菜单第二行显示
- {
- write_data_12864(menu2[i]);
- delay(100);
- }
- write_com_12864(0x88);
- for(i=0;i<14;i++) //主菜单第三行显示
- {
- write_data_12864(menu3[i]);
- delay(100);
- }
- write_com_12864(0x98);
- for(i=0;i<14;i++) //主菜单第四行显示
- {
- write_data_12864(menu4[i]);
- delay(100);
- }
- jump=1;
- while(jump)
- {
- k=1;
- switch(key)
- {
- case 0x02: temp_limit();break; //按0x02键进入温度上下限设置
- case 0x03: time_setting();break; //按0x03键进入时间日期设置
- case 0x06: bell_setting();break; //按0x06键进入闹铃时间设置
- case 0x07: pic_show();break; //按0x07键进入图片浏览
- case 0x01: return; break; //按0x01键返回主程序
- }
- while(k);
- }
- }
- function2() //返回主程序标志设置
- {
- uchar hui;
- hui=0;
- hui_sign=1;
- return(hui);
- }
- /********************************************主程序***********************************************/
- void main()
- {
- uchar hui;
- LED_second=0;
- yejinxianshi();
- TMOD=0x21;
- TH0=0x3C;
- TL0=0xB0;
- TH1=0xfd;
- TL1=0xfd;
- SCON=0x50;
- IP=0x01;
- ES=1;
- ET0=1;
- IT0=1;
- TR1=1;
- TR0=1;
- EX0=1;
- EA=1;
- delay(5);
- while(1)
- {
- write_com_12864(0x01);
- delay(200);
- write_com_12864(0x0c);
- yemian();
- hui=1;
- while(hui)
- {
- if(hui_sign==1)
- {
- hui_sign=0;
- key=0x09;
- }
- if(key!=0x00)
- {
- switch(key)
- {
-
- case 0x1e: function1(); break; //显示菜单
- case 0x01: hui=function2(); break; //退出到日历
- }
- }
- update_wendu();
- update_time();
- }
- }
- }
- /*********************************外部中断0入口程序(红外按键中断)******************************************************/
- void int0(void) interrupt 0
- {
- uchar i,j,N=0;
- EA=0;
- fenmingqi=1;
- if(jump_sign==1)
- {
- jump_sign=0;
- jump=0;
- }
- k=0;
- hongwai_key=0;
- if(dat==1)
- {
- EA=1;
- return;
- }
- while(!dat); //跳过引导码4.5ms低电平
- while(dat); //跳过引导码4.5ms高电平
- for(i=0;i<4;i++) //开始接收4组共32位数据
- {
- for(j=0;j<8;j++) //开始接收8bit数据
- {
- while(!dat); //跳过低电平,等待高电平到来比较
- while(dat)
- {
- delay(83);
- N++;
- if(N>30)
- {
- EA=1;
- return;
- }
- }
- get_data[i]=get_data[i]>>1;
- if(N>2&&N<6){get_data[i]=get_data[i]|0x80;}
- N=0;
- }
- }
- if(get_data[2]!=(~get_data[3]))
- {
- EA=1;
- return;
- }
- key=get_data[2]; //将得到的数据送给变量key
- delay(5000);
- delay(5000);
- hongwai_key=1;
- fenmingqi=0;
- EA=1;
- }
- /*****************************************定时中断0入口程序(时钟时间更新)***********************************************************/
- void update_time0() interrupt 1
- {
- TH0=0x3C;
- TL0=0xB0;
- count_time++;
- count_nao++;
- count_LED++;
- }
- /******************************************串口中断入口程序(串口代替红外)**********************************************************/
- void chuankou() interrupt 4
- {
- TR0=0;
- …………余下代码请下载附件…………
复制代码
单片机红外遥控报警器全部制作资料下载:
红外遥控报警器(原理图 PCB图 程序 说明文档).zip
(319.77 KB, 下载次数: 213)
|