#include<reg52.h> #define uchar unsigned char #define uint unsigned int sbit wela=P2^0; sbit dula=P2^1; uchar code tablewe[]={ 0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; uchar code tabledu[]={ 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; uchar Data[8]; //存储显示值的全局变量 sbit dc1=P1^1; //定义电机信号输出端口 uchar pwm_on; //定义速度等级 #define cycle 10 //周期 void delay(uchar t) { while(--t); } void delayMS(uchar t) { while(t--) { delay(245); delay(245); } } void display(uchar f,uchar n); uchar keyscan(); void init(); void main() { uchar num; pwm_on=0; //速度等级赋初值 init(); Data[0]=0x5e; //'d' Data[1]=0x39; //'c' while(1) { num=keyscan(); if(num==1) //第一个按键,速度等级增加 { if(pwm_on<cycle) { pwm_on++; } } else if(num==2) //第二个按键,速度等级减小 { if(pwm_on>0) { pwm_on--; } } Data[5]=tabledu[pwm_on/10]; //显示速度等级 Data[6]=tabledu[pwm_on%10]; } } void init() //初始化定时器 { TMOD=0x01; EA=1; ET0=1; TR0=1; //PT0=1; //开优先级(有多个中断时使用) } void display(uchar f,uchar n) //数码管显示函数 { static uchar i; //定义静态变量 P0=0; //消隐 dula=1; dula=0; P0=tablewe[i+f]; wela=1; wela=0; P0=Data[i]; dula=1; dula=0; i++; if(i==n) i=0; } void timer0() interrupt 1 //定时器中断 { static uchar times; TH0=(65536-2000)/256; TL0=(65536-2000)%256; display(0,8); if(times==pwm_on) //如果定时的时间等于on的时间,说明作用时间结束,输出低电平 { dc1=0; } //pwm_on越大,占空比越大,速度越大。 times++; //on的延时时间越长,相应的关的时间越短,从而占空比越大,速度越快。所以调节pwm——on即为调节直流电机转动的占空比 if(times==cycle) //反之,低电平时间结束后返回高电平 { times=0; if(pwm_on!=0) //如果开启的时间是0,保持原来状态 { dc1=1; } } } uchar keyscan() { uchar value; if(P3!=0xff) { delayMS(10); if(P3!=0xff) { value=P3; while(P3!=0xff); switch(value) { case 0xfe:return 1;break; case 0xfd:return 2;break; case 0xfb:return 3;break; case 0xf7:return 4;break; case 0xef:return 5;break; case 0xdf:return 6;break; case 0xbf:return 7;break; case 0x7f:return 8;break; default :return 0;break; } } } return 0; }