红外遥控单片机时钟带倒计时,功能强大,可以参考。
单片机源程序如下:
- //****************************************************************//
-
- //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)
|