基於51的數碼管電子時鐘(顯示時、分、秒)——定時器

視頻效果:

基於51單片機的數碼管時鐘設計

Proteus 仿真電路圖:

在這裏插入圖片描述

C51代碼:

#include<reg51.h>

typedef unsigned char uchar;
typedef unsigned int uint;

uchar code num[10]={0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90};  // 0~9字碼

uchar miao=0, fen=0, shi=0;  //進位標誌位

uint i=0;  //計時

uchar miao_L, miao_H, fen_L, fen_H, shi_L, shi_H;  //時、分、秒的個位(xxx_L)和十位(xxx_H)  

void delay(uint x){  //延時函數 
	while(x--);
}

void T0_init(){                     //定時器 0 初始化 
	TMOD = 0x01; //工作方式 1
	TH0 = 0x3c;  //高八位賦初值    65536-50000=15536 = 3cb0H
	TL0 = 0xb0;	 //底八位賦初值
	EA = 1;	     //開總中斷
	ET0 = 1;     //開 T0 中斷
	TR0 = 1;     //啓動 T0
}

void display(){  //顯示
	
	P2 = 0x20;  //秒與分間隔線
	P0 = 0xbf;	
	delay(500);
		
	P2 = 0x04;  //分與時間隔線
	P0 = 0xbf;
	delay(500);


	P2 = 0x80;  //數碼管位選 1000 0000
	P0 = num[miao_L];  //秒個位
	delay(500);

	P2 = 0x40;	//數碼管位選 0100 0000
	P0 = num[miao_H];  //秒十位
	delay(500);

	P2 = 0x10;	//數碼管位選 0001 0000
	P0 = num[fen_L];  //分個位
	delay(500);

	P2 = 0x08;	//數碼管位選 0000 1000
	P0 = num[fen_H];  //分十位
	delay(500);

	P2 = 0x02;	//數碼管位選 0000 0010
	P0 = num[shi_L];  //分個位
	delay(500);
	
	P2 = 0x01;	//數碼管位選 0000 0001
	P0 = num[shi_H];  //分十位
	delay(500);

}

void main(){

	T0_init();  //定時器初始化

	while(1){

		display();  //顯示		
   }

}

void timer0_int() interrupt 1{  //中斷服務函數
 	 
	 i++;

	 if(i == 20){
	 	i = 0;  //滿一秒清零
	 	miao++;	//i = 100 爲一,秒標誌位加 1

		if(miao == 60){
			miao = 0;  //滿一分清零
			fen++;

			if(fen == 60){
				fen = 0;  //滿一時清零
				shi++;

				if(shi == 24){
					shi = 0;  //24小時制
					fen = 0;
					miao = 0;
				}
			}
		}

		miao_L = miao%10;  //秒個位
		miao_H = miao/10;  //秒十位

		fen_L = fen%10;  //分個位
		fen_H = fen/10;  //分十位

		shi_L = shi%10;  //時個位
		shi_H = shi/10;  //時十位

	 }
 }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章