头像-281634

025c833b2bb372e8

  • 河北省
  • 单片机 传感器/MEMS
  • 测试仪器及设备

个人成就

获得 0 次赞

帮助过1人

一个定时器做的秒表的延时函数,,,看不懂

void delay()     {          unsigned char i = TH0+1;      if(i > 0xFE)         {          i = 0xDC;         }     while(i != TH0);  }

为什么我用定时器做的秒表第一位一直显示0。

做的秒表0.000到9.999的,为什么第一位一直是0,不是毫秒那三位,毫秒那三位不用准确。是秒的那一位一直显示0,应该循环显示0到9的。#include<reg52.h>#define date P0     //用date代替P0unsigned char t=0;    //t为多少毫秒void display();     //声明数码管显示子函数void delay();     //声明延时子函数void main(){         TMOD = 0x01;    //方式1,为16位定时器         TH0 = 0xFC;     //对高8位和低8位分别赋初值,使一个周期为1ms         TL0 = 0x66;     //         EA = 1;      //打开总中断         ET0 = 1;     //打开定时器0中断         TR0 = 1;      //打开定时器0         while(1)            {                 display();     //进入数码管显示的子函数         }}void Timer() interrupt 1     //定义定时器,1为定时器中断0{     TL0 = 0x66;      //对低8位和高8位赋初值,使一个周期为1ms     TH0 = 0xFC;     //     TF0 = 0;     //定时器0溢出,用此语句清0     t++;      //t加1毫秒}/******************数码管*********************/unsigned char code c[]={0xC00xF90xA40xB00x990x920x820xF80x800x90  //定义一个数组显示0到9     0x880x830xC60xA10x860x8E0xFF};unsigned char code d[]={0x400x790x240x300x190x120x020x780x000x10};  //定义一个数组显示0到9并带着小数点               void display()     //数码管显示{     if(t > 9999)      //当t=10000时,也就是10秒时     {          t = 0;       //t重新为0     }     P2 = ~0x08;     //第一位     date = c[((t%1000)%100)%10];//第一位显示t的个位数     delay();        //延时     date = c[16];    //消隐     P2 = ~0x04;     //第二位     date = c[((t%1000)%100)/10];//第二位显示t的十位数     delay();     //延时     date = c[16];    //消隐     P2 = ~0x02;     //第三位     date = c[(t%1000)/100];  //第三位显示t的百位数     delay();     //延时     date = c[16];     //消隐     P2 = ~0x01;     //第四位     date = d[t/1000];   //第四位显示t的千位数     delay();     //延时     date = c[16];    //消隐}          void delay()     //延时{          unsigned char i = TH0+1; //     if(i > 0xFE)    //     {          i = 0xFC;    //     }     while(i != TH0);   //}