微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 不知道哪里出问题了

不知道哪里出问题了

时间: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的计时
}

看看,学习下。

上一篇:电子万年历问题
下一篇:流水灯有问题

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top