不知道哪里出问题了
时间:10-02
整理:3721RD
点击:
我做了个PWM控制系统,基于51单片机的,可是编译后没有错误,但是在仿真中数码管和虚拟示波器就是不显示怎么办?我实现的功能是:四个数码管显示当前频率和两个数码管显示占空比,八个按键构成键盘进行频率和占空比可调。希望各位大神帮我看看是不是程序哪里出现问题了。下面是程序:
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
uchar code number_tab[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,
0x07,0x7f,0x6f};//0---9数字共阴极
uchar code init_tab[7]={0x73,0x76,0x79,0x38,0x38,
0x3f};// PHELLO 共阴极
unchar ;i,k,tl,th,tl0,th0,tl1,th1,P0_0,t;
int qw=0,bw=5,sw=0,gw=0,zkgw=0,zksw=5;//qw为千位数字,bw为百位数字,sw为十位数字, gw为个位数字,zkgw为占空比个位数字,zksw为占空比十位数字
int t,f,m, zk=50;//t 为时间变量,f 为频率变量,zk为占空比变量,默认占空比为 50%,
uint FREQ0,FREQ1;
void delay10ms() //延时 10ms 程序
{
unsigned char i,j;
for(i = 20; i > 0; i--)
for(j = 248; j >0; j--);
}
void chushihua(void)//初始化显示 P.HELLO
{
P3 = 0xfe;
P2 = init_tab[0];
for(i = 0; i <= 60; i++);
P3 = 0xfe;//小数点显示
P2 = 0x80;
for(i = 0; i <= 60; i++);
P3 = 0xfd;
P2 = init_tab[1];
for(i = 0; i <= 60; i++);
P3 = 0xfb;
P2 = init_tab[2];
for( i=0;i<=60;i++);
P3 = 0xf7;
P2 = init_tab[3];
for(i = 0; i <= 60; i++);
P3 = 0xef;
P2 = init_tab[4];
for(i = 0; i <= 60; i++);
P3 = 0xdf;
P2 = init_tab[5];
for(i = 0; i <= 60; i++);
}
/*频率个位调整*/
void key1(void)
{
if(gw < 9)
{
gw = gw + 1;
}
else
gw = 0;
}
/*频率十位调整*/
void key2(void)
{
if(sw < 9)
{
sw = sw + 1;
}
else
sw = 0;
}
/*频率百位调整*/
void key3(void)
{
if(bw < 9)
{
bw = bw + 1;
}
else
bw = 0;
}
/*频率千位调整*/
void key4(void)
{
if(qw < 9)
{
qw = qw + 1;
}
else
qw=0;
}
/*方波占空比加大*/
void key5(void)
{
if(zk < 100)
{
zk=zk+1;
}
else
zk=0;
}
/*方波占空比减小*/
void key6(void)
{
if(zk >= 1)
{
zk=zk-1;
}
else
zk=0;
}
/*计算显示数字*/
void jisuan(void)
{
TR0 = 0; //关闭定时器
f = 1000 * qw + 100 * bw + 10 * sw + gw;
t = 1000000 / f;
th = -t / 256;
tl = -t % 256;
qw = f / 1000;
f = f % 1000;
bw = f / 100;
f = f % 100;
sw = f / 10;
gw = f % 10;
zkgw = zk % 10;
zksw = zk / 10;
TR0 = 1;
}
/*显示*/
void display (void)
{
P3 = 0xef;
P2 = number_tab[qw];
for(i = 0; i <= 60; i++);
P3 = 0xdf;
P2 = number_tab[bw];
for(i = 0; i <= 60; i++);
P3 = 0xbf;
P2 = number_tab[sw];
for(i = 0; i <= 60; i++);
P3 = 0x7f;
P2 = number_tab[gw];
for(i = 0; i <= 60; i++);
P3 = 0xfd;
P2 = number_tab[zkgw];
for(i = 0; i <= 60; i++);
P3 = 0xfe;
P2 = number_tab[zksw];
for(i = 0; i <= 60; i++);
}
/*键盘扫描*/
void judge(void)
{
unsigned char X,Y,Z;
P1 = 0xff;
P1 = 0x0f; //先对 P1 置数行扫描
if(P1 != 0x0f) //判断是否有键按下
{
delay10ms(); //延时,软件去干扰
if(P1 != 0x0f) //确认按键按下X = P1;
{
X = P1; //保存行扫描时有键按下时状态
P1 = 0xf0; //列扫描
Y = P1; //保存列扫描时有键按下时状态
Z = X | Y; //取出键值
switch ( Z ) //判断键值(哪一个键按下)
{
case 0x7e: key1(); break; //对键值赋值
case 0xbe: key2(); break;
case 0xed: key3(); break;
case 0xdd: key4(); break;
case 0xde: key5(); break;
case 0xee: key6(); break;
}
}
}
}
void main(void) //主函数
{
int n;
for(n = 0; n < 500; n++)
{
chushihua();
}
TMOD = 0x01;
TR0 = 1;
th0 = -t / 256;
tl0 = -t %256;
th1 = -t / 256;
tl1 = -t %256;
TR0=1;
TR1=1;
FREQ0=0;
FREQ1=0;
ET0 = 1;
EA = 1;
P0_0=1;
for(; ;)
while(1)
{
jisuan();
for(i = 0; i<= 50; i++);
display();
judge();
}
}
/*定时计数器0 的中断服务子程序*/
void timer0(void) interrupt 1 using 1
{
th0 = -t / 256; //装计数初值
tl0 = -t %256;
FREQ0=FREQ0+1;
if(FREQ0==1000*t) //t秒定时判断
{
P0_0=1; //信号输出端口取反
FREQ0=0;
TR1=1; //开始 T1的计时
}
}
/*定
} 时计数器1 的中断服务子程序*/
void timer1(void) interrupt 2 using 1
{
th0 = -t / 256; //装计数初值
tl0 = -t %256;
FREQ1=FREQ1+1;
if(FREQ1==zk*t) //高电平定时时间判断
{
P0_0=0; //信号输出端口取反
FREQ1=0;
TR1=0; //停止T1的计时
}
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
uchar code number_tab[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,
0x07,0x7f,0x6f};//0---9数字共阴极
uchar code init_tab[7]={0x73,0x76,0x79,0x38,0x38,
0x3f};// PHELLO 共阴极
unchar ;i,k,tl,th,tl0,th0,tl1,th1,P0_0,t;
int qw=0,bw=5,sw=0,gw=0,zkgw=0,zksw=5;//qw为千位数字,bw为百位数字,sw为十位数字, gw为个位数字,zkgw为占空比个位数字,zksw为占空比十位数字
int t,f,m, zk=50;//t 为时间变量,f 为频率变量,zk为占空比变量,默认占空比为 50%,
uint FREQ0,FREQ1;
void delay10ms() //延时 10ms 程序
{
unsigned char i,j;
for(i = 20; i > 0; i--)
for(j = 248; j >0; j--);
}
void chushihua(void)//初始化显示 P.HELLO
{
P3 = 0xfe;
P2 = init_tab[0];
for(i = 0; i <= 60; i++);
P3 = 0xfe;//小数点显示
P2 = 0x80;
for(i = 0; i <= 60; i++);
P3 = 0xfd;
P2 = init_tab[1];
for(i = 0; i <= 60; i++);
P3 = 0xfb;
P2 = init_tab[2];
for( i=0;i<=60;i++);
P3 = 0xf7;
P2 = init_tab[3];
for(i = 0; i <= 60; i++);
P3 = 0xef;
P2 = init_tab[4];
for(i = 0; i <= 60; i++);
P3 = 0xdf;
P2 = init_tab[5];
for(i = 0; i <= 60; i++);
}
/*频率个位调整*/
void key1(void)
{
if(gw < 9)
{
gw = gw + 1;
}
else
gw = 0;
}
/*频率十位调整*/
void key2(void)
{
if(sw < 9)
{
sw = sw + 1;
}
else
sw = 0;
}
/*频率百位调整*/
void key3(void)
{
if(bw < 9)
{
bw = bw + 1;
}
else
bw = 0;
}
/*频率千位调整*/
void key4(void)
{
if(qw < 9)
{
qw = qw + 1;
}
else
qw=0;
}
/*方波占空比加大*/
void key5(void)
{
if(zk < 100)
{
zk=zk+1;
}
else
zk=0;
}
/*方波占空比减小*/
void key6(void)
{
if(zk >= 1)
{
zk=zk-1;
}
else
zk=0;
}
/*计算显示数字*/
void jisuan(void)
{
TR0 = 0; //关闭定时器
f = 1000 * qw + 100 * bw + 10 * sw + gw;
t = 1000000 / f;
th = -t / 256;
tl = -t % 256;
qw = f / 1000;
f = f % 1000;
bw = f / 100;
f = f % 100;
sw = f / 10;
gw = f % 10;
zkgw = zk % 10;
zksw = zk / 10;
TR0 = 1;
}
/*显示*/
void display (void)
{
P3 = 0xef;
P2 = number_tab[qw];
for(i = 0; i <= 60; i++);
P3 = 0xdf;
P2 = number_tab[bw];
for(i = 0; i <= 60; i++);
P3 = 0xbf;
P2 = number_tab[sw];
for(i = 0; i <= 60; i++);
P3 = 0x7f;
P2 = number_tab[gw];
for(i = 0; i <= 60; i++);
P3 = 0xfd;
P2 = number_tab[zkgw];
for(i = 0; i <= 60; i++);
P3 = 0xfe;
P2 = number_tab[zksw];
for(i = 0; i <= 60; i++);
}
/*键盘扫描*/
void judge(void)
{
unsigned char X,Y,Z;
P1 = 0xff;
P1 = 0x0f; //先对 P1 置数行扫描
if(P1 != 0x0f) //判断是否有键按下
{
delay10ms(); //延时,软件去干扰
if(P1 != 0x0f) //确认按键按下X = P1;
{
X = P1; //保存行扫描时有键按下时状态
P1 = 0xf0; //列扫描
Y = P1; //保存列扫描时有键按下时状态
Z = X | Y; //取出键值
switch ( Z ) //判断键值(哪一个键按下)
{
case 0x7e: key1(); break; //对键值赋值
case 0xbe: key2(); break;
case 0xed: key3(); break;
case 0xdd: key4(); break;
case 0xde: key5(); break;
case 0xee: key6(); break;
}
}
}
}
void main(void) //主函数
{
int n;
for(n = 0; n < 500; n++)
{
chushihua();
}
TMOD = 0x01;
TR0 = 1;
th0 = -t / 256;
tl0 = -t %256;
th1 = -t / 256;
tl1 = -t %256;
TR0=1;
TR1=1;
FREQ0=0;
FREQ1=0;
ET0 = 1;
EA = 1;
P0_0=1;
for(; ;)
while(1)
{
jisuan();
for(i = 0; i<= 50; i++);
display();
judge();
}
}
/*定时计数器0 的中断服务子程序*/
void timer0(void) interrupt 1 using 1
{
th0 = -t / 256; //装计数初值
tl0 = -t %256;
FREQ0=FREQ0+1;
if(FREQ0==1000*t) //t秒定时判断
{
P0_0=1; //信号输出端口取反
FREQ0=0;
TR1=1; //开始 T1的计时
}
}
/*定
} 时计数器1 的中断服务子程序*/
void timer1(void) interrupt 2 using 1
{
th0 = -t / 256; //装计数初值
tl0 = -t %256;
FREQ1=FREQ1+1;
if(FREQ1==zk*t) //高电平定时时间判断
{
P0_0=0; //信号输出端口取反
FREQ1=0;
TR1=0; //停止T1的计时
}
看看,学习下。