//红外遥控解码,控制电机Pwm调速
#include<reg52.h>
#include<51hei.h>
#define uint unsigned int
#define uchar unsigned char
uchar code char1[]="KeyValue:";
uchar code char2[]="PWM:";
uchar key_code[2];
sbit lcdrs=P3^5;
sbit lcdrw=P2^7;
sbit lcden=P3^4;
sbit ir=P3^3;
sbit motor0=P1^0;
sbit motor1=P1^1;
uchar key_value,time;
char pwm_num;
//延时函数
//普通延时函数
void delay(uint t){
uchar i;
for(;t>0;t--)
for(i=0;i<110;i++);
}
//红外延时函数
void delay8900us(){
TH0=0xdf;
TL0=0xf6;
TR0=1;
while(!TF0);
TF0=0;
TR0=0;
}
void delay4500us(){
TH0=0xef;
TL0=0xcd;
TR0=1;
while(!TF0);
TF0=0;
TR0=0;
}
void delay600us(){
TH0=0xfd;
TL0=0xd7;
TR0=1;
while(!TF0);
TF0=0;
TR0=0;
}
//***********************lcd控制代码*********************
//lcd总线初始化
void init_lcd_bus(){
lcdrw=0;
lcden=0;
}
//lcd写命令
void lcdw_cmd(uchar cmd){
lcdrs=0;
P0=cmd;
lcden=1;
delay(5);
lcden=0;
}
//lcd写数据
void lcdw_data(uchar dat){
lcdrs=1;
P0=dat;
lcden=1;
delay(5);
lcden=0;
}
//lcd显示模式设置
void lcd_show_mode(){
lcdw_cmd(0x38);
lcdw_cmd(0x0c);
lcdw_cmd(0x06);
lcdw_cmd(0x01);
}
//lcd在指定位置显示指定数据
void lcd_display(uchar addr,uchar dat){
uchar ge,shi;
ge=dat%10;
shi=dat/10;
lcdw_cmd(0x80+addr);
lcdw_data(0x30+shi);
lcdw_data(0x30+ge);
}
//显示提示语
void lcd_init_show(){
uchar i;
lcdw_cmd(0x80);
for(i=0;i<9;i++)
lcdw_data(char1[i]);
lcdw_cmd(0x80+0x40);
for(i=0;i<4;i++)
lcdw_data(char2[i]);
lcdw_cmd(0x80+0x40+7);
lcdw_data('%');
}
//显示pwm占空比
void lcd_show_pwm(char dat){
uchar ge,shi,bai;
ge=dat%10;
shi=dat%100/10;
bai=dat/100;
lcdw_cmd(0x80+0x40+4);
lcdw_data(0x30+bai);
lcdw_data(0x30+shi);
lcdw_data(0x30+ge);
}
//**********************红外遥控解码***********************
uchar get_code(){
uchar i,dat;
for(i=0;i<8;i++){
dat>>=1;
while(!ir);
delay600us();
if(ir==1){
dat|=0x80;
while(ir);
}
}
return dat;
}
//*************************直流电机控制代码*****************
void zheng(){
motor0=0;
motor1=1;
if(time>=100)
time=0;
if(time>=pwm_num)
motor1=0;
}
void fan(){
motor0=1;
motor1=0;
if(time>=100)
time=0;
if(time>=pwm_num)
motor0=0;
}
void stop(){
motor0=0;
motor1=0;
}
void pwm(){
switch(key_value){
case 1:
key_code[0]=1;
break;
case 2:
key_code[0]=2;
break;
case 5:
key_code[1]=3;
break;
case 6:
key_code[1]=4;
break;
default :
key_code[0]=0;
break;
}
if(key_code[0]==1){
zheng();
//key_code[0]=0;
if(key_code[1]==3){
key_value=1;
key_code[1]=5;
pwm_num-=5;
if(pwm_num<=0)
pwm_num=0;
}
else if(key_code[1]==4){
key_value=1;
key_code[1]=5;
pwm_num+=5;
if(pwm_num>=100)
pwm_num=100;
}
}
else if(key_code[0]==2){
fan();
//key_code[1]=0;
if(key_code[1]==3){
key_value=2;
key_code[1]=5;
pwm_num-=5;
if(pwm_num<=0)
pwm_num=0;
}
else if(key_code[1]==4){
key_value=2;
key_code[1]=5;
pwm_num+=5;
if(pwm_num>=100)
pwm_num=100;
}
}
else{
stop();
}
}
//外部中断初始化及定时器0初始化
void init_other(){
ir=1;
TMOD=0x11;
TH1=0xfc;
TL1=0x66;
TR1=1;
ET1=1;
EX1=1;
IT1=1;
EA=1;
motor0=0;
motor1=1;
pwm_num=50;
}
//总初始化
void init(){
guandz();
guanled();
init_other();
init_lcd_bus();
lcd_show_mode();
lcd_init_show();
}
//主函数
void main(){
init();
while(1){
lcd_display(9,key_value);
lcd_show_pwm(pwm_num);
pwm();
}
}
//红外中断函数
void inter1() interrupt 2
{
uchar code1,code2,code3,code4;
EA=0;
delay8900us();
if(ir){
EA=1;
return;
}
while(!ir);
delay4500us();
if(ir){
EA=1;
return;
}
//while(ir);
code1=get_code();
code2=get_code();
code3=get_code();
code4=get_code();
while(!ir);
if(code3!=~code4){
key_value=99;
EA=1;
return;
}
key_value=code3;
EA=1;
}
//定时器1中断函数
void timer1() interrupt 3
{
TH1=0xfc;
TL1=0x66;
time++;
}
|