本人现在想用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);
}
}
}
}
你的位码是共阴的,而你的段码是共阳的
如果你的数码管是共阴的,段码改成uchar code TABLE[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D, 0x7D,0x07,0x7F,0x6F};
如果你的数码管是共阳的,位码改成uchar code disp_bit[]={0x40,0x20,0x10};
引用: 原帖由 wuwenlin 于 2011-11-19 08:35 发表 我仔细检查了段码和位码都没有错啊。一开始我把显示函数放到中断里,显示程序正常,但是PWM输出的频率变成10HZ左右。拿出来频率1KHZ正常。所以请教各位大哥我应该把显示放在那里呢?
位码断码没错?难道你输出端还加非门了?
我也没看见你在哪用了display函数呀
[ 本帖最后由 孤獨の快樂 于 2011-11-19 10:07 编辑 ]if(up==0);和if(down==0);应该是while(up==0);和while(down==0);吧
试试把其它函数删了,只剩显示函数,会不会错
可以试试把pwm_disp类型改成uchar