一個簡單的四位數碼管的時鐘,可以調節、暫停、清零時間,斷電保存并且在設定的時間內有流水燈亮起。(附有程序和接線圖)
如果有哪里做得不好的還請大家多指教。
0.png (440.27 KB, 下載次數: 75)
下載附件
2017-6-8 16:26 上傳
0.png (527.29 KB, 下載次數: 53)
下載附件
2017-6-8 16:25 上傳
0.png (386.16 KB, 下載次數: 68)
下載附件
2017-6-8 16:26 上傳
單片機源程序如下:
- /*********************************************************************
- 簡易時鐘: 1. 四位數碼管顯示(分秒計時)。
- 2. 每到30~40秒時有流水燈亮起。
- 3. 可斷電保存
- 4. 按鍵1——暫停
- 按鍵2——清零
- 按鍵3——加10秒
- 按鍵4——減10秒
- 按鍵5——加10分
- 按鍵6——減10分
- *********************************************************************/
- #include<reg51.h>
- #include"i2c.h"
- #include <intrins.h>
- #define uint unsigned int
- #define uchar unsigned char
- unsigned char m=0;
- uchar z=0;
- sbit key1=P1^0; //定義各按鍵對應的IO口
- sbit key2=P1^1 ;
- sbit key3=P1^2;
- sbit key4=P1^3;
- sbit key5=P1^4;
- sbit key6=P1^5;
- typedef unsigned char u8;
- typedef unsigned int u16;
- u8 i;
- uchar display2[]={ 0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd }; //用于流水燈
- uint counter=0;
- u8 smgduan[16]={0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07,
- 0x7F, 0x6F, 0x77, 0x7C, 0x39, 0x5E, 0x79, 0x71,};// 段選
- u8 smgduan1[16]={0xBF,0x86,0xDB,0xCF,0xE6,0xED,0xFD,0x87,0xFF,0xEF,}; //百位的段選
- u8 smgwei[8]={0x00,0x04,0x08,0x0c,0x10,0x14,0x18,0x1c}; //位選
- u8 a[4];//保存時鐘的數據
- u8 sec,min;
- void delay(u16 i) //延遲函數
- {
- while(i--);
- }
- /*******************************************************************************
- * 函 數 名 : void At24c02Write(unsigned char addr,unsigned char dat)
- * 函數功能 : 往24c02的一個地址寫入一個數據
- *******************************************************************************/
- void At24c02Write(unsigned char addr,unsigned char dat) //把dat的值存放到addr地址上
- {
- I2C_Start();
- I2C_SendByte(0xa0, 1);//發送寫器件地址
- I2C_SendByte(addr, 1);//發送要寫入內存地址
- I2C_SendByte(dat, 0); //發送數據
- I2C_Stop();
-
- }
- /*******************************************************************************
- * 函 數 名 : unsigned char At24c02Read(unsigned char addr)
- * 函數功能 : 讀取24c02的一個地址的一個數據
- *******************************************************************************/
- unsigned char At24c02Read(unsigned char addr)
- {
- unsigned char sec;
- I2C_Start();
- I2C_SendByte(0xa0, 1); //發送寫器件地址
- I2C_SendByte(addr, 1); //發送要讀取的地址
- I2C_Start();
- I2C_SendByte(0xa1, 1); //發送讀器件地址
- sec=I2C_ReadByte(); //讀取數據
- I2C_Stop();
- return sec;
- }
- /***********************************
- 顯示函數
- ************************************/
- void display()
- {
- a[0]=smgduan[sec%10];
- a[1]=smgduan[sec/10];
- a[2]=smgduan1[min%10];
- a[3]=smgduan[min/10];
- for(i=0;i<4;i++)
- {
- P0=a[i];
- P2=smgwei[4-i];
- delay(300); //不同的延時時間對數碼管顯示亮度會產生很大的影響,時間越短影響越大
- }
- }
- initial() //定時器0初始化
- { TMOD=0x01; //選擇定時器工作模式
- TH0=55536/256; //設置定時初值
- TL0=55536%256;
- EA=1;
- ET0=1;
- TR0=1; }
- void time1init()
- { //定時器1初始化
- TMOD=0x01;
- TL1 = 0xCB;
- TH1 = 0xF3;
- EA=1; //總中斷
- ET1=1; //中斷允許開關
- TR1=1; //定時器開關
- }
- /***********************
- 按鍵掃描函數
- ************************/
- void keyscan()
- {
- delay(200);
- if(key2==0) //清零
- {
- delay(200);
- min=0;
- sec=0;
- while (!key2);}
- if(key1==0) //暫停
- {
- delay(200);
- while (!key1);
- TR1=~TR1; //停止或啟動定時器1
- }
- if(key3==0) //增加10s,若此時秒大于50則在增加后進min進一,sec照量改變
- {
- delay(200);
- if(sec<=49)
- sec +=10;
- else
- {min+=1;
- sec-=50;}
- while(!key3);
- }
- if(key5==0) //增加10m
- {
- delay(200);
- min+=10;
- while(!key5);}
- if(min>=60) //min滿60后全部歸零
- {delay(200);
- min=0;
- sec=0;
- while(!key5);}
- delay(200);
- if(key6==0) //減少10m,若此時時間少于10m,則時間歸零
- {
- delay(200);
- if(min>=10)
- {
- min-=10;
- while(!key6);}
- else
- {delay(200);
- min=0 ;
- sec=0;
- while(!key6);}
- }
- if(key4==0) //減少10秒
- {
- delay(200);
- if(sec>=10)
- {delay(200);
- sec-=10;
- while(!key4);
- }
- else if(min>=1&&sec<=10)
- {delay(200);
- min-=1;
- sec+=50;
- while(!key4);
- }
- else if(min==0&&sec<=10) //時間少于10s的在按下key4后歸零
- {delay(200);
- min=0;
- sec=0;
- while(!key4);
- }
- }
- }
- /**********************
- 主函數
- ***********************/
- void main()
- {
- if(m==0) //斷電后讀數
- { sec=At24c02Read(1);
- min=At24c02Read(2);
- }
- time1init(); //調用各種子函數
- while(1)
- { At24c02Write(1,sec);
- keyscan();
- display();
- initial();
- }
- }
-
- void T0_int () interrupt 1 //定時器0控制流水燈
- { TR0=0;
- ET0=0;
- TH0=55536/256; //設置初值
- TL0=55536%256;
- if(sec>=30&&sec<=40) //在30s~40s時流水燈亮起
- {
- if(z<14)
- { counter++;
- if(counter==30) //定時控制LED燈的改變
- { z++;
- counter=0;
- }
- P3=display2[z]; }
- if(z==14)
- { P3=0xff;
- z=0; }
- ……………………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
所有資料51hei提供下載:
時鐘.zip
(526.98 KB, 下載次數: 28)
2017-6-8 05:08 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|