本人现在想用IO口做PWM输出,频率1KHz,然后用两按键(+、-)来调节占空比0-100%,对应数码管显示000-100。
现波形是OK了,也可以调占空比,但是出现一个问题数码管显示乱七八糟,调了两天都没有调好,还请大哥们帮忙指
点。
#include<reg52.h> #define uint unsigned int #define uchar unsigned char sbit up=P2^0; //加1按键 sbit down=P2^1; //减1按键 sbit pwm_out=P1^0; //PWM输出端口 char disp=0; //显示计数器 char pwm_disp=50; //占空比显示单元,初始化为中间值 timer0_count=100;//定时中断计数器 uchar code disp_bit[]={0xbf,0xdf,0xef}; //数码管位码 P2.4,P2.5,P2.6 uchar code TABLE[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //数码管段码 0,1,2,3,4,5,6,7,8,9 void display();
//延时子函数 void delay(int x) { int i,j; for(i=0;i<x;i++) for(j=1;j<120;j++); }
//T0定时器初使化 void init() { TMOD=0x01; //T0方式1计时 TH0=(65536-8)/256; //定时10uS TL0=(65536-8)%256; EA=1; //总中断开 ET0=1; //定时器0开 TR0=1; //启动定时器 }
//T0定时中断子函数 void timer0() interrupt 1 using 0 { TH0=(65536-8)/256; //重置定时初值 10uS TL0=(65536-8)%256; if(pwm_disp==timer0_count )//占空比计数器等于定时中断计数器否 { pwm_out=1; //开通输出 } if(timer0_count==0) //定时中断计数器为0否 { pwm_out=0; //关断输出 timer0_count=100; //重置初始值 } timer0_count--; }
//显示子函数 void display() { delay(10); switch(disp) { case 0: { P2=0xbf; //P2为位码 P0=TABLE[pwm_disp/100]; //P0为段码 break; } case 1: { P2=0xdf; P0=TABLE[(pwm_disp%100)/10]; break; } case 2: { P2=0xef; P0=TABLE[pwm_disp%10]; break; }
} disp++;//显示计数器加1 if(disp>=3)//显示计数器等于3 disp=0; //则清零 }
//主程序 void main() { init(); while(1) { if(up==0)//增1键按下否 { delay(10); if(up==0) { pwm_disp++; if( pwm_disp>100) pwm_disp=0; if(up==0); } } if(down==0)//减1键按下否 { delay(10); if(down==0) { pwm_disp--; if( pwm_disp==0) pwm_disp=100; if(down==0); } } } }
|