- /*预处理命令*/
- #include<reg52.h> //包含单片机寄存器的头文件
- #include<intrins.h> //包含_nop_()函数定义的头文件
- #define uchar unsigned char
- #define uint unsigned int
- #define delayNOP(); {_nop_();_nop_();_nop_();_nop_();};
- sbit LED1 = P1^0; //定义LED灯,通过LED显示调光效果
- sbit LED2 = P1^1; //用来对比PWM
- sbit LED3 = P1^2;
- sbit IRIN= P3^2; //红外接收器数据线
- sbit rs=P0^7;
- sbit rw=P0^6;
- sbit lcden=P0^5;
- unsigned char time; //定义周期 该数字X基准定时时间 如果是10 则占空比是10 x 0.01ms /1ms
- void delay(unsigned char x) ;
- void delay_ms(uint z);
- char code dis []={"Countdown set:"};
- uchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,
- 0xf8,0x80,0x90};
- uchar IRCOM[7];
- uchar count,aa,sec=59,min,hour,ss,sg,ms,mg,hs,hg;
- //以下是1602程序
- void write_com(uchar com)
- {
- rs=0;
- lcden=0;
- P2=com;
- delay_ms(5);
- lcden=1;
- delay_ms(5);
- lcden=0;
- }
- void write_date(uchar date)
- {
- rs=1;
- lcden=0;
- P2=date;
- delay_ms(5);
- lcden=1;
- delay_ms(5);
- lcden=0;
- }
- void lcd_init()
- {
- rw=0;
- lcden=0;
- write_com(0x38);
- write_com(0x0c);
- write_com(0x06);
- write_com(0x01);
- }
- void write_fm(uchar add,uchar data1,uchar data2)
- {
- write_com(0x80+0x40+add);
- write_date(0x30+data1);
- write_date(0x30+data2);
- }
- //1602程序到此结束
- void Countup() //设置关断时间
- {
- if(min == 60)
- {
- min = 0;
- hour++;
- if(hour == 24)
- {
- hour =0;
- }
- }
- }
- void init()
- {
- IRIN=1; //红外接收器数据初始化为高电平
- EX0 = 1; //使能 INT0 外部中断
- IT0 = 1; //触发方式为脉冲负边沿触发 相当于IT0=1;
-
- TMOD =0x11; //定时器设置 0.01ms in 12M crystal
- TH0=0xff;
- TL0=0xa4; //定时器0定时0.01mS
-
- TH1 = (65535-50000)/256;
- TL1 = (65535-50000)%256; //定时器1定时50mS
- ET0 = 1;
- ET1 = 1; //开启定时器中断
- TR0 = 1;
- TR1 = 0; //定时器1暂不开启
- EA =1; //允许总中断中断,
- }
- /*******************************************************************/
- void main()
- {
- char i;
- time = 10; // 时间可以调整 这个是10调整 8位PWM就是256步
- init();
- lcd_init();
- write_com(0x80); //显示初始界面
- i=0;
- while (dis [i]!='\0')
- {
- write_date(dis [i]);
- i++;
- }
- write_fm(4,hs,hg); //显示初始时间
- write_date(':');
- write_fm(7,ms,mg);
- write_date(':');
- write_fm(10,ss,sg);
-
- while(!TR1); //等待红外启动
-
- while(TR1)
- {
- write_fm(0,IRCOM[5],IRCOM[6]); //显示红外键值
- Countup();
- ss = sec/10;
- sg = sec%10;
- ms = min/10;
- mg = min%10;
- hs = hour/10;
- hg = hour%10;
- write_fm(4,hs,hg);
- write_date(':');
- write_fm(7,ms,mg);
- write_date(':');
- write_fm(10,ss,sg); //1602显示时间00:00:59
- if(sec == 0 && min == 0 && hour == 0)
- {
- TR1 = 0; //停止计时
- LED1 = 1; //PWM灯关闭
- }
- }
- }
- /**********************************************************/
- void IR_IN() interrupt 0 using 0 //外部中断触发,接收到红外信号
- {
- unsigned char j,k,N=0;
- unsigned char q=0;
- EX0 = 0;
- delay(15);
- if (IRIN==1)
- {
- EX0 =1;
- return;
- }
- //确认IR信号出现
- while (!IRIN) //等IR变为高电平,跳过9ms的前导低电平信号。
- delay(1);
-
- for (j=0;j<4;j++) //收集四组数据
- {
- for (k=0;k<8;k++) //每组数据有8位
- {
- while (IRIN) //等 IR 变为低电平,跳过4.5ms的前导高电平信号。
- {delay(1);}
- while (!IRIN) //等 IR 变为高电平
- delay(1);
- while (IRIN) //计算IR高电平时长
- {
- delay(1);
- N++;
- if (N>=30) //超时数据接收完毕
- {
- EX0=1;
- return;
- } //0.14ms计数过长自动离开。
- } //高电平计数完毕
- IRCOM[j]=IRCOM[j] >> 1; //数据最高位补“0” 位操作
- if(N>=8)
- {
- IRCOM[j] = IRCOM[j] | 0x80; //数据最高位补“1”
- }
- N=0;
- }
- }
-
- if(IRCOM[2]!=~IRCOM[3])
- {
- EX0=1;
- return;
- }
-
- IRCOM[5]=IRCOM[2] & 0x0F; //取键码的低四位
- IRCOM[6]=IRCOM[2] >> 4; //右移4次,高四位变为低四位
-
- if(IRCOM[5]>9)
- {
- IRCOM[5]=IRCOM[5]+0x37;
- }
- else
- IRCOM[5]=IRCOM[5]+0x30;
-
- if(IRCOM[6]>9)
- {
- IRCOM[6]=IRCOM[6]+0x37;
- }
- else
- IRCOM[6]=IRCOM[6]+0x30;
- q= (((IRCOM[6]&0x0f)<<4) + (IRCOM[5]&0x0f));
-
- switch(q) //判断按键键码值
- {
- case 0x16:
- time = 99;break; //串口发送0
- case 0x03:
- time = 10;break; //串口发送01
- case 0x18:
- min = min+2;break; //串口发送02 设置关断时间
- case 0x55:
- time = 30;break; //串口发送03
- case 0x08:
- ET1=1;TR1=1;break; //串口发送04 计时开始
- case 0x13:
- time = 50;break; //串口发送05
- case 0x51:
- LED1 = 1;break; //串口发送06 关断LED1;
- case 0x42:
- time = 70;break; //串口发送07
- case 0x52:
- LED1 = 0;break; //串口发送08 开启LED1
- case 0x41:
- time = 90;break; //串口发送09
-
- default :
- break;
- }
- EX0 = 1;
- }
- //定时器0中断函数
- void tim0(void) interrupt 1 using 1
- {
- TH0=0xff;
- TL0=0xa4; //设置中断时间0.01mS
- count++;
- if(count<=time)
- {
- LED1 = 0;
- }
- else
- {
- LED1 =1;
- }
- if(count>=100) //周期1ms
- {
- count =0;
- }
- }
- void timer3() interrupt 3 using 3
- {
- TH1 = (65535-50000)/256;
- TL1 = (65535-50000)%256;
- aa++;
- if(aa == 20)
- {
- aa = 0;
- sec--;
- if(sec == 0)
- {
- sec = 59;
- min--;
- if(min == 0)
- {
- min = 59;
- hour--;
- if(hour == 0)
- {
- hour =0;
- }
- }
- }
- }
- }
- /***************延时函数*****************************/
- void delay(unsigned char x) //x*0.14MS
- {
- unsigned char i;
- while(x--)
- {
- for (i = 0; i<13; i++) {}
- }
- }
- void delay_ms(uint z)
- {
- uint x,y;
- for(x=z;x>0;x--)
- for(y=110;y>0;y--);
- }
复制代码 |