本設(shè)計主要是解決普通家電的智能化控制,主要描述一個遙控定時插座的設(shè)計與制作。該定時插座可以彌補現(xiàn)實生活中普通插座功能的不足,能夠通過外設(shè)按鍵或遙控器設(shè)置插座的供電時間,使外接電器可以按照一定規(guī)律工作,既可以達到智能控制的目的,又在很大程度上起到節(jié)能的作用。
本系統(tǒng)由STC8C52單片機電路+時鐘DS1302電路+LCD1602液晶顯示電路+按鍵電路+繼電器控制電路+蜂鳴器報警電路+紅外傳感器電路+電源電路組成。
1、DS1302時鐘芯片,準(zhǔn)確計時,自帶3V紐扣電池,當(dāng)系統(tǒng)掉電后,紐扣電池供電給時鐘芯片繼續(xù)工作,再次上電無需重新設(shè)置時間。
2、LCD1602液晶可以顯示時、分、秒、星期、年、月、日。
3、可以設(shè)置5個開關(guān)開的時間和5個開關(guān)關(guān)的時間,每一個時間都可以單獨設(shè)置成是否工作有效(Y/N),設(shè)定的時間并具有掉電保存功能,保存在STC單片機的內(nèi)部,上電無需重新設(shè)置。
4、繼電器吸合指示燈亮實現(xiàn)開關(guān)開,繼電器斷開指示燈滅實現(xiàn)開關(guān)關(guān),繼電器可以外接其他的家用電器。
5、具有自動模式和手動模式,手動模式下按加、減鍵就可以實現(xiàn)開關(guān)的開和關(guān)。
6、開機默認(rèn)是自動模式,當(dāng)現(xiàn)在的時間和設(shè)置開的時間一致時,繼電器工作打開開關(guān),當(dāng)現(xiàn)在的時候和設(shè)置關(guān)的時間一致時繼電器斷開關(guān)閉開關(guān)。
7、開關(guān)的開和關(guān)蜂鳴器的提示聲不同,當(dāng)開關(guān)開時,蜂鳴器會發(fā)出滴滴的提示聲,開關(guān)關(guān)時,蜂鳴器會長鳴一聲。
8、具有紅外遙控功能,可以用紅外遙控器完成整個產(chǎn)品的操作!皘<<”標(biāo)識手動或切換,“>>|”表示設(shè)置或換頁,“—”表示手動情況關(guān)閉或設(shè)置值--,“+”表示手動情況打開或設(shè)置值++。
源程序(C語言含詳細(xì)備注)單片機源程序如下:
- #include <reg52.h> //調(diào)用單片機頭文件
- #define uchar unsigned char //無符號字符型 宏定義 變量范圍0~255
- #define uint unsigned int //無符號整型 宏定義 變量范圍0~65535
- bit flag_200ms ; //200ms標(biāo)志
- bit flag_100ms ; //100ms標(biāo)志
- sbit beep = P3^7; //蜂鳴器定義
- bit flag_beep_en; //蜂鳴器使能標(biāo)志
- uint clock_value; //用作鬧鐘用的
- uchar menu_1,menu_2; //菜單選項
- sbit relay = P2^0;//繼電器
- bit flag_moshi;
- sbit IR=P3^2; //紅外接口標(biāo)志
- uchar key_time,flag_value; //用做連加的中間變量
- bit key_500ms ;
- void Ircordpro(void);//紅外碼值處理函數(shù)
- unsigned char irtime;//紅外用全局變量
- bit irpro_ok,irok;
- unsigned char IRcord[4];
- unsigned char irdata[33];
- //#include "key.h"
- #include "ds1302.h"
- #include "lcd1602.h"
- bit open1,open2,open3,open4,open5,open6,open7,open8,open9,open10,open11,open12;
- uchar fen1=0x30,shi1=0x06; //第1個開關(guān)的時間 開
- uchar fen2=0x30,shi2=0x07; //第2個開關(guān)的時間 閉
- uchar fen3=0x10,shi3=0x08; //第3個開關(guān)的時間
- uchar fen4=0x20,shi4=0x08; //第4個開關(guān)的時間
- uchar fen5=0x00,shi5=0x09; //第5個開關(guān)的時間
- uchar fen6=0x10,shi6=0x09; //第6個開關(guān)的時間
- uchar fen7=0x50,shi7=0x09; //第7個開關(guān)的時間
- uchar fen8=0x00,shi8=0x10; //第8個開關(guān)的時間
- uchar fen9=0x40,shi9=0x10; //第9個開關(guān)的時間
- uchar fen10=0x50,shi10=0x10; //第10個開關(guān)的時間
- /******************1ms 延時函數(shù)*******************/
- void delay_1ms(uint q)
- {
- uint i,j;
- for(i=0;i<q;i++)
- for(j=0;j<120;j++);
- }
- /*************定時器0初始化程序***************/
- void init_1602_ds1302()
- {
- write_sfm2_ds1302(2,3,nian);
- write_sfm2_ds1302(2,6,yue);
- write_sfm2_ds1302(2,9,ri);
- write_sfm2_ds1302(1,2,shi);
- write_sfm2_ds1302(1,5,fen);
- write_sfm2_ds1302(1,8,miao);
- write_sfm1(1,14,week);
- }
- /*************開關(guān)函數(shù)***************/
- void menu_dis()
- {
-
- if(miao == 0)
- {
- if(((fen == fen1) && (shi == shi1) && (open1 == 1)) ||
- ((fen == fen3) && (shi == shi3) && (open3 == 1)) ||
- ((fen == fen5) && (shi == shi5) && (open5 == 1)) ||
- ((fen == fen7) && (shi == shi7) && (open7 == 1)) ||
- ((fen == fen9) && (shi == shi9) && (open9 == 1)))
- { //打開開關(guān)
- relay = 0;
- for(i=0;i<4;i++)
- {
- beep = ~beep;
- delay_1ms(200);
- }
- beep = 1;
- }
- if(((fen == fen2) && (shi == shi2) && (open2 == 1)) ||
- ((fen == fen4) && (shi == shi4) && (open4 == 1)) ||
- ((fen == fen6) && (shi == shi6) && (open6 == 1)) ||
- ((fen == fen8) && (shi == shi8) && (open8 == 1)) ||
- ((fen == fen10) && (shi == shi10) && (open10 == 1)))
- { //關(guān)閉開關(guān)
- relay = 1;
- beep = 0;
- delay_1ms(1000);
- beep = 1;
- }
- }
- }
- /********************獨立按鍵程序*****************/
- uchar key_can; //按鍵值
- void key() //獨立按鍵程序
- {
- static uchar key_new;
- if((P3 & 0x78) != 0x78) //按鍵按下,
- {
- delay_1ms(1); //按鍵消抖動
- if(((P3 & 0x78) != 0x78) && (key_new == 1))
- { //確認(rèn)是按鍵按下
- key_new = 0;
- switch(P3 & 0x78)
- {
- case 0x70: key_can = 4; break; //得到按鍵值
- case 0x68: key_can = 3; break; //得到按鍵值
- case 0x58: key_can = 2; break; //得到按鍵值
- case 0x38: key_can = 1; break; //得到按鍵值
- }
- }
- }
- else
- key_new = 1;
- }
- /**********************設(shè)置函數(shù)************************/
- void key_with()
- {
- if(menu_1 == 0)
- {
- if(key_can == 2)
- {
- flag_moshi = !flag_moshi;
- if(flag_moshi == 0) //自動模式
- write_string(2,13," ");
- if(flag_moshi == 1) //手動模式
- write_string(2,13,"sd ");
- }
- if(flag_moshi == 1)
- {
- if(key_can == 3)
- relay = 0; //開
- if(key_can == 4)
- relay = 1; //關(guān)
- }
- }
- if(key_can == 1) //設(shè)置鍵
- {
- menu_1++;
- if(menu_1 == 1) //設(shè)置時間
- {
- menu_2 = 1;
- write_string(1,0," : : W: ");
- write_string(2,0," 20 - - ");
- }
- menu_2 = 1;
- if(menu_1 > 6) //回到正常顯示
- {
- menu_1 = 0;
- write_guanbiao(1,2,0); //關(guān)閉光標(biāo)
- init_1602_dis_csf(); //初始化液晶顯示
- }
- }
- if(key_can == 2) //選擇鍵
- {
- flag_200ms = 1;
- if(menu_1 == 1) //設(shè)置時間
- {
- menu_2 ++;
- if(menu_2 > 7)
- menu_2 = 1;
- }
- if(menu_1 != 1) //設(shè)置
- {
- menu_2 ++;
- if(menu_2 > 6)
- menu_2 = 1;
- }
- }
- if(menu_1 == 1)
- {
- if(menu_2 == 1) //設(shè)置時
- {
- if(key_can == 3) //加
- set_ds1302time(1,&shi,0x24);
- if(key_can == 4) //減
- set_ds1302time(0,&shi,0x24);
- }
- if(menu_2 == 2) //設(shè)置分
- {
- if(key_can == 3) //加
- set_ds1302time(1,&fen,0x60);
- if(key_can == 4) //減
- set_ds1302time(0,&fen,0x60);
- }
- if(menu_2 == 3) //設(shè)置秒
- {
- if(key_can == 3) //加
- set_ds1302time(1,&miao,0x60);
- if(key_can == 4) //減
- set_ds1302time(0,&miao,0x60);
- }
- if(menu_2 == 4) //設(shè)置星期
- {
- if(key_can == 3) //加
- set_ds1302time(1,&week,8);
- if(key_can == 4) //減
- set_ds1302time(0,&week,8);
- }
- if(menu_2 == 5) //設(shè)置年
- {
- if(key_can == 3) //加
- set_ds1302time(1,&nian,0x9A);
- if(key_can == 4) //減
- set_ds1302time(0,&nian,0x9A);
- }
- if(menu_2 == 6) //設(shè)置月
- {
- if(key_can == 3) //加
- set_ds1302time(1,&yue,0x13);
- if(key_can == 4) //減
- set_ds1302time(0,&yue,0x13);
- }
- if(menu_2 == 7) //設(shè)置日
- {
- if(key_can == 3) //加
- set_ds1302time(1,&ri,0x32);
- if(key_can == 4) //減
- set_ds1302time(0,&ri,0x32);
- }
- write_time(); //把時間寫進去1302RAM
- write_sfm2_ds1302(1,2,shi); //顯示時 1302RAM顯示出來
- write_sfm2_ds1302(1,5,fen); //顯示分
- write_sfm2_ds1302(1,8,miao); //顯示秒
- write_sfm1(1,14,week); //顯示星期
- write_sfm2_ds1302(2,3,nian); //顯示年
- write_sfm2_ds1302(2,6,yue); //顯示月
- write_sfm2_ds1302(2,9,ri); //顯示日
- switch(menu_2) // 光標(biāo)顯示
- {
- case 1: write_guanbiao(1,2,1); break;
- case 2: write_guanbiao(1,5,1); break;
- case 3: write_guanbiao(1,8,1); break;
- case 4: write_guanbiao(1,14,1); break;
- case 5: write_guanbiao(2,3,1); break;
- case 6: write_guanbiao(2,6,1); break;
- case 7: write_guanbiao(2,9,1); break;
- }
- }
- /***************設(shè)置1開關(guān)時間*********************/
- if(menu_1 == 2)
- {
- ///////////////////// 第1個開關(guān)時間 kai時間
- if(menu_2 == 1) //設(shè)置開關(guān)時
- {
- if(key_can == 3) //加
- set_ds1302time(1,&shi1,0x24);
- if(key_can == 4) //減
- set_ds1302time(0,&shi1,0x24);
- }
- if(menu_2 == 2) //設(shè)
- {
- if(key_can == 3) //加
- set_ds1302time(1,&fen1,0x60);
- if(key_can == 4) //減
- set_ds1302time(0,&fen1,0x60);
- }
- if(menu_2 == 3) //設(shè)
- {
- if(key_can == 3)
- open1 = ~open1;
- if(key_can == 4)
- open1 = ~open1;
- }
-
- ///////////////////// 第2個開關(guān)時間 閉時間
- if(menu_2 == 4) //設(shè)置開關(guān)分
- {
- if(key_can == 3) //加 第2個開關(guān)時間
- set_ds1302time(1,&shi2,0x24);
- if(key_can == 4) //減
- set_ds1302time(0,&shi2,0x24);
- }
- if(menu_2 == 5) //設(shè)
- {
- if(key_can == 3) //加
- set_ds1302time(1,&fen2,0x60);
- if(key_can == 4) //減
- set_ds1302time(0,&fen2,0x60);
- }
- if(menu_2 == 6) //設(shè)
- {
- if(key_can == 3)
- open2 = ~open2;
- if(key_can == 4)
- open2 = ~open2;
- }
- write_string(1,0,"OPEN1 00:00 Y ");
- write_string(2,0," OFF1 00:00 N ");
- write_sfm2_ds1302(1,6,shi1); //顯示時
- write_sfm2_ds1302(1,9,fen1); //顯示分
- write_sfm2_ds1302(2,6,shi2); //顯示時
- write_sfm2_ds1302(2,9,fen2); //顯示分
- if(open1 == 1)
- write_string(1,11," Y ");
- else
- write_string(1,11," N ");
- if(open2 == 1)
- write_string(2,11," Y ");
- else
- write_string(2,11," N ");
- }
- /***************設(shè)置2開關(guān)時間*********************/
- if(menu_1 == 3)
- {
- ///////////////////// 第1個開關(guān)時間
- if(menu_2 == 1) //設(shè)置開關(guān)時
- {
- if(key_can == 3) //加
- set_ds1302time(1,&shi3,0x24);
- if(key_can == 4) //減
- set_ds1302time(0,&shi3,0x24);
- }
- if(menu_2 == 2) //設(shè)
- {
- if(key_can == 3) //加
- set_ds1302time(1,&fen3,0x60);
- if(key_can == 4) //減
- set_ds1302time(0,&fen3,0x60);
- }
- if(menu_2 == 3) //設(shè)
- {
- if(key_can == 3)
- open3 = ~open3;
- if(key_can == 4)
- open3 = ~open3;
- }
- ///////////////////// 第2個開關(guān)時間
- if(menu_2 == 4) //設(shè)置開關(guān)分
- {
- if(key_can == 3) //加 第2個開關(guān)時間
- set_ds1302time(1,&shi4,0x24);
- if(key_can == 4) //減
- set_ds1302time(0,&shi4,0x24);
- }
- if(menu_2 == 5) //設(shè)
- {
- if(key_can == 3) //加
- set_ds1302time(1,&fen4,0x60);
- if(key_can == 4) //減
- set_ds1302time(0,&fen4,0x60);
- }
- if(menu_2 == 6) //設(shè)
- {
- if(key_can == 3)
- open4 = ~open4;
- if(key_can == 4)
- open4 = ~open4;
- }
- write_string(1,0,"OPEN2 00:00 ");
- write_string(2,0," OFF2 00:00 ");
- write_sfm2_ds1302(1,6,shi3); //顯示時
- write_sfm2_ds1302(1,9,fen3); //顯示分
- write_sfm2_ds1302(2,6,shi4); //顯示時
- write_sfm2_ds1302(2,9,fen4); //顯示分
- if(open3 == 1)
- write_string(1,11," Y ");
- else
- write_string(1,11," N ");
- if(open4 == 1)
- write_string(2,11," Y ");
- else
- write_string(2,11," N ");
- }
- /***************設(shè)置3開關(guān)時間*********************/
- if(menu_1 == 4)
- {
- ///////////////////// 第1個開關(guān)時間
- if(menu_2 == 1) //設(shè)置開關(guān)時
- {
- if(key_can == 3) //加
- set_ds1302time(1,&shi5,0x24);
- if(key_can == 4) //減
- set_ds1302time(0,&shi5,0x24);
- }
- if(menu_2 == 2) //設(shè)
- {
- if(key_can == 3) //加
- set_ds1302time(1,&fen5,0x60);
- if(key_can == 4) //減
- set_ds1302time(0,&fen5,0x60);
- }
- if(menu_2 == 3) //設(shè)
- {
- if(key_can == 3)
- open5 = ~open5;
- if(key_can == 4)
- open5 = ~open5;
- }
- ///////////////////// 第2個開關(guān)時間
- if(menu_2 == 4) //設(shè)置開關(guān)分
- {
- if(key_can == 3) //加 第2個開關(guān)時間
- set_ds1302time(1,&shi6,0x24);
- if(key_can == 4) //減
- set_ds1302time(0,&shi6,0x24);
- }
- if(menu_2 == 5) //設(shè)
- {
- if(key_can == 3) //加
- set_ds1302time(1,&fen6,0x60);
- if(key_can == 4) //減
- set_ds1302time(0,&fen6,0x60);
- }
- if(menu_2 == 6) //設(shè)
- {
- if(key_can == 3)
- open6 = ~open6;
- if(key_can == 4)
- open6 = ~open6;
- }
- write_string(1,0,"OPEN3 00:00 ");
- write_string(2,0," OFF3 00:00 ");
- write_sfm2_ds1302(1,6,shi5); //顯示時
- write_sfm2_ds1302(1,9,fen5); //顯示分
- write_sfm2_ds1302(2,6,shi6); //顯示時
- write_sfm2_ds1302(2,9,fen6); //顯示分
- if(open5 == 1)
- write_string(1,11," Y ");
- else
- write_string(1,11," N ");
- if(open6 == 1)
- write_string(2,11," Y ");
- else
- write_string(2,11," N ");
- }
- /***************設(shè)置4開關(guān)時間*********************/
- if(menu_1 == 5)
- {
- ///////////////////// 第4個開關(guān)時間
- if(menu_2 == 1) //設(shè)置開關(guān)時
- {
- if(key_can == 3) //加
- set_ds1302time(1,&shi7,0x24);
- if(key_can == 4) //減
- set_ds1302time(0,&shi7,0x24);
- }
- if(menu_2 == 2) //設(shè)
- {
- if(key_can == 3) //加
- set_ds1302time(1,&fen7,0x60);
- if(key_can == 4) //減
- set_ds1302time(0,&fen7,0x60);
- }
- if(menu_2 == 3) //設(shè)
- {
- if(key_can == 3)
- open7 = ~open7;
- if(key_can == 4)
- open7 = ~open7;
- }
-
- ///////////////////// 第4個開關(guān)時間
- if(menu_2 == 4) //設(shè)置開關(guān)分
- {
- if(key_can == 3) //加
- set_ds1302time(1,&shi8,0x24);
- if(key_can == 4) //減
- set_ds1302time(0,&shi8,0x24);
- }
- if(menu_2 == 5) //設(shè)
- {
- if(key_can == 3) //加
- set_ds1302time(1,&fen8,0x60);
- if(key_can == 4) //減
- set_ds1302time(0,&fen8,0x60);
- }
- if(menu_2 == 6) //設(shè)
- {
- if(key_can == 3)
- open8 = ~open8;
- if(key_can == 4)
- open8 = ~open8;
- }
- write_string(1,0,"OPEN4 00:00 ");
- write_string(2,0," OFF4 00:00 ");
- write_sfm2_ds1302(1,6,shi7); //顯示時
- write_sfm2_ds1302(1,9,fen7); //顯示時
- write_sfm2_ds1302(2,6,shi8); //顯示時
- write_sfm2_ds1302(2,9,fen8); //顯示分
- if(open7 == 1)
- write_string(1,11," Y ");
- else
- write_string(1,11," N ");
- if(open8 == 1)
- write_string(2,11," Y ");
- else
- write_string(2,11," N ");
- }
- /***************設(shè)置5開關(guān)時間*********************/
- if(menu_1 == 6)
- {
- ///////////////////// 第5個開關(guān)時間
- if(menu_2 == 1) //設(shè)置開關(guān)時
- {
- if(key_can == 3) //加
- set_ds1302time(1,&shi9,0x24);
- if(key_can == 4) //減
- set_ds1302time(0,&shi9,0x24);
- }
- if(menu_2 == 2) //設(shè)
- {
- if(key_can == 3) //加
- set_ds1302time(1,&fen9,0x60);
- if(key_can == 4) //減
- set_ds1302time(0,&fen9,0x60);
- }
- if(menu_2 == 3) //設(shè)
- {
- if(key_can == 3)
- open9 = ~open9;
- if(key_can == 4)
- open9 = ~open9;
- }
-
- ///////////////////// 第5個開關(guān)時間
- if(menu_2 == 4) //設(shè)置開關(guān)分
- {
- if(key_can == 3) //加
- set_ds1302time(1,&shi10,0x24);
- if(key_can == 4) //減
- set_ds1302time(0,&shi10,0x24);
- }
- if(menu_2 == 5) //設(shè)
- {
- if(key_can == 3) //加
- set_ds1302time(1,&fen10,0x60);
- if(key_can == 4) //減
- set_ds1302time(0,&fen10,0x60);
- }
- if(menu_2 == 6) //設(shè)
- {
- if(key_can == 3)
- open10 = ~open10;
- if(key_can == 4)
- open10 = ~open10;
- }
- write_string(1,0,"OPEN5 00:00 ");
- write_string(2,0," OFF5 00:00 ");
- write_sfm2_ds1302(1,6,shi9); //顯示時
- write_sfm2_ds1302(1,9,fen9); //顯示時
- write_sfm2_ds1302(2,6,shi10); //顯示時
- write_sfm2_ds1302(2,9,fen10); //顯示分
- if(open9 == 1)
- write_string(1,11," Y ");
- else
- write_string(1,11," N ");
- if(open10 == 1)
- write_string(2,11," Y ");
- else
- write_string(2,11," N ");
- }
- if((menu_1 >= 2))
- {
- switch(menu_2) // 光標(biāo)顯示
- {
- case 1: write_guanbiao(1,6,1); break;
- case 2: write_guanbiao(1,9,1); break;
- case 3: write_guanbiao(1,12,1); break;
- case 4: write_guanbiao(2,6,1); break;
- case 5: write_guanbiao(2,9,1); break;
- case 6: write_guanbiao(2,12,1); break;
- }
- }
- }
- /***********紅外遙控程序**************/
- void hongwai_dis()
- {
- // unsigned char tab[3];
- if(irok) //如果接收好了進行紅外處理
- {
- Ircordpro();
- irok=0;
- if(irpro_ok) //如果處理好后進行工作處理,如按對應(yīng)的按鍵后顯示對應(yīng)的數(shù)字等
- {
- beep = 0; //蜂鳴器叫一聲
- delay_1ms(50);
- beep = 1;
- switch(IRcord[2])
- {
- case 0x40: key_can = 1; break; //得到按鍵值
- case 0x44: key_can = 2; break; //得到按鍵值
- case 0x15: key_can = 3; break; //得到按鍵值
- case 0x07: key_can = 4; break; //得到按鍵值
- case 0x43: key_can = 5;
- menu_1 = 0;
- write_guanbiao(1,2,0); //關(guān)閉光標(biāo)
- init_1602_dis_csf(); //初始化液晶顯示
- break; //得到按鍵值
- }
-
- // tab[0]=IRcord[2]/100+'0';
- // tab[1]=IRcord[2]/10%10+'0';
- // tab[2]=IRcord[2]%10+'0';
- // write_string(2,12,tab);
- irpro_ok=0;//處理完成標(biāo)志
- }
- }
- }
- /***********外部中斷0初始化程序****************/
- void init_int0() //外部中斷0初始化程序
- {
- EX0=1; //允許外部中斷0中斷
- EA=1; //開總中斷
- IT0 = 1; //外部中斷0負(fù)跳變中斷
- }
- /*************定時器0初始化程序***************/
- void init_time0();
- /*****************主函數(shù)********************/
- void main()
- {
- beep = 0; //開機蜂鳴器叫一聲
- delay_1ms(200);
- P0 = P1 = P2 = P3 = 0xff; //初始化IO口
- init_int0();
- init_time0(); //初始化定時器
- init_ds1302(); //ds1302初始化
- init_1602(); //lcd1602初始化
- write_string(1,0," : : W: ");
- write_string(2,0," 20 - - ");
- while(1)
- {
- key(); //按鍵程序
- hongwai_dis();
- if(key_can < 10)
- {
- beep = 0;
- delay_1ms(50);
- beep = 1;
- key_with();
- }
- key_can = 11;
- if(flag_200ms == 1)
- {
- flag_200ms = 0;
- if(menu_1 == 0)
- {
- read_time(); //讀時間
- init_1602_ds1302(); //顯示時鐘
- }
- if(flag_moshi == 0) //自動模式
- if(menu_1 == 0)
- menu_dis(); //開關(guān)函數(shù)
- }
- delay_1ms(1);
- }
- }
- /*************定時器0初始化程序***************/
- void init_time0()
- {
- TMOD=0x02;//定時器0工作方式2,TH0是重裝值,TL0是初值
- TH0=0x00; //重載值
- TL0=0x00; //初始化值
- ET0=1; //開中斷
- TR0=1;
- }
- void time0() interrupt 1
- {
- static unsigned int num;
- irtime++; //用于計數(shù)2個下降沿之間的時間
- num++;
- if(num>=600)
- {flag_200ms=1;}
- }
- /*****************紅外解碼程序********************/
- void int0() interrupt 0
- {
- static unsigned char i; //接收紅外信號處理
- static bit startflag; //是否開始處理標(biāo)志位
-
- if(startflag)
- {
- if(irtime<63&&irtime>=33)//引導(dǎo)碼 TC9012的頭碼,9ms+4.5ms
- i=0;
- irdata[i]=irtime;//存儲每個電平的持續(xù)時間,用于以后判斷是0還是1
- irtime=0;
- i++;
- if(i==33)
- {
- irok=1;
- i=0;
- }
- }
- else
- {
- irtime=0;
- startflag=1;
- }
- }
- /*------------------------------------------------
- 紅外碼值處理
- ------------------------------------------------*/
- void Ircordpro(void)//紅外碼值處理函數(shù)
- {
- unsigned char i, j, k;
- unsigned char cord,value;
- k=1;
- for(i=0;i<4;i++) //處理4個字節(jié)
- {
- for(j=1;j<=8;j++) //處理1個字節(jié)8位
- {
- cord=irdata[k];
- if(cord>7)//大于某值為1,這個和晶振有絕對關(guān)系,這里使用12M計算,此值可以有一定誤差
- value|=0x80;
- if(j<8)
- {
- value>>=1;
- }
- k++;
- }
- IRcord[i]=value;// 四個字節(jié)每個字節(jié)依次放在數(shù)組里
- value=0;
- }
- irpro_ok=1;//處理完畢標(biāo)志位置1
- ……………………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復(fù)制代碼
所有資料51hei提供下載:
源程序.zip
(85.75 KB, 下載次數(shù): 197)
2018-5-1 20:42 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|