51单片机数字钟的实现
生活随笔
收集整理的這篇文章主要介紹了
51单片机数字钟的实现
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
作業
用51單片機完成一個數字鐘的計時及校時功能。
1、設置8個數碼管的顯示緩沖區為DISPBUFF[8],并初始化為02,02,-,04,08,-,03,06.
2、定時器0每隔5ms刷新一次數碼管顯示緩沖區,并顯示時間(中斷來做)
3、定時器1負責精確定時,計時1s,每隔50ms中斷一次,中斷20次即為1s
4、用圖中兩個按鍵實現時分和小時的校時功能,MODE按鍵實現小時校準、分校準及正常顯示的3個模式切換,ADD按鍵實現對應時間加一,按鍵采用外部中斷方式實現功能。在校準小時及分鐘的時候,對應兩位數碼管的小數點必須亮,正常模式時所有小數點全滅.
5、秒脈沖由51單片機的定時器來提供。
按要求上交實驗報告(校準小時、分鐘及正常模式的對應Proteus仿真截圖及開發板下載圖一定要)。
思路
-
定義一個數碼管顯示模塊,起名為dis_seg7()
-
定時器0每隔5ms刷新一次數碼管顯示緩沖區,并顯示時間(中斷來做)
-
定時器1負責精確定時,計時1s,每隔50ms中斷一次,中斷20次即為1s
-
外部中斷0實現模式切換
- 正常顯示,stat = 0;
- 校分,stat = 1;
- 校時,stat = 2;
- 注意:校時,校分時要停止定時器T1
-
外部中斷1實現hour/min自增
- 先檢測一下stat
- stat =1,min_increase
- stat = 2, hour_increase
代碼
#include<reg52.h> //共陽極數碼管 unsigned char code segCodeTable[12] = {0xc0,0xf9,0xa4,0xb0, 0x99,0x92,0x82,0xf8, 0x80,0x90,0xbf,0x7f}; //0-9,-,., //帶小數點的共陽極數碼管段碼表 unsigned char code segCodeTable1[10] = {0x40,0x79,0x24,0x30, 0x19,0x12,0x02,0x78, 0x00,0x10};//0-9 //位碼表 unsigned char code posCodeTable[8] = { 0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01}; //數碼管顯示緩沖區 unsigned char LEDBuffer[8] = {0x82,0xb0,0xbf,0x80,0x99,0xbf,0xa4,0xa4,}; void display_seg7(); void TIMER0_INIT(); void TIMER1_INIT(); void EXT_INTR0_INIT(); void EXT_INTR1_INIT(); unsigned char sec = 36,min = 48,hour = 22; //定義一個變量,記錄狀態 unsigned char stat = 0; void main() {//定時器0初始化配置TIMER0_INIT();//定時器1初始化配置TIMER1_INIT();//外部中斷0初始化EXT_INTR0_INIT();//外部中斷1初始化EXT_INTR1_INIT();EA = 1;//開啟總中斷while(1); }//定時器1初始化配置 void TIMER1_INIT() {TMOD = (TMOD & 0x0f) | 0x10;PT1 = 1;ET1 = 1;TH1 = 0x3c;TL1 = 0xb0;TR1 = 1; }//定時器1負責精確定時,計時1s,每隔50ms中斷一次,中斷20次即為1s void TIMER1_INTR() interrupt 3 {static unsigned char cnt = 0;TH1 = 0x3c;TL1 = 0xb0;cnt++;if(cnt >= 20){cnt = 0;sec++;if(sec == 60){sec = 0;min++;if(min == 60){min = 0;hour++;if(hour == 24){hour = 0;}}}} }//定時器0初始化配置 void TIMER0_INIT() {//定時器0初始化配置TMOD = (TMOD & 0xf0) | 0x01;ET0 = 1;//使能定時器0中斷PT0 = 0;//設置中斷優先級TL0 = 0x78; //設置定時初值TH0 = 0xEC; //設置定時初值TR0 = 1; }//定時器0每隔5ms刷新一次數碼管顯示緩沖區 void TIMER0_INTR() interrupt 1 {TL0 = 0x78; //設置定時初值TH0 = 0xEC; //設置定時初值if(stat == 0) //正常顯示{LEDBuffer[0] = segCodeTable[sec%10]; //更新數碼管顯示緩沖區LEDBuffer[1] = segCodeTable[sec/10];LEDBuffer[3] = segCodeTable[min%10];LEDBuffer[4] = segCodeTable[min/10];LEDBuffer[6] = segCodeTable[hour%10];LEDBuffer[7] = segCodeTable[hour/10];}else if(stat == 1) //校分{LEDBuffer[0] = segCodeTable[sec%10]; //更新數碼管顯示緩沖區LEDBuffer[1] = segCodeTable[sec/10];LEDBuffer[3] = segCodeTable1[min%10];LEDBuffer[4] = segCodeTable1[min/10];LEDBuffer[6] = segCodeTable[hour%10];LEDBuffer[7] = segCodeTable[hour/10];}else if(stat == 2) //校時{LEDBuffer[0] = segCodeTable[sec%10]; //更新數碼管顯示緩沖區LEDBuffer[1] = segCodeTable[sec/10];LEDBuffer[3] = segCodeTable[min%10];LEDBuffer[4] = segCodeTable[min/10];LEDBuffer[6] = segCodeTable1[hour%10];LEDBuffer[7] = segCodeTable1[hour/10];}display_seg7(); }//數碼管顯示模塊 void display_seg7() {unsigned char j = 0,i = 0;for(i = 0;i<8;i++){P2 = LEDBuffer[i]; //段碼P1 = posCodeTable[i]; //位碼for(j = 0;j<200;j++); //延時P2 = 0xff; //清除余暉} }//外部中斷0初始化 void EXT_INTR0_INIT() {EX0 = 1;PX0 = 1; //設置中斷優先級IT0 = 1; //脈沖下降沿中斷}//外部中斷0 void intr0() interrupt 0 { stat++;if(stat == 3) //正常顯示{stat = 0;TR1 = 1;//定時器T1開啟}if(stat == 1)//校分{TR1 = 0;//定時器T1停止} if(stat == 2)//校時{TR1 = 0;//定時器T1停止} }//外部中斷1初始化 void EXT_INTR1_INIT() {EX1 = 1;PX1 = 1; //設置中斷優先級IT1 = 1; //脈沖下降沿中斷 }//外部中斷1 void intr1() interrupt 2 {if(stat == 1) //校分{min++;if(min == 60){min = 0;hour++;if(hour == 24){hour = 0;}}}if(stat == 2) //校時{hour++;if(hour == 24){hour = 0;}} }運行結果
0.初始化
1.正常顯示
2.校分
- 先按下按鍵mode切換模式
- 再按下按鍵add,實現分加一
3.校時
- 先按下按鍵mode切換模式
- 再按下按鍵add,實現時加一
github下載鏈接
總結
以上是生活随笔為你收集整理的51单片机数字钟的实现的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mybatis-plus 查询,删除
- 下一篇: word文件批量转换为txt文档