微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 新人求助,单片机课程的问题

新人求助,单片机课程的问题

时间:10-02 整理:3721RD 点击:
小弟的单片机课程中计时器,数码管显示中2,5,6这三个数字显示出问题啦,求大神帮助!




程序……………………

#include<reg51.h>
#include<intrins.h>           //包含库文件
sbit smg1=P3^0;                   //定义第一位数码管
sbit smg2=P3^1;                   //定义第二位数码管
sbit smg3=P3^2;                   //定义第三位数码管
sbit smg4=P3^3;                   //定义第四位数码管
sbit zjs=P2^0;                   //定义正计时按键
sbit djs=P2^1;                   //定义倒计时按键
sbit ks=P2^2;                   //定义开始按键
sbit zt=P2^3;                   //定义暂停按键
sbit ql=P2^4;                   //定义清零按键
sbit spk=P2^5;                   //定义蜂鸣器
int js=0,djs0=0,djs1=0,flag=0;                                            //临时变量
int table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40};          //共阴极数码管段值
int table1[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef,0xf7};          //共阴极数码管带小数点的段值
/*****************************************************/
//以下是函数声明
void pzjs();
void pdjs();
/*****************************************************/
/*             函数名:delayms                                             */
/*           功能:产生毫秒级延时                                         */
/*****************************************************/
void delayms(int x)
{
char i;
while(x--)
{
  for(i=150;i>0;i--);
}
}
/*****************************************************/
/*             函数名:Timer0_init()                                  */
/*             功能:定时器0初始化                                         */
/*****************************************************/
void Timer0_init()
{
      js=0;
          TMOD=0x01;                  //定义定时器0工作模式       
      TH0=0x4c;                        //赋初值高位
          TL0=0x00;                        //赋初值低位
      //TR0=1;                        //启动定时器
          ET0=1;                        //开中断
          EA=1;                                //开全局中断
}
/*****************************************************/
/*        函数名:timer0() interrupt 1 using 1             */
/*             功能:定时器0中断服务函数                     */
/*****************************************************/
void timer0() interrupt 1 using 1       
{
            TF0=0;
                 TH0=0xf3;
                TL0=0xff;                                      //重新赋高地位初值
                js++;
                if(js==3)
                  {
                    js=0;
                        if(flag==0)                                                 //标志位flag来判断是正计时还是倒计时 flag=0表示正计时 flag=1表示倒计时
                         {
                            if(djs0>=99)                                  //如果djs0大于99
                                   {
                                     djs0=0;                                 //djs0清零
                                         if(djs1>=99) djs1=0;         //如果djs1大于99 则djs1清零
                                         else djs1++;                         //否则 djs1加一
                                   }
                                else djs0++;                                 //否则 djs0加一
                            }
                           if(flag==1)                                                 //标志位flag来判断是正计时还是倒计时 flag=0表示正计时 flag=1表示倒计时
                         {
                            if(djs0<=0)                                  //如果djs0小于0
                                   {
                                     djs0=99;                                 //djs0重新赋值99
                                     if(djs1<=0) djs1=99;         //如果djs1小于0 则djs1赋值99
                                         else djs1--;                         //否则 djs0减一
                                   }
                                else djs0--;                                 //否则 djs0减一
                            }
                   }
}
/*****************************************************/
/*                 函数名:djsxs()                     */
/*                功能:数码管动态显示                       */
/*****************************************************/
void  djsxs()
{        int b1,b2,b3,b4;
        b1=djs1/10;                 //将倒计时时间的高位赋予b1
        b2=djs1%10;                 //将倒计时时间的低位赋予b2
        b3=djs0/10;                 //将倒计时时间的高位赋予b1
        b4=djs0%10;                 //将倒计时时间的低位赋予b2
        P0=table[b1];
    smg1=0;
    delayms(3);
    smg1=1;                         //显示b1
        P0=table1[b2];
        smg2=0;
        delayms(3);
        smg2=1;                        //显示b2
        P0=table[b3];
    smg3=0;
    delayms(3);
    smg3=1;                         //显示b1
        P0=table[b4];
        smg4=0;
        delayms(3);
        smg4=1;                        //显示b2
}

/*****************************************************/
/*                 函数名:pzjs()                         */
/*                 功能: 进入正计时                                 */
/*****************************************************/
void pzjs()
{
flag=0;                                                                                           //标志位置0
djs0=0;                                                                                           //djs0清零
djs1=0;                                                                                           //djs1清零
while(1)
{
   djsxs();                                                                                   //显示函数
   if(djs1==95) spk=0;                                                           //如果djs1等于95时 蜂鸣器开始报警
   if(djs1==99) spk=1;                                                           //如果djs1等于99时 蜂鸣器结束报警
   if(ks==0)                                                                           //开始按键按下
                   {
                          delayms(3);
                          if(ks==0)                                                           //延时去除按键抖动,重新判断按键是否安下
                                 {       
                                           while(!ks);                                   //松开按键后向下执行
                                           TR0=1;                                           //启动定时器
                                         }
                        }
    if(zt==0)                                                                           //暂停按键按下
                   {
                          delayms(3);
                          if(zt==0)                                                           //延时去除按键抖动,重新判断按键是否安下
                                 {       
                                           while(!zt);                                   //松开按键后向下执行
                                           TR0=0;                                           //停止定时器
                                         }
                        }
    if(ql==0)                                                                           //清零按键按下
                   {
                          delayms(3);
                          if(ql==0)                                                          //延时去除按键抖动,重新判断按键是否安下
                                 {       
                                           while(!ql);                                  //松开按键后向下执行
                                           TR0=0;                                          //停止定时器
                                           djs0=0;                                          //djs0清零
                                           djs1=0;                                          //djs1清零
                                         }
                        }
          if(djs==0)                                                                  //倒计时按键按下
                   {
                          delayms(3);                                                  //延时去除按键抖动,重新判断按键是否安下
                          if(djs==0)
                                 {       
                                           while(!djs);                                  //松开按键后向下执行
                                           TR0=0;                                          //停止定时器
                                           pdjs();                                          //进入倒计时函数
                                         }
                        }
}
}
/*****************************************************/
/*                 函数名:pdjs()                         */
/*                 功能: 进入倒计时                                 */
/*****************************************************/
void pdjs()
{
flag=1;                                                                                           //标志位置1
djs0=99;                                                                                   //djs0赋值99
djs1=99;                                                                                   //djs1赋值99
while(1)
{
   djsxs();                                                                                   //显示函数
   if(djs1==5) spk=0;                                                           //如果djs1等于5时 蜂鸣器开始报警
   if(djs1==0) spk=1;                                                           //如果djs1等于0时 蜂鸣器结束报警
   if(ks==0)                                                                           //开始按键按下
                   {
                          delayms(3);
                          if(ks==0)                                                           //延时去除按键抖动,重新判断按键是否安下
                                 {       
                                           while(!ks);                                   //松开按键后向下执行
                                           TR0=1;                                           //启动定时器
                                         }
                        }
    if(zt==0)                                                                           //暂停按键按下
                   {
                          delayms(3);
                          if(zt==0)                                                           //延时去除按键抖动,重新判断按键是否安下
                                 {       
                                           while(!zt);                                   //松开按键后向下执行
                                           TR0=0;                                           //停止定时器
                                         }
                        }
    if(ql==0)                                                                           //清零按键按下
                   {
                          delayms(3);
                          if(ql==0)                                                          //延时去除按键抖动,重新判断按键是否安下
                                 {       
                                           while(!ql);                                  //松开按键后向下执行
                                           TR0=0;                                          //停止定时器
                                           djs0=99;                                          //djs0赋值99
                                           djs1=99;                                          //djs1赋值99
                                         }
                        }
          if(zjs==0)                                                                  //倒计时按键按下
                   {
                          delayms(3);                                                  //延时去除按键抖动,重新判断按键是否安下
                          if(zjs==0)
                                 {       
                                           while(!zjs);                                  //松开按键后向下执行
                                           TR0=0;                                          //停止定时器
                                           pzjs();                                          //进入倒计时函数
                                         }
                        }
}
}
/*****************************************************/
/*                 函数名:main()                         */
/*                 功能: 主函数                                         */
/*****************************************************/
void main()
{
Timer0_init();                                                                  //定时器0初始化
while(1)
        {
                P0=0x40;
                P3=0x00;
                if(zjs==0)                                                                  //正计时按键按下
                         {
                                delayms(3);
                                if(zjs==0)                                          //延时去除按键抖动,重新判断按键是否安下
                                 {       
                                           while(!zjs);                                  //松开按键后向下执行
                                           pzjs();                                          //进入正计时函数
                                         }
                                  }
                if(djs==0)                                                                  //倒计时按键按下
                         {
                                delayms(3);
                                if(djs==0)                                          //延时去除按键抖动,重新判断按键是否安下
                                 {       
                                           while(!djs);                                  //松开按键后向下执行
                                           pdjs();                                          //进入倒计时函数
                                         }
                                  }
        }
}

#include<reg51.h>
#include<intrins.h>           //包含库文件
sbit smg1=P3^0;                   //定义第一位数码管
sbit smg2=P3^1;                   //定义第二位数码管
sbit smg3=P3^2;                   //定义第三位数码管
sbit smg4=P3^3;                   //定义第四位数码管
sbit zjs=P2^0;                   //定义正计时按键
sbit djs=P2^1;                   //定义倒计时按键
sbit ks=P2^2;                   //定义开始按键
sbit zt=P2^3;                   //定义暂停按键
sbit ql=P2^4;                   //定义清零按键
sbit spk=P2^5;                   //定义蜂鸣器
int js=0,djs0=0,djs1=0,flag=0;                                            //临时变量
int table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40};          //共阴极数码管段值
int table1[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef,0xf7};          //共阴极数码管带小数点的段值
/*****************************************************/
//以下是函数声明
void pzjs();
void pdjs();
/*****************************************************/
/*             函数名:delayms                                             */
/*           功能:产生毫秒级延时                                         */
/*****************************************************/
void delayms(int x)
{
char i;
while(x--)
{
  for(i=150;i>0;i--);
}
}
/*****************************************************/
/*             函数名:Timer0_init()                                  */
/*             功能:定时器0初始化                                         */
/*****************************************************/
void Timer0_init()
{
      js=0;
          TMOD=0x01;                  //定义定时器0工作模式       
      TH0=0x4c;                        //赋初值高位
          TL0=0x00;                        //赋初值低位
      //TR0=1;                        //启动定时器
          ET0=1;                        //开中断
          EA=1;                                //开全局中断
}
/*****************************************************/
/*        函数名:timer0() interrupt 1 using 1             */
/*             功能:定时器0中断服务函数                     */
/*****************************************************/
void timer0() interrupt 1 using 1       
{
            TF0=0;
                 TH0=0xf3;
                TL0=0xff;                                      //重新赋高地位初值
                js++;
                if(js==3)
                  {
                    js=0;
                        if(flag==0)                                                 //标志位flag来判断是正计时还是倒计时 flag=0表示正计时 flag=1表示倒计时
                         {
                            if(djs0>=99)                                  //如果djs0大于99
                                   {
                                     djs0=0;                                 //djs0清零
                                         if(djs1>=99) djs1=0;         //如果djs1大于99 则djs1清零
                                         else djs1++;                         //否则 djs1加一
                                   }
                                else djs0++;                                 //否则 djs0加一
                            }
                           if(flag==1)                                                 //标志位flag来判断是正计时还是倒计时 flag=0表示正计时 flag=1表示倒计时
                         {
                            if(djs0<=0)                                  //如果djs0小于0
                                   {
                                     djs0=99;                                 //djs0重新赋值99
                                     if(djs1<=0) djs1=99;         //如果djs1小于0 则djs1赋值99
                                         else djs1--;                         //否则 djs0减一
                                   }
                                else djs0--;                                 //否则 djs0减一
                            }
                   }
}
/*****************************************************/
/*                 函数名:djsxs()                     */
/*                功能:数码管动态显示                       */
/*****************************************************/
void  djsxs()
{        int b1,b2,b3,b4;
        b1=djs1/10;                 //将倒计时时间的高位赋予b1
        b2=djs1%10;                 //将倒计时时间的低位赋予b2
        b3=djs0/10;                 //将倒计时时间的高位赋予b1
        b4=djs0%10;                 //将倒计时时间的低位赋予b2
        P0=table[b1];
    smg1=0;
    delayms(3);
    smg1=1;                         //显示b1
        P0=table1[b2];
        smg2=0;
        delayms(3);
        smg2=1;                        //显示b2
        P0=table[b3];
    smg3=0;
    delayms(3);
    smg3=1;                         //显示b1
        P0=table[b4];
        smg4=0;
        delayms(3);
        smg4=1;                        //显示b2
}

/*****************************************************/
/*                 函数名:pzjs()                         */
/*                 功能: 进入正计时                                 */
/*****************************************************/
void pzjs()
{
flag=0;                                                                                           //标志位置0
djs0=0;                                                                                           //djs0清零
djs1=0;                                                                                           //djs1清零
while(1)
{
   djsxs();                                                                                   //显示函数
   if(djs1==95) spk=0;                                                           //如果djs1等于95时 蜂鸣器开始报警
   if(djs1==99) spk=1;                                                           //如果djs1等于99时 蜂鸣器结束报警
   if(ks==0)                                                                           //开始按键按下
                   {
                          delayms(3);
                          if(ks==0)                                                           //延时去除按键抖动,重新判断按键是否安下
                                 {       
                                           while(!ks);                                   //松开按键后向下执行
                                           TR0=1;                                           //启动定时器
                                         }
                        }
    if(zt==0)                                                                           //暂停按键按下
                   {
                          delayms(3);
                          if(zt==0)                                                           //延时去除按键抖动,重新判断按键是否安下
                                 {       
                                           while(!zt);                                   //松开按键后向下执行
                                           TR0=0;                                           //停止定时器
                                         }
                        }
    if(ql==0)                                                                           //清零按键按下
                   {
                          delayms(3);
                          if(ql==0)                                                          //延时去除按键抖动,重新判断按键是否安下
                                 {       
                                           while(!ql);                                  //松开按键后向下执行
                                           TR0=0;                                          //停止定时器
                                           djs0=0;                                          //djs0清零
                                           djs1=0;                                          //djs1清零
                                         }
                        }
          if(djs==0)                                                                  //倒计时按键按下
                   {
                          delayms(3);                                                  //延时去除按键抖动,重新判断按键是否安下
                          if(djs==0)
                                 {       
                                           while(!djs);                                  //松开按键后向下执行
                                           TR0=0;                                          //停止定时器
                                           pdjs();                                          //进入倒计时函数
                                         }
                        }
}
}
/*****************************************************/
/*                 函数名:pdjs()                         */
/*                 功能: 进入倒计时                                 */
/*****************************************************/
void pdjs()
{
flag=1;                                                                                           //标志位置1
djs0=99;                                                                                   //djs0赋值99
djs1=99;                                                                                   //djs1赋值99
while(1)
{
   djsxs();                                                                                   //显示函数
   if(djs1==5) spk=0;                                                           //如果djs1等于5时 蜂鸣器开始报警
   if(djs1==0) spk=1;                                                           //如果djs1等于0时 蜂鸣器结束报警
   if(ks==0)                                                                           //开始按键按下
                   {
         

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

网站地图

Top