分享一個紅外遙控報警器含有原理圖+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格式的原理圖:
0.png (39.41 KB, 下載次數: 153)
下載附件
2017-3-11 20:19 上傳
ad格式的pcb文件:
0.png (74.52 KB, 下載次數: 132)
下載附件
2017-3-11 20:19 上傳
單片機源程序(部分內容預覽):
- #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;
- …………余下代碼請下載附件…………
復制代碼
0.png (66.94 KB, 下載次數: 122)
下載附件
2017-3-11 20:26 上傳
單片機紅外遙控報警器全部制作資料下載:
紅外遙控報警器(原理圖 PCB圖 程序 說明文檔).zip
(319.77 KB, 下載次數: 217)
2017-3-11 19:51 上傳
點擊文件名下載附件
紅外遙控報警器(原理圖+PCB圖+程序+說明文檔) 下載積分: 黑幣 -5
|