025c833b2bb372e8
获得 0 次赞
帮助过1人
void delay() { unsigned char i = TH0+1; if(i > 0xFE) { i = 0xDC; } while(i != TH0); }
做的秒表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); //}