本人现在想用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);
}
}
}
}
此帖出自
小平头技术问答
一周热门 更多>