| 路过帮顶~~楼上回答的不错。。。。。。 |
|
//红外遥控解码,控制电机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++; } |