8051系列单片机有两个定时器:T0和T1,分别称为定时器和定时器T1,这两个定时器都是16位的定时器/计数器;8052系列单片机增加了第三个定时器/计数器T2;它们都有定时或事件计数功能,常用于时间控制、延时、对外部时间计数和检测等场合。
8051单片机的两个定时器T0和T1分别都由两个特殊功能寄存器组成;T0由特殊功能寄存器TH0和TL0构成,而T1则是由TH1和TL1构成。
TF0是定时/计数器0的溢出指示,平时为0,溢出时为1.
TR0是定时/计数器0的运行控制位,只有当TR0置1时,定时/计数器0才会工作。TF0响应中断程序后,该标志位自动清零,如果不用中断则需要手动清零。
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit we = P2^7;
sbit du = P2^6;
uchar counter,time_counter,gg;
uchar code leddata[] = { //数码管显示数字数组 (这是共阴极的数码管表达方式)
0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x76,0x38,0x37,0x3E,0x73,0x5C,0x40,0x00
};
void delay(int z) { //设置延时函数
int x ,y;
for(x=z;x>0;x--)
for(y=114;y>0;y--) ;
}
void display(uchar i,uchar gg) { //用i来代替 time_counter
uchar shi,ge; //定义个位和十位 (其实用uchar和char都可以,这是我认为的)
shi = i/10; //求模 十位
ge = i%10; //求余 个位
P0 = 0xff; //1111 1111
we = 1; //设置位选
P0=0xbf;//1011 1111点亮第七位数码管
we = 0;
du = 1; //设置段选
P0=leddata[shi]; //设置第七位数码管作为十位数的摆放位置
du=0;
delay(1); //肉眼分辨不出来(因为速度太快) 所以会同时数码管会同时显示)
P0 = 0xff;
we = 1;
P0 = 0x7f; //0111 1111 点亮第八位数码管
we = 0;
du = 1;
P0 = leddata[ge];
du = 0;
delay(1);
P0 = 0xff;
we = 1;
P0 = 0xdf; //1101 1111 点亮第六位数码管 作为分钟的摆放位置
we = 0;
du = 1;
P0 = leddata[gg]|0X80; //点亮第六位的小数点位置!!!
du = 0;
delay(1);
}
void main(){
TMOD = 0x01;
TR0 = 1;
TH0 = (65536-46080)/256; //50ms
TL0 = (65536-46080)%256;
while(1) {
if(TF0 == 1){
TF0 = 0;
TH0 = (65536-46080)/256; //50ms
TL0 = (65536-46080)%256;
counter++;
}
if(counter == 20){ //如果时间达到50ms*20=1000ms=1s的时候则计数清零
counter = 0;
time_counter++;
}
if(time_counter == 60) {
time_counter = 0;
gg++; //若达到了一分钟 则gg++ (依次循环下去)
}
display(time_counter,gg); //在调用display这个函数
}
}
文章来源:https://www.toymoban.com/news/detail-517651.html
ps:如果不清楚46080怎么来 可以参考:http://t.csdn.cn/kAgd8文章来源地址https://www.toymoban.com/news/detail-517651.html
到了这里,关于四位数码管显示计时分钟和秒(单片机代码)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!