四位数码管显示计时分钟和秒(单片机代码)

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这个函数
	}

	
}

 

ps:如果不清楚46080怎么来 可以参考:http://t.csdn.cn/kAgd8

  • 2
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个基于C51单片机四位数码管计时器的示例程序: ```c #include <reg52.h> #define uchar unsigned char #define uint unsigned int sbit D1 = P2^0; // 数码管第一位 sbit D2 = P2^1; // 数码管第二位 sbit D3 = P2^2; // 数码管第三位 sbit D4 = P2^3; // 数码管四位 uchar code table[] = { // 数码管显示0-9的编码 0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x90 }; uchar mon = 6, mon0 = 0, day = 26, day0 = 0, hour = 23, hour0 = 0, min = 15, min0 = 0, sec = 0, sec0 = 10, temp0 = 0; void delay(uint t) { // 延时函数 uint i, j; for (i = t; i > 0; i--) for (j = 110; j > 0; j--); } void display() { // 数码管显示函数 D1 = 1; D2 = 1; D3 = 1; D4 = 1; // 全部关闭 P0 = table[sec0 % 10]; // 第一位显示个位 D1 = 0; delay(5); D1 = 1; // 打开并延时 P0 = table[sec0 / 10]; // 第二位显示十位 D2 = 0; delay(5); D2 = 1; P0 = table[min0 % 10]; // 第三位显示分个位 D3 = 0; delay(5); D3 = 1; P0 = table[min0 / 10]; // 第四位显示分十位 D4 = 0; delay(5); D4 = 1; } void main() { while (1) { display(); // 显示当前时间 delay(1000); // 延时1 sec0++; // 数加1 if (sec0 == 60) { // 如果数达到60 sec0 = 0; // 数清零 min0++; // 分钟数加1 if (min0 == 60) { // 如果分钟数达到60 min0 = 0; // 分钟数清零 hour0++; // 小时数加1 if (hour0 == 24) { // 如果小时数达到24 hour0 = 0; // 小时数清零 day0++; // 天数加1 if (day0 == 32) { // 如果天数达到32 day0 = 1; // 天数重置为1 mon0++; // 月份加1 if (mon0 == 13) { // 如果月份达到13 mon0 = 1; // 月份重置为1 } } } } } if (sec0 == sec && min0 == min && hour0 == hour && day0 == day && mon0 == mon) { // 如果计时结束 for (temp0 = 0; temp0 < 10; temp0++) { // 蜂鸣器响10次 P1 = 0x01; // 打开蜂鸣器 delay(100); // 延时0.1 P1 = 0x00; // 关闭蜂鸣器 delay(100); // 延时0.1 } } } } ``` 该程序通过循环计时并在数码管上显示时间。当计时结束时,蜂鸣器会响10次。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值