前幾天在網上閑逛發現有人搭棚焊了一個時鐘,一時心動想自己也做一個送小姑娘。
說干咱就干,從萬能的X寶上下單,幾天貨到!
IMG_20181227_093650.jpg (248.46 KB, 下載次數: 46)
下載附件
2018-12-27 10:24 上傳
先簡單畫了個草圖
IMG_20181227_095106.jpg (157.97 KB, 下載次數: 46)
下載附件
2018-12-27 10:34 上傳
開焊,過程就不發圖了,看成品。89c52+ds1302+18b20+共陽時鐘數碼管 串口線直接焊在10、11腳上,寫程序。成了!!!
IMG_20181227_093507.jpg (177.81 KB, 下載次數: 51)
下載附件
2018-12-27 10:39 上傳
IMG_20181227_093512.jpg (152.3 KB, 下載次數: 40)
下載附件
2018-12-27 10:39 上傳
IMG_20181227_093517.jpg (161.85 KB, 下載次數: 33)
下載附件
2018-12-27 10:40 上傳
拷了幾天機,發現時間不準,平均每天慢十幾分鐘,查了一下說是晶振沒選好,電容沒匹配。哎!調了幾次沒搞好,也不想再調試了。 
有人說DS3231好用,于是換方案。
同樣草圖
IMG_20181227_095133.jpg (167.53 KB, 下載次數: 49)
下載附件
2018-12-27 10:41 上傳
為了焊的好看一點,數碼管自定義。
IMG_20181227_095138.jpg (150.13 KB, 下載次數: 39)
下載附件
2018-12-27 10:42 上傳
早晨上班,等紅燈時發現一女司機抱著狗兒開車。
狗.jpg (265.52 KB, 下載次數: 43)
下載附件
2018-12-27 10:59 上傳
過程不多,看成品。還是串口線直接下載。底座是電池盒,用三節5號電池。不知能用多久,沒測過電工作電流。沒有萬用表。你信嗎,試驗室里竟然沒有萬用表! 后來焊了一個USB接口可以手機充電器供電。
IMG_20181227_094459.jpg (197.96 KB, 下載次數: 44)
下載附件
2018-12-27 10:51 上傳
IMG_20181227_093854.jpg (169.33 KB, 下載次數: 48)
下載附件
2018-12-27 10:53 上傳
IMG_20181203_082554.jpg (159.45 KB, 下載次數: 43)
下載附件
2018-12-27 10:54 上傳
IMG_20181203_082521.jpg (142.41 KB, 下載次數: 44)
下載附件
2018-12-27 10:55 上傳
拷機一個月快了55秒!哎!勉強接授吧!
最后附上電路圖和程序,這是我做完以后畫的,各實際的不太一樣,特別是單片機和數碼管之間的連接不一樣,所以才用了自定義的顯示字庫,其它的也不知有沒有錯誤。
電路原理圖.jpg (156.21 KB, 下載次數: 52)
下載附件
2018-12-27 11:13 上傳
程序奉上一部分,其它的請下載吧!賺點積分!
單片機源碼:
- #include <reg52.h>
- #include<intrins.h>[/color][/align][align=left][color=#000000]#define uchar unsigned char
- #define uint unsigned int[/color][/align][align=left][color=#000000]
- sbit SDA=P2^7; //數據傳送位SDA
- sbit SCL=P2^6; //時鐘控制位SCL
- sbit INT=P3^3; //中斷位
- sbit RESET=P3^2; //復位
- sbit smg4=P1^1; //位碼1聲明 分個位
- sbit smg3=P1^3; //位碼2聲明 分十位
- sbit smg2=P1^5; //位碼3聲明 時個位
- sbit smg1=P1^7; //位碼4聲明 時十位
- sbit k1=P1^4; //按鍵k1的聲明
- sbit k2=P1^6; //按鍵k2的聲明
- sbit k3=P3^7; //按鍵k3的聲明
- sbit bell=P3^5; //蜂鳴器聲明
- sbit gm=P2^1; //測光聲明,黑暗時等于1[/color][/align]
- bit gm_en=0; //光敏使能信號;
- bit ack; //應答標志位
- char code dis_code[]={0X28,0XEE,0X32,0XA2,0XE4,0XA1,0X21,0XEA,0X20,0XA0,0X60,0X25,0X37,0X26,0X31,0X71};//數碼管沒有按a-h的順序連接,自定義的顯示字庫,0-9,A-F
- uchar bell_en=0,x=1;//鬧鐘使能信號,任意鍵關閉鈴聲標志位
- uchar tabtime[]={0x00,0x00,0x07,0x02,0x23,0x10,0x18}; //首次上電時默認的時間2018年 星期二 10月23日 07:00:00
- uchar year,month,day,week,hour,minute,second,temperature; //從1302讀出的實時時間數據
- uchar gm_time=60,temp_en=0,n=0,a=0,b=0; //gm_time光敏控制亮度值,n是按鍵標志位,a產生一個1秒的計時,b控制字符閃爍,temp_en溫度顯示標志
- uint t=0; //用來產生30秒的計時
- uint TtempH,TtempL; //定義溫度高位,低位
- char shi,fen,miao,b_shi=7,b_fen=0; //必須使用符號型:數據暫存單元shi/fen/miao,鬧鈴時間b_shi,b_fen,
- void baojing(); //報警函數
- void delay_50us(uint t); //延時50*T微妙函數的聲明
- void Start_I2C(); //I2C總線產生起始信號函數
- void Stop_I2C(); //I2C總線產生停止信號函數
- void Ack_I2C(bit a); //接收應答信號函數;
- void SendByte(uchar c); //向I2C總線寫入一個字節的數據函數
- uchar RcvByte(); //字節數據接收函數
- uchar write_byte(uchar addr, uchar write_data);//將一個字節寫入DS3231指定地址
- uchar read_byte(uchar addr); //從DS3231指定地址讀一個字節
- void Set_Time(); //設置時間
- void get_time(void); //讀取時間
- void get_Temperature(); //讀取溫度
- void show_Temperature(); //顯示溫度
- void init(); //初始化函數
- void timer0(); //定時器0中斷服務程序
- void display(uchar s,f); //顯示子程序
- void key(); //按鍵控制函數
- void baojing()//報警函數
- {
- uint j=10,i=10;
- bell=0;
- while(i--)display(shi,fen);
- bell=1;
- while(j--)display(shi,fen);
- }
- //函數名稱:void delay_50US(unsigned int t)
- //功能: 延時50*t(us)
- void delay_50us(uint t)
- {
- unsigned char j;
- for(;t>0;t--)
- {
- for(j=19;j>0;j--);
- }
- }
- void Start_I2C() //I2C總線產生起始信號函數
- {
- SDA=1; //拉高數據線,發送起始條件的數據信號
- SCL=1; //拉高時鐘線
- SDA=0; //在時鐘線為高電平時,拉低數據線,產生起始信號
- SCL=0; //鉗住I2C總線,準備發送或接收數據
- }
- void Stop_I2C() //I2C總線產生停止信號函數
- {
- SDA=0; //拉低數據線,發送結束條件的數據信號
- SCL=1; //拉高時鐘線,發送結束條件的時鐘信號
- SDA=1; //時鐘時線為高電平時,拉高數據線,發送I2C總線結束信號
- }
- /********************************************************************
- 應答子函數
- 函數原型: void I2CACK(bit a);
- 功能: 主控器進行應答信號(可以是應答或非應答信號,由位參數a決定)
- ********************************************************************/
- void Ack_I2C(bit a) //接收應答信號函數;a是定義的一個位變量,來暫存應答狀態。
- {
-
- if(a==0)
- SDA=0; //在此發出應答或非應答信號
- else
- SDA=1;
- SCL=1;
- SCL=0; //清時鐘線,鉗住I2C總線以便繼續接收
- }
- /*******************************************************************
- 字節數據發送函數
- 函數原型: void SendByte(uchar c);
- 功能: 將數據c發送出去,可以是地址,也可以是數據,發完后等待應答,并對
- 此狀態位進行操作.(不應答或非應答都使ack=0)
- ack=1 發送數據正常,
- ack=0 被控器無應答或損壞。
- ********************************************************************/
- void SendByte(uchar c) //向I2C總線寫入一個字節的數據函數
- {
- uchar BitCnt;
-
- for(BitCnt=0;BitCnt<8;BitCnt++) //要傳送的數據長度為8位
- {
- if((c<<BitCnt)&0x80)
- SDA=1; //判斷發送位
- else
- SDA=0;
- SCL=1; //置時鐘線為高,通知被控器開始接收數據位
- SCL=0;
- }
-
- SDA=1; //8位發送完后釋放數據線,準備接收應答位
- SCL=1;
- if(SDA==1)
- ack=0;
- else
- ack=1; //判斷是否接收到應答信號
- SCL=0;
- }
- /*******************************************************************
- 字節數據接收函數
- 函數原型: uchar RcvByte();
- 功能: 用來接收從器件傳來的數據,并判斷總線錯誤(不發應答信號),
- 發完后請用應答函數應答從機。
- ********************************************************************/
- uchar RcvByte() //字節數據接收函數
- {
- uchar retc;
- uchar BitCnt;
-
- retc=0;
- SDA=1; //置數據線為輸入方式
- for(BitCnt=0;BitCnt<8;BitCnt++)
- {
- SCL=0; //置時鐘線為低,準備接收數據位
- SCL=1; //置時鐘線為高使數據線上數據有效
- retc=retc<<1;
- if(SDA==1)
- retc=retc+1; //讀數據位,接收的數據位放入retc中
- }
- SCL=0;
- return(retc);
- }
-
- /***********將一個字節寫入DS3231指定地址***********/
- uchar write_byte(uchar addr, uchar write_data)
- {
- Start_I2C();
- SendByte(0xD0);
- if (ack == 0)
- return 0;
-
- SendByte(addr);
- if (ack == 0)
- return 0;
-
- SendByte(write_data);
- if (ack == 0)
- return 0;
-
- Stop_I2C();
- return 1;
- }
- /************從DS3231指定地址讀一個字節************/
- uchar read_byte(uchar addr)
- {
- uchar read_data;
- Start_I2C();
- SendByte(0xD0);
- if(ack==0)
- return(0);
-
- SendByte(addr);
- if(ack==0)
- return(0);
-
- Start_I2C();
- SendByte(0xD1);
- if(ack==0)
- return(0);
- read_data = RcvByte();
- Ack_I2C(1);
- Stop_I2C();
- return read_data;
- }
-
- /**************************設置時間******************************************/
- void Set_Time()
- {
- uchar i;
- uchar ucAddr=0x00; //秒的地址
- for(i=0;i<7;i++)
- {
- write_byte(ucAddr,tabtime[i]);//從秒開始連續寫入秒分時星期日月年
- ucAddr+=1;
- }
- }
-
- /*********************讀取時間**********************/
- void get_time(void)
- {
- hour=read_byte(0x02)/16*10+read_byte(0x02)%16;
- minute=read_byte(0x01)/16*10+read_byte(0x01)%16; //因只顯示時、分,故可只讀取時、分
- year=read_byte(0x06)/16*10+read_byte(0x06)%16;
-
- /*
- uchar i;
- uchar ucCurtime[7];
- uchar ucAddr = 0x00; //秒地址
- for(i=0;i<7;i++)
- {ucCurtime[i]=0;}
-
- for(i=0; i<7; i++)
- {
- ucCurtime[i] = read_byte(ucAddr); //格式為: 從秒地址開始連續讀取,秒分時星期日月年。
- ucAddr += 1;
- }
- year=ucCurtime[6]/16*10+ucCurtime[6]%16;
- month=ucCurtime[5]/16*10+ucCurtime[5]%16;
- day=ucCurtime[4]/16*10+ucCurtime[4]%16;
- week=ucCurtime[3]/16*10+ucCurtime[3]%16;
- hour=ucCurtime[2]/16*10+ucCurtime[2]%16;
- minute=ucCurtime[1]/16*10+ucCurtime[1]%16;
- second=ucCurtime[0]/16*10+ucCurtime[0]%16;
- */
- }
- /*********************讀取溫度**********************/
- void get_Temperature()
- {
- TtempH=read_byte(0X11); //讀溫度高字節
- //因數碼管位數只有四位,故溫度的小數部分不顯示,可以不用讀溫度低字節
- //TtempL=read_byte(0x12); //讀溫度低字節
- //TtempL=(TtempL>>6)*25;//將BIT7,BIT6的數據移入BIT1,BIT0位;分辨率數值擴大100倍便于整數運算
-
- }
- ………………
復制代碼
完整程序代碼
原代碼.rar
(4.87 KB, 下載次數: 165)
2018-12-27 11:19 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|