普中开源电子分享网

 找回密码
 立即注册
搜索
查看: 1557|回复: 0

求解答

[复制链接]

2

主题

2

帖子

8

积分

新手上路

Rank: 1

积分
8
发表于 2022-4-29 10:13:54 | 显示全部楼层 |阅读模式
在做一个两位数码管显示的秒表,使用中断方式能正确的进行显示,在使用查询方式时,十位数不显示,不知道什么原因了,求各路大佬给解答一下啊。下面是程序:

/功能:00~99秒的简易秒表设计
#include <reg51.h>  

//函数名:delay1s()
//函数功能:T1在工作方式1的1s延时函数,采用查询方式实现
//形式参数:无
//返回值:无
void delay1s()
{  
   unsigned char i;
         for(i=0;i<20;i++)
         {
                 TH1=(65536-50000)/256;   //设置T1计数初值高8位,定时时间50ms
     TL1=(65536-50000)%256;   //设置T1计数初值低8位
           ET1=0;
                 TR1=1;//启动T1
                 while(!TF1);//查询计数是否溢出,即定时50ms时间到,TF1=1
                 TF1=0;//50ms定时时间到,将T1溢出标志位TF1清零
         }
}

//函数名:disp
//函数功能:将i的值显示在两个动态连接的数码管上
//形式参数:i,取值范围0~99
//返回值:无
void disp(unsigned char i)
{
  unsigned char led[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
  //定义0~9显示码,共阴极数码管
        unsigned char j;
  P2=0xff;
        P0=led[i/10];   //i的高位显示码送到段控制口
        P2=0x08;   //高位数码管位选
        for(j=0;j<100;j++); //延时
        P2=0xff;
        P0=led[i%10];   //i的低位显示码送到段控制口
        P2=0x04;      //低位数码管位选
        for(j=0;j<100;j++);        //延时
}
void main()                        //主函数
{
   unsigned char miao=0; // 定义秒计数器
         TMOD=0x10;                            //设置工作方式1
   TH1=(65536-50000)/256;   //设置T1计数初值高8位,定时时间50ms
   TL1=(65536-50000)%256;   //设置T1计数初值低8位
  ET1=0;
        TR1=1;                      //启动T1开始计数  
while(1)
         {
     disp(miao);               //显示秒计数器值
                 delay1s();    //调用延时函数
                 miao++;  //秒计数器加1
                 if(miao==100)miao=0; //秒计数器满,则从0开始计数
      }
}




//功能:00~99秒的简易秒表设计

#include <reg51.h>
//全局变量定义
unsigned char count=0;      //对50ms定时时间进行计数
unsigned char miao=0;       //秒计数器
//函数名:timer_1()
//函数功能:定时器T1中断函数,T1在工作方式1下没50ms产生中断,执行该中断函数
//形式参数:无
//返回值:无
void timer_1() interrupt 3 //T1的中断类型号为3
{  
   TH1=(65536-50000)/256;   //重新设置T1计数初值高8位
   TL1=(65536-50000)%256;   //重新设置T1计数初值低8位
   count++;                    //50ms计数器加1
   if(count==20)              //1s时间到
   {
      count=0;                 //50ms计数器清0
      miao++;                  //秒计数器加1
      if(miao==100)miao=0;  //miao计数到100,则从0开始计数
}
}

//函数名:disp
//函数功能:将i的值显示在两个动态连接的数码管上
//形式参数:i,取值范围0~99
//返回值:无
void disp(unsigned char i)
{
  unsigned char led[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
  //定义0~9显示码,共阴极数码管
        unsigned char j;
  P0=0xff;
                P2=0x08;   //高位数码管位选
        P0=led[i/10];   //i的高位显示码送到段控制口
        for(j=0;j<200;j++); //延时
        P0=0xff;
        P2=0x04;      //低位数码管位选
        P0=led[i%10];   //i的低位显示码送到段控制口
        for(j=0;j<200;j++);        //延时
}
void main()   //主函数
{
   TMOD=0x10;              //设置T1工作方式1
   TH1=(65536-50000)/256;   //设置T1计数初值高8位
   TL1=(65536-50000)%256;   //设置T1计数初值低8位
   ET1=1;                      //开放T1中断允许
   EA=1;                       //开放总中断允许
   TR1=1;                      //启动T1开始计数  
while(1){
    disp(miao);               //显示秒计数器值
      }
}

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

站长推荐上一条 /1 下一条

Archiver|手机版|小黑屋|普中开源电子分享网 粤ICP备16123577号-2

GMT+8, 2024-4-28 22:47 , Processed in 0.410868 second(s), 30 queries .

Powered by 论坛搭建 X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表