紅外遙控單片機時鐘帶倒計時,功能強大,可以參考。
單片機源程序如下:
- //****************************************************************//
-
- //MCU :STC11F60XE
- //去中間值6M 內部晶振5.5-6.8M
-
- //****************************************************************//
- #include<STC11F60XE.H>
- #include<intrins.h>
- #include<math.h>
- #include<DS1302.h>
- //#include<RS485.h>
- //#include<eepram_operate.h>
- #define uchar unsigned char
- #define uint unsigned int
- //#define Segtime 1 //定義讀傳感器時間間隔 單位為秒
- /*********************************/
- sbit hwx=P3^2; //紅外接收數據引腳
- sbit led1=P1^4;
- sbit led2=P1^0;
- sbit SD=P1^5;
- sbit CK=P1^6;
- sbit SK=P1^7;
- bit time_flag,ly_flag,meter_flag,flash_flag;
- uchar count;
- uchar last_sec;
- int second;
- uchar ly_lhj[4]; //保存NEC的四個字節數據
- uchar dis_data[4];
- uchar data disp_code[12]={0xc0,0xfa,0xa4,0xb0,0x9a,0x91,0x81,0xf8,0x80,0x90,0xff,0xbf}; //0,1,2,3,4,5,6,7,8,9,OFF,負號
- /*********************************************/
- void delay_1ms(uint ms)
- {
- uchar i;
- while(ms--)
- for(i=0;i<20;i++);
- }
- /*********************************************/
- void delay(void)
- {
- uchar i=10;
- while(i--);
- }
- /***************************************************************************/
- void WR_595(uchar num1) ////試用于TPIC6B595N直接拉數碼管
- {
- uchar date;
- uchar b;
- date=num1;
- for(b=0;b<=7;b++)
- {
- if((date&0x80)==0x80) //最高位為1,則向sdata_595發送1
- SD=0; //發出數據的最高位
- else
- SD=1;
-
- date<<=1; //左移位
- SK=0;
- _nop_();
- _nop_();
- SK=1; //產生上升沿
- }
- }
- /***************************************************************************/
- void display(void)
- {
- CK=0;
-
- WR_595(disp_code[dis_data[3]]);
- WR_595(disp_code[dis_data[2]]);
- WR_595(disp_code[dis_data[1]]);
- WR_595(disp_code[dis_data[0]]);
-
- /*
- WR_595(disp_code[3]);
- WR_595(disp_code[2]);
- WR_595(disp_code[1]);
- WR_595(disp_code[0]);
- */
-
-
-
- CK=1;
- }
- //--------------------------------------------------------------------------------------------------
- // 函數名稱: 校驗時間函數
- // 函數功能:
- //--------------------------------------------------------------------------------------------------
- void adjust_time(void)
- {
- uchar ex,wei=3;
- led1=0;
- led2=0;
- ////////////////////////////////////
- while(time_flag==1)
- {
- ///////////////////////////
- ex=dis_data[wei]; //設定位閃爍顯示
- dis_data[wei]=10;
- display();
- delay_1ms(1500);
- dis_data[wei]=ex;
- display();
- delay_1ms(2200);
- ///////////////////////////
- if(ly_flag)
- {
- ly_flag=0; //清空標志
- ///////////左移鍵////////////
- if(ly_lhj[2]==0x08 && ly_lhj[3]==0xf7)
- { if(wei>0)
- wei--;
- else
- wei=3;
- }
- ///////////右移鍵////////////
- if(ly_lhj[2]==0x0a && ly_lhj[3]==0xf5)
- { if(wei<3)
- wei++;
- else
- wei=0;
- }
- ///////////0鍵////////////
- if(ly_lhj[2]==0x0e && ly_lhj[3]==0xf1)
- dis_data[wei]=0;
- ///////////1鍵////////////
- if(ly_lhj[2]==0x10 && ly_lhj[3]==0xef)
- dis_data[wei]=1;
- ///////////2鍵////////////
- if(ly_lhj[2]==0x11 && ly_lhj[3]==0xee)
- dis_data[wei]=2;
- ///////////3鍵////////////
- if(ly_lhj[2]==0x12 && ly_lhj[3]==0xed)
- dis_data[wei]=3;
- ///////////4鍵////////////
- if(ly_lhj[2]==0x14 && ly_lhj[3]==0xeb)
- dis_data[wei]=4;
- ///////////5鍵////////////
- if(ly_lhj[2]==0x15 && ly_lhj[3]==0xea)
- dis_data[wei]=5;
- ///////////6鍵////////////
- if(ly_lhj[2]==0x16 && ly_lhj[3]==0xe9)
- dis_data[wei]=6;
- ///////////7鍵////////////
- if(ly_lhj[2]==0x18 && ly_lhj[3]==0xe7)
- dis_data[wei]=7;
- ///////////8鍵////////////
- if(ly_lhj[2]==0x19 && ly_lhj[3]==0xe6)
- dis_data[wei]=8;
- ///////////9鍵////////////
- if(ly_lhj[2]==0x1a && ly_lhj[3]==0xe5)
- dis_data[wei]=9;
- ///////////時間設置返回 menu鍵////////////
- if(ly_lhj[2]==0x02 && ly_lhj[3]==0xfd)
- {
- hour=dis_data[0]*16 + dis_data[1];
- min=dis_data[2]*16 + dis_data[3];
- ds1302_initial();
- time_flag=0;
- //while(1); //基準時間設定后需要重新上電
- }
- }
-
- }
-
- }
- //--------------------------------------------------------------------------------------------------
- // 函數名稱: 校驗時間函數
- // 函數功能:
- //--------------------------------------------------------------------------------------------------
- void meter_Init(void)
- {
-
- //////////定時器部分///////
- TR0=0; //disable timer0
- TH0=0x3c;
- TL0=0xb0; //reload timer0
- count=0;
- ////////顯示部分/////////
- led1=0; led2=0; //點亮led
- second=0;
- dis_data[0]=0;
- dis_data[1]=0;
- dis_data[2]=0;
- dis_data[3]=0;
- }
- //--------------------------------------------------------------------------------------------------
- // 函數名稱: 校驗時間函數
- // 函數功能: 10倒計時到0 開始計時
- //--------------------------------------------------------------------------------------------------
- void time_meter(void)
- {
- meter_Init();
- while(meter_flag==1)
- {
- if(count==5 || count==10 || count==15 || count==19 ) //沒200ms
- { DIS_change();
- if(last_sec!=read_sec)
- {
- last_sec=read_sec;
- if(second==5999)
- second=second;
- else
- second++;
-
- dis_data[0]=second/60/10;
- dis_data[1]=second/60%10;
- dis_data[2]=second%60/10;
- dis_data[3]=second%60%10;
-
-
- }
- }
- delay_1ms(20);
- display();
- /**************遙控器操作不封*****************/
- if(ly_flag)
- {
- ly_flag=0; //清空標志
- ///////////暫停開始 暫停鍵////////////
- if(ly_lhj[2]==0x00 && ly_lhj[3]==0xff)
- {TR0=~TR0;
- if(TR0==1)
- {DIS_change();last_sec=read_sec;}
- }
- ///////////重新開始 ok鍵////////////
- if(ly_lhj[2]==0x09 && ly_lhj[3]==0xf6)
- { meter_Init();}
- ///////////返回時鐘模式 返回鍵////////////
- if(ly_lhj[2]==0x06 && ly_lhj[3]==0xf9)
- { meter_flag=0;TR0=1;}
- }
- /****************************************/
- }
- }
- //--------------------------------------------------------------------------------------------------
- // 函數名稱: setup(void)
- // 函數功能: 設置
- //--------------------------------------------------------------------------------------------------
- void setup(void)
- {
- if(ly_flag)
- { ly_flag=0; //清R空標志
-
- ///////////時間設置進入 menu鍵////////////
- if(ly_lhj[2]==0x02 && ly_lhj[3]==0xfd)
- { time_flag=1; TR0=0;ly_flag=0; adjust_time();TR0=1;}
- ///////////目標清零 +////////////
- //if(ly_lhj[2]==0x04 && ly_lhj[3]==0xfb)
- //{target=0; data_transfer();eeprom();}
- ///////////實際清零 _////////////
- //if(ly_lhj[2]==0x0c && ly_lhj[3]==0xf3)
- //{real=0; data_transfer();eeprom();}
- ///////////segtime設置 ok鍵////////////
- if(ly_lhj[2]==0x09 && ly_lhj[3]==0xf6)
- { meter_flag=1;ly_flag=0; time_meter();}
- ///////////選擇segtime////////////
- //if(ly_lhj[2]==0x00 && ly_lhj[3]==0xff);
- }
- }
- //--------------------------------------------------------------------------------------------------
- // 函數名稱:初始化函數
- // 函數功能:設定定時器工作方式,設定波特率
- //--------------------------------------------------------------------------------------------------
- /********************************/
- void Init(void)
- {
- TMOD = 0x11; //set timer0 & timer1 as mode 1 (16-bit)
- ET0 = 1; //enable timer0 interrupt
- TH0=0x3c;
- TL0=0xb0;
- TR0=1;
- //設置成下降沿觸發方式
- EX0=1; //開啟外部中斷0, 紅外接收頭
- IT0=1; //設置成下降沿觸發方式
-
- EA = 1;
- }
- /********************************/
- //--------------------------------------------------------------------------------------------------
- // 函數名稱:主函數
- // 函數功能:
- //--------------------------------------------------------------------------------------------------
- void main()
- {
-
-
- delay_1ms(1000);
- //display(); //先點亮數碼管
- Init();
- led1=0;
- led2=0;
- while(1)
- {
- delay_1ms(200);
-
- if(flash_flag==1) {led1=~led1;led2=~led2;flash_flag=0;}
- if((count%5)==0)
- { DIS_change();
-
- dis_data[0]=read_hour/16;
- dis_data[1]=read_hour%16;
- dis_data[2]=read_min/16;
- dis_data[3]=read_min%16;
-
- }
- display();
- setup();
-
-
- }
- }
- //--------------------------------------------------------------------------------------------------
- // 函數名稱: 外中斷0入口函數,P32引腳,紅外線接收IC數據腳 使用timer1 計時
- // 函數功能:
- //--------------------------------------------------------------------------------------------------
- void hongwai(void) interrupt 0
- {
- unsigned char i,ia;
- /**************開始判斷是否為NEC波形引導碼的前9MS和后4.5MS******************************/
- TL1=0;
- TH1=0; //定時/計數器1初始值
- TR1=1; //定時器以12M晶振12分頻計數,(12M 1us)
- while(!hwx);
- TR1=0; //信號翻轉停止計數
- if(TH1<30||TH1>40) //NEC引導碼前9MS,計數約9000,TH1約等于35,給個誤差值,用30-40之
- return;
- TH1=0; //定時/計數器1初始值
- TR1=1;
- while(hwx){
- delay();
- if(TH1>22) //NEC引導碼引導碼的后4。5MS,計數約4500,TH1約等于17
- return;
- }
- ……………………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
所有資料51hei提供下載:
FW 時鐘單面.rar
(58.35 KB, 下載次數: 7)
2018-8-21 08:35 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|