基于单片机的pwm电机控制内容摘要:

*/ void time0(void) interrupt 1 { count++。 if(count==CYCLE) { count=0。 databuf=plus。 plus=0。 if(tt!=2) tt++。 } TH0=0xDC。 TL0=0x00。 //定时 10mS } /* 转速数据处理显示子程序 */ void datamake(unsigned int th) { unsigned char a1,a2。 a1=th/10。 a2=th%10。 ledbuf[0]=ledmap[10]。 ledbuf[1]=ledmap[12]。 ledbuf[2]=ledmap[a1]。 ledbuf[3]=ledmap[a2]。 } /*************************** 定时器中断函数 ****************************/ void time1(void) interrupt 3 //定时器 1中断 { cont++。 if (cont==PWM_ON) { pwm = 1。 } //灯灭 if(cont == CYC) { cont=0。 pwm = 0。 } //灯亮 } /***************************** 按键检测子程序 ***************************/ unsigned char testkey() { P1=0x0f。 return(~P1amp。 0x0f)。 } /***************************** 比较处理函数 ****************************/ void pare(unsigned int th1,unsigned int th2) { if(th1!=th2) { if(th1th2) Flag1=1。 else Flag1=2。 if(Flag1==1) { PWM_ON= PWM_ON+10。 if(PWM_ON 800) { Bee=0。 delay(100)。 Bee=1。 } } if(Flag1==2) //亮度递减 同上,是个 相反的过程 {PWM_ON= PWM_ON5。 if(PWM_ON 45) { Bee=0。 delay(100)。 Bee=1。 } } } } /***************************** 函数功能 :LED显示子程序 *****************************/ void display() { unsigned char i。 unsigned char pos。 unsigned char led。 pos=0xfe。 for(i=0。 i8。 i++) {P2=0xff。 led=ledbuf[i]。 P0=led。 P2=pos。 delay(1)。 pos= _crol_(pos,1)。 } } /**************************** 函数功能 :键盘扫描子程序 ****************************/ void keyscan(void) { unsigned char n。 //扫描第一行 P1=0xfe。 n=P1。 namp。 =0xf0。 if(n!=0xf0) { P1=0xfe。 n=P1。 namp。 =0xf0。 if(n!=0xf0) { switch(n) {case(0xe0):flag=7。 break。 case(0xd0):flag=4。 break。 case(0xb0):flag=1。 break。 case(0x70):flag=0x0a。 break。 } } } //扫描第二行 P1=0xfd。 n=P1。 namp。 =0xf0。 if(n!=0xf0) { P1=0xfd。 n=P1。 namp。 =0xf0。 if(n!=0xf0) {switch(n) {case(0xe0):flag=8。 break。 case(0xd0):flag=5。 break。 case(0xb0):flag=2。 break。 case(0x70):flag=0。 break。 } } } //扫描第三行 P1=0xfb。 n=P1。 namp。 =0xf0。 if(n!=0xf0) { P1=0xfb。 n=P1。 namp。 =0xf0。 if(n!=0xf0) {switch(n) {case(0xe0):flag=9。 break。 case(0xd0):flag=6。 break。 case(0xb0):flag=3。 break。 case(0x70):flag=0x0b。 break。 } } } //扫描第四行 P1=0xf7。 n=P1。 namp。 =0xf0。 if(n!=0xf0) {P1=0xf7。 n=P1。 namp。 =0xf0。 if(n!=0xf0) {switch(n) {case(0xe0):flag=0x0f。 break。 case(0xd0):flag=0x0e。 break。 case(0xb0):flag=0x0d。 break。 case(0x70):flag=0x0c。 break。 } } } } /**************************** A/D转换子程序 *****************************/ void uart_int() { SCON = 0x50。 //设定串行口工作方式 PCON amp。 = 0xef。 //波 特率不倍增 TH2=0xFF。 TL2=0xDC。 RCAP2H = 0xFF。 // 波特率 9600 RCAP2L = 0xDC。 T2CON = 0x34。 // 定时器 1 工作于 8 位自动重载模式 , 用于产生波特率 TR2 = 1。 // 启动定时器 1 } /**************************** 函数功能 :主程序 *****************************/ void main(void) { unsigned char i。 bit conv。 num=0。 pwm=1。 CYCLE=100。 CYC=1000。 //时间周期可以调整 Init_int0()。 Init_Timer()。 uart_int()。 IP=0x01。 //设置 T0 中断为高优先级 EA=1。 //总中断打开 PWM_ON =100。 while(1) { display()。 if(testkey()) { keyscan()。 do{delay(1)。 } while(testkey())。 num++。 } if(flag==0x0a) { num=0。 for(i=0。 i2。 i++) {keybuf[i]=0。 } } if(flag==0x0B) { num=0。 TR1=1。 TR0=1。 //定时器 0开关打开 PWM_ON =100。 flag=0。 } if(flag==0x0C) { num=0。
阅读剩余 0%
本站所有文章资讯、展示的图片素材等内容均为注册用户上传(部分报媒/平媒内容转载自网络合作媒体),仅供学习参考。 用户通过本站上传、发布的任何内容的知识产权归属用户或原始著作权人所有。如有侵犯您的版权,请联系我们反馈本站将在三个工作日内改正。