#include<reg52.h> //包含头文件 #define uint unsigned int //宏定义 #define uchar unsigned char sbit KEY1 = P3^0; // 定义调速按键S1 sbit KEY2 = P3^5; // 定义调速按键S2 sbit PWM = P1^6; // 定义调速端口 sbit PWM2= P1^7 ; sbit lcden = P1^0; //定义1602 使能端、RS端 sbit lcdrs = P1^1; uchar code table1[]="+ 3 dang " ; //定义直流电机正转档位显示 uchar code table2[]="+ 2 dang "; uchar code table3[]="+ 1 dang "; uchar code table0[]="+ 0 dang "; uchar code table11[]="- 3 dang " ; //定义直流电机反转档位显示 uchar code table22[]="- 2 dang "; uchar code table33[]="- 1 dang "; uchar code table00[]="- 0 dang "; unsigned char CYCLE; //定义周期 unsigned char PWM_ON ; //定义正转高电平时间 unsigned char PWM_DOWN ; //定义正转高电平时间 unsigned char PWM_Num2; unsigned char PWM_Num; uchar num; /******************************************************************/ /* 延时函数1 、2 */ /******************************************************************/ void delayms(uint z) { uint x,y; for(x=z;x>0;x--) for(y=110;y>0;y--); } void delay(unsigned int cnt) { while(--cnt); } /******************************************************************/ /* 1602显示函数 */ /******************************************************************/ void write_com(uchar com) { lcdrs=0; P2=com; delayms(5); lcden=1; delayms(5); lcden=0; } void write_data(uchar date) { lcdrs=1; P2 = date; delayms(5); lcden=1; delayms(5); lcden=0; } void init() //1602初始化 { lcden=0; write_com(0x38); write_com(0x0c); write_com(0x06); write_com(0x01);} void Display0() //正转档位零显示 { init(); write_com(0x80); for(num=0;num<11;num++) {write_data(table0[num]); delayms(5);} } void Display3() //正转档位一显示 { init(); write_com(0x80); for(num=0;num<11;num++) {write_data(table3[num]); delayms(5);} } void Display2() //正转档位二显示 { init(); write_com(0x80); for(num=0;num<11;num++) {write_data(table2[num]); delayms(5);} } void Display1() //正转档位三显示 { init(); write_com(0x80); for(num=0;num<11;num++) {write_data(table1[num]); delayms(5);} } void Display00() //反转 档位零显示 { init(); write_com(0x80); for(num=0;num<11;num++) {write_data(table00[num]); delayms(5);} } void Display33() //反转档位一显示 { init(); write_com(0x80); for(num=0;num<11;num++) {write_data(table33[num]); delayms(5);} } void Display22() //反转档位二显示 { init(); write_com(0x80); for(num=0;num<11;num++) {write_data(table22[num]); delayms(5);} } void Display11() //反转档位三显示 { init(); write_com(0x80); for(num=0;num<11;num++) {write_data(table11[num]); delayms(5);} } /******************************************************************/ /* 主函数 */ /******************************************************************/ main() { TMOD |=0x01; //定时器设置 TH0=(65536-1000)/256; TL0=(65536-1000)%256; //定时1ms IE= 0x82; //打开中断 TR0=1; //启动定时器0 CYCLE = 10; //时间可以调整 P3=0x21; while(1) { if(!KEY1) //按下按键S1 使直流电机正转 { delay(10000); if(!KEY1) { PWM2=0; PWM_Num2=0; PWM_ON=11; PWM_Num++; if(PWM_Num==4) PWM_Num=0; switch(PWM_Num) //调制占空比 { case 0:Display0();PWM_DOWN=10;break; //占空比为0% case 1:Display1();PWM_DOWN=1;break; //占空比为90% case2:Display2();PWM_DOWN=5;break; //占空比为50% case 3:Display3();PWM_DOWN=8;break; //占空比为20% default:break; } if(PWM_Num==4) PWM_Num=0; } } if(!KEY2) ///按下按键S2 使直流电机反转 { delay(10000); if(!KEY2) { PWM=0; PWM_DOWN=11 ; PWM_Num=0; PWM_Num2++; if(PWM_Num2==4) PWM_Num2=0; switch(PWM_Num2) //调制占空比 { case 0:Display00();PWM_ON=10;break; //占空比为0% case 1:Display11();PWM_ON=1;break; //占空比为90% case 2:Display22();PWM_ON=5;break; //占空比为50% case 3:Display33();PWM_ON=8;break; //占空比为20% default:break; } if(PWM_Num2==4) PWM_Num2=0; } } } }
|