1585020856(1).jpg (34.82 KB, 下載次數: 31)
下載附件
2020-3-24 11:37 上傳
代碼:
- /*********************************************************************************************************************
- 程序名稱:8位數碼管時鐘程序
- 函數功能:在8位數碼管上顯示包含小時,分鐘,秒鐘的C語言程序
- 程序版本:V1.0
- 調試狀態:成功
- 調試時間:2014.10.10
- 定時器初值計算方法:【16進制】65535-[(晶振頻率/12)/(1秒/定時的時間)]
- **********************************************************************************************************************/
- #include<reg52.h>
- #include<absacc.h>
- #define uchar unsigned char
- #define uint unsigned int
- /*********************************************************************************************************************/
- //函數申明
- void data_deal(); //數據處理函數
- void delay(uchar timer);//延時函數
- void H_M_S_circle();//時鐘時分秒循環函數
- void display();//送顯示函數
- /*********************************************************************************************************************/
- unsigned char code table[]={
- 0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90
- // 0 1 2 3 4 5 6 7 8 9
- };
- /*********************************************************************************************************************/
- //全局變量申明
- uchar time_flag;
- uchar Hour=0,Min=0,second=0;
- uchar DispBuf[8]; //定義顯示緩沖區——待顯示的數據(由定時中斷程序自動掃描),全局變量
- /*********************************************************************************************************************/
- void main()
- {
- //啟動定時器
- TMOD |= 0x01; //選擇定時器的工作方式(00表示13位定時計數器,01表示16位定時計數器,10表示8位定時計數器,11停止工作)
- TH0 = 0xDC; //裝載定時器初值高八位(此初值表示定時器定時為10ms)
- TL0 = 0x00; //裝載定時器初值低八位(此初值表示定時器定時為10ms)
- EA = 1; //開啟總中斷
- ET0 = 1; //開啟定時器中斷允許位
- TR0 = 1; //開啟定時器中斷
- //時鐘顯示
- while(1)
- {
- data_deal();//調用數據處理函數,提取處理后的數據
- display(); //調用顯示函數,顯示處理好的數據
- }
- }
- /*********************************************************************************************************************
- 函數名稱:delay(uchar timer)
- 函數功能:延時
- **********************************************************************************************************************/
- void delay(uchar timer)
- {
- uchar i,j;
- for(i=0;i<114;i++)
- for(j=0;j<timer;j++)
- ;
- }
- /*********************************************************************************************************************
- 函數名稱:T1IN_time()
- 函數功能:利用定時器中斷開啟定時,并計算出1秒鐘
- **********************************************************************************************************************/
- void T1IN_time() interrupt 1 //(1表示中斷號,0表示外部中斷0,1表示定時器T0,2表示外部中斷1,3表示定時器T1)
- {
- uchar count;//申明定時器變量
- TH0 = 0xDC; //裝載定時器初值高八位(此初值表示定時器定時為10ms)
- TL0 = 0x00; //裝載定時器初值低八位(此初值表示定時器定時為10ms)
- count ++; //定時器變量自加1
- if(count == 100) //count自加100次,定時器運行100次初值的時間,即10ms *100 = 1s(1秒鐘)
- {
- count = 0; //count歸零,等待下一次定時
- time_flag = 1; //定時器標志位為1,啟動時鐘時分秒循環程序
- }
- }
- /*********************************************************************************************************************
- 函數名稱:H_M_S_circle()
- 函數功能:時分秒循環
- *************************************************************************************/
- void H_M_S_circle()
- {
- if(time_flag == 1)//當定時器標志位為1時,表示時間為1秒
- {
- time_flag = 0;//標志位歸零
- second++; //秒鐘自加1
- }
- if(second == 60) //當秒鐘自加1到60時
- {
- second = 0; //秒鐘歸零
- Min ++; //分鐘自加1
- }
- if(Min == 60) //當分鐘自加1到60時
- {
- Min = 0; //分鐘歸零
- Hour ++; //小時自加1
- }
- if(Hour == 24) //當小時自加1到24時
- {
- Hour = 0; //小時歸零
- Min = 0; //分鐘歸零
- second = 0; //秒鐘歸零
- }
- }
- /********************************************************************************
- 函數名稱:data_deal()
- 函數功能:對數碼管將要顯示的數據進行拆分
- **********************************************************************************/
- void data_deal()
- {
- H_M_S_circle(); //調用時鐘時分秒循環程序,取出時,分。秒的值
- DispBuf[7] = Hour /10; //小時十位
- DispBuf[6] = Hour %10; //小時個位
- DispBuf[5] = 8; //顯示“-”
- DispBuf[4] = Min /10; //分鐘十位
- DispBuf[3] = Min %10; //分鐘個位
- DispBuf[2] = 8; //顯示“-”
- DispBuf[1] = second /10; //秒鐘十位
- DispBuf[0] = second %10; //秒鐘個位
- }
- void display()
- {
- uchar i;
- code unsigned char com[] = {0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
- for(i=0;i<8;i++)
- {
- P0 =com[i]; //i=0表示數碼管的最低位
- P2 =table[DispBuf[i]];//DispBuf[i]表示拆分后的數據,i表示需要顯示的動態數據
- delay(1);
- } P0 = 0x00; //關閉所有數碼管顯示
- }
- /***************************************END********************************************/
復制代碼 |