C51实现电子时钟
由于期末考試復習太緊張,通信原理真的太難了,周六不考六級,閑來無事想起來自己大一寒假學的51單片機放了好久沒有動了,就一時興起想寫點51的程序,就寫了這個電子鐘。寫的還不是很全,之后考完試會繼續更新。
所用開發板:天翔電子 TX-1C
原理圖:
?代碼實現:
#include <REG52.H> #define uint unsigned int #define uchar unsigned char uchar code table[] = {0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f}; //數碼管位選 uchar code table2[] = {0xbf, 0x86, 0xdb, 0xcf, 0xe6, 0xed, 0xfd, 0x87, 0xff, 0xef}; uchar code weixuan[] = {0xdf, 0xef, 0xf7, 0xfb, 0xfd, 0xfe}; //1,2,3,4,5,6個數碼管的位選 uint sec = 0; //秒 uint n = 0; //計數 uint sec0 = 0; uint sec1 = 0; uint min0 = 0; uint min1 = 0; uint hour0 = 0; uint hour1 = 0; // uint date[6]={0,0,0,0,0,0};//定義一個有6個地址的數組,分別存時、分、秒的各位和十位 sbit dula = P2 ^ 6; //段選口 sbit wela = P2 ^ 7; //位選口 sbit S2 = P3 ^ 4; sbit S3 = P3 ^ 5; sbit S4 = P3 ^ 6; sbit S5 = P3 ^ 7; uint flag = 0; uint num = 0; void delay(uint z) //延時函數 {uint x, y;for (x = z; x > 0; x--)for (y = 90; y > 0; y--); }void write_address(uchar address) //打開位選,選擇數碼管 {wela = 1; //打開位選P0 = address; //傳送地址數據wela = 0; //關閉位選 }void write_date(uint n) //打開段選,寫數據 {dula = 1;P0 = table[n];dula = 0; } void write_date1(uint n) //打開段選寫數據 {dula = 1;P0 = table2[n];dula = 0; } void display(uint sec0, uint sec1, uint min0, uint min1, uint hour0, uint hour1) //數碼管的動態顯示 {write_date(sec0); //送秒的個位P0 = 0xff; //消影write_address(0xdf); //write_address(0xfe);//右邊第一個數碼管write_address(0xdf)delay(1);write_date(sec1); //送秒的十位P0 = 0xff; //消影write_address(0xef); //write_address(0xfd);//右邊第一個數碼管write_address(0xef)delay(1);write_date1(min0); //送分的個位P0 = 0xff; //消影write_address(0xf7); //write_address(0xfb);//右邊第一個數碼管write_address(0xf7)delay(1);write_date(min1); //送分的十位P0 = 0xff; //消影write_address(0xfb); //write_address(0xf7);//右邊第一個數碼管write_address(0xfb)delay(1);write_date1(hour0); //送時的個位P0 = 0xff; //消影write_address(0xfd); //write_address(0xef);//右邊第一個數碼管write_address(0xfd)delay(1);write_date(hour1); //送時的十位P0 = 0xff; //消影write_address(0xfe); //write_address(0xdf);//右邊第一個數碼管write_address(0xfe)delay(1); } void time_init() //定時器初始函數 {TMOD = 0X01; //定時器工作在方式2TH0 = (65535 - 45872) / 256;TL0 = (65535 - 45872) % 256;EA = 1; //開總中斷ET0 = 1; //定時器0中斷TR0 = 1; //開定時器0 } void Sscan() {if (S2 == 0){delay(10);if (S2 == 0){// min0=0;min0++;if (min0 > 9){min0 = 0;}while (!S2);}}if (S3 == 0){delay(10);if (S3 == 0){// min1=0;min1++;if (min1 == 6){min1 = 0;}while (!S3);}}if (S4 == 0){delay(10);if (S4 == 0){// hour0=0;hour0++;if (hour1 == 2 && hour0 == 4){hour0 = 0;}else if ((hour1 == 0 || hour1 == 1) && hour0 > 9){hour0 = 0;}while (!S4);}}if (S5 == 0){delay(10);if (S5 == 0){hour1++;if (hour1 >= 3){hour1 = 0;}while (!S5);}} } void main() {dula = 0;wela = 0;time_init();while (1){Sscan();display(sec0, sec1, min0, min1, hour0, hour1);} } void timer() interrupt 1 //定時器0中斷程序 {TH0 = (65535 - 45872) / 256;TL0 = (65535 - 45872) % 256;n++;if (n == 20) //n是50毫秒{n = 0;sec++;if (sec == 60) //一分鐘{sec = 0;min0++;if (min0 == 10) //一小時{min0 = 0;min1++;if (min1 == 6){min1 = 0;if (hour1 == 1 || hour1 == 0){hour0++;if (hour0 == 10){hour0 = 0;hour1++;}}else if (hour1 == 2){hour0++;if (hour0 >= 4){hour0 = 0;hour1 = 0;min1 = 0;min0 = 0;}}}}}sec0 = sec % 10;sec1 = sec / 10;} }代碼說明:
由于我這邊電子管只有6個,兩個給秒,兩個給分鐘,兩個給小時,沒有位置給“:”,所以我使用了“."也就是dp,所以會有兩個數組,table是存沒有點的數,table2是存有點的數字
現在實現的功能:
 1、定時器0工作方式1計數
 2、S2鍵調整分鐘個位
 3、S3鍵調整分鐘十位
 4、S4鍵調整時針個位
 5、S5鍵跳幀時針十位
 6、23.59.59后加1自動規整到0.0.0
未來想加上去的功能:
 1、調整時秒針置零,調整結束后秒針開始計時
 2、整點蜂鳴器響(可選擇響或者不響)
 3、鬧鐘功能
 4、掉電保護(掉電后從斷電的時間開始計時)
總結
                            
                        - 上一篇: 木材加工(LintCode)
 - 下一篇: 蛮力算法求解最近对