|
前段時間t 寶買了個創(chuàng)意旋轉(zhuǎn)時鐘
旋轉(zhuǎn)鐘.png (162.72 KB, 下載次數(shù): 119)
下載附件
2019-3-14 15:10 上傳
用了一段時間感覺走時不準(zhǔn), 打算加個自動校時功能就自己重寫了單片機(jī)程序并配了個ESP8266的模塊
現(xiàn)在終于不用再手工校對時間了,而且還有18650電池,可以充電
NClock1.jpg (337.2 KB, 下載次數(shù): 138)
下載附件
2019-3-14 15:15 上傳
NClock2.jpg (324.75 KB, 下載次數(shù): 120)
下載附件
2019-3-14 15:15 上傳
單片機(jī)程序
- #include <global.h>
- #include <stdio.h>
- #include "DS1302.h"
- #include "DS18B20.h"
- //-----------------------------------------------
- /* define constants */
- #define FOSC 12000000
- #define BAUD 19200 //UART baudrate
- bit UpdateDisp,UpdateTime,ShowTemp,CapTemp,TempChange,UpdateMsg,ShowFlag;
- static uint8 ss=0;
- static uint16 ms=0;
- #define CommBufSize 0x3F
- struct tcomm_buf{
- uint8 sendBuf[CommBufSize],receBuf[CommBufSize];
- uint8 receTimeOut;
- uint8 sendCount; //發(fā)送字節(jié)個數(shù)
- uint8 receCount; //接收到的字節(jié)個數(shù)
- uint8 sendPosi; //發(fā)送位置
- };
- struct tcomm_buf xdata comm1_data;
- /*
- void Delay1ms() //@12.000MHz
- {
- unsigned char i, j;
- i = 2;
- j = 239;
- do
- {
- while (--j);
- } while (--i);
- }
- void Delayms(uint16 c) //@12.000MHz
- {
- while(c--)
- Delay1ms();
- }
- */
- void Uart_Check(void);
- void UpdateLed(void){
- P3= P3|0xF0; //高四位數(shù)碼管 P3.1 P3.2 串口 P3.2 MODE P3.3 Plus
- P2=0xFF;
- P0=~(1<<(sec%8)); //Led/數(shù)碼管公用IO
- P2=~(1<<(sec/8)); //led
- }
- const uint8 NixieMap[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E,0x9C,0xFF};
- void UpdateNixie(uint8 l){
- int8 tmpVal;
- P2=0xFF; //led
- P3=(P3|0xF0);
- P0= 0xFF;
- if(ShowTemp){
- switch(l){
- case 0:
- tmpVal = Temp1/10;
- break;
- case 1:
- tmpVal = Temp1%10;
- break;
- case 2:
- tmpVal = 16;
- break;
- case 3:
- tmpVal = 0x0C;
- break;
- }
- P0= NixieMap[tmpVal]; //Led/數(shù)碼管公用IO
- }
- else
- {
- switch(l){
- case 0:
- tmpVal = hour/10;
- //P0= 0xC0;
- //P3=0xE0|(P3&0x0F);
- break;
- case 1:
- tmpVal = hour%10;
- //P0= 0xF9;
- //P3=0xD0|(P3&0x0F);
- break;
- case 2:
- tmpVal = min/10;
- //P0= 0xA4;
- //P3=0xB0|(P3&0x0F);
- break;
- case 3:
- tmpVal = min%10;
- //P0= 0xB0;
- //P3=0x70|(P3&0x0F);
- break;
- }
- if(l==1&&ShowFlag)
- P0= NixieMap[tmpVal] & 0x7F; //Led/數(shù)碼管公用IO
- else
- P0= NixieMap[tmpVal]; //Led/數(shù)碼管公用IO
- }
- P3=(~(1<<(l+4)))|(P3 & 0x0F); //高四位數(shù)碼管 P3.0 P3.1 串口 P3.2 MODE P3.3 Plus
- }
- //void UartInit(void) //115200bps@22.1184MHz
- //{
- // PCON |= 0x80; //使能波特率倍速位SMOD
- // SCON = 0x50; //8位數(shù)據(jù),可變波特率
- // AUXR &= 0xBF; //定時器1時鐘為Fosc/12,即12T
- // AUXR &= 0xFE; //串口1選擇定時器1為波特率發(fā)生器
- // TMOD &= 0x0F; //清除定時器1模式位
- // TMOD |= 0x20; //設(shè)定定時器1為8位自動重裝方式
- // TL1 = 0xFF; //設(shè)定定時初值
- // TH1 = 0xFF; //設(shè)定定時器重裝值
- // ET1 = 0; //禁止定時器1中斷
- // TR1 = 1; //啟動定時器1
- // ES=1;
- //}
- //void UartInit(void) //19200bps@22.1184MHz
- //{
- // PCON &= 0x7F; //波特率不倍速
- // SCON = 0x50; //8位數(shù)據(jù),可變波特率
- // AUXR &= 0xBF; //定時器1時鐘為Fosc/12,即12T
- // AUXR &= 0xFE; //串口1選擇定時器1為波特率發(fā)生器
- // TMOD &= 0x0F; //清除定時器1模式位
- // TMOD |= 0x20; //設(shè)定定時器1為8位自動重裝方式
- // TL1 = 0xFD; //設(shè)定定時初值
- // TH1 = 0xFD; //設(shè)定定時器重裝值
- // ET1 = 0; //禁止定時器1中斷
- // TR1 = 1; //啟動定時器1
- // ES=1;
- //}
- void UartInit(void) //9600bps@22.1184MHz
- {
- PCON &= 0x7F; //波特率不倍速
- SCON = 0x50; //8位數(shù)據(jù),可變波特率
- AUXR &= 0xBF; //定時器1時鐘為Fosc/12,即12T
- AUXR &= 0xFE; //串口1選擇定時器1為波特率發(fā)生器
- TMOD &= 0x0F; //清除定時器1模式位
- TMOD |= 0x20; //設(shè)定定時器1為8位自動重裝方式
- TL1 = 0xFA; //設(shè)定定時初值
- TH1 = 0xFA; //設(shè)定定時器重裝值
- ET1 = 0; //禁止定時器1中斷
- TR1 = 1; //啟動定時器1
- ES=1;
- }
- //void Timer0Init(void) //1毫秒@22.1184MHz
- //{
- // AUXR &= 0x7F; //定時器時鐘12T模式
- // TMOD &= 0xF0; //設(shè)置定時器模式
- // TL0 = 0x00; //設(shè)置定時初值
- // TH0 = 0xB8; //設(shè)置定時初值
- // TF0 = 0; //清除TF0標(biāo)志
- // TR0 = 1; //定時器0開始計時
- // ET0 = 1; //enable timer0 interrupt
- //}
- void Timer0Init(void) //25毫秒@22.1184MHz
- {
- AUXR &= 0x7F; //定時器時鐘12T模式
- TMOD &= 0xF0; //設(shè)置定時器模式
- TL0 = 0x00; //設(shè)置定時初值
- TH0 = 0x4C; //設(shè)置定時初值
- TF0 = 0; //清除TF0標(biāo)志
- TR0 = 1; //定時器0開始計時
- ET0 = 1; //enable timer0 interrupt
- }
- /* Timer0 interrupt routine */
- void tm0_isr() interrupt 1 using 1
- {
- UpdateDisp=1;
- ShowFlag = ms<122;
- if(ms++>222){
- ms=0;
- sec++;
- switch(sec%4){
- case 1:
- TempChange=1;
- break;
- case 2:
- CapTemp=1;
- break;
- case 3:
- //ShowTemp=1;
- break;
- }
-
- if(sec>=60){
- sec=0;
- UpdateTime=1;
- }
- if((sec%5)>=3){
- ShowTemp=1;
- }
- else
- ShowTemp=0;
- }
- }
- void WaitMs(void){
- while(UpdateDisp==0);
- }
- void main()
- {
- P0=0xFF; //Led/數(shù)碼管公用IO
- P1=0xFF; // 蜂鳴器 P1.0 18B20 P1.1 P1.2 P1.3 DS1302
- P2=0xFF; //led
- P3=0xFF; //高四位數(shù)碼管 P3.0 P3.1 串口 P3.2 MODE P3.3 Plus
- ShowFlag = 0;
- ShowTemp = 0;
- comm1_data.sendCount=0;
- comm1_data.sendPosi=0;
- UartInit();
- Timer0Init();
- EA = 1; //Open master interrupt switch
- printf("STC89-90xx\r\nUart Test !\r\n");
- DS1302_readtime();
-
- // year=18;
- // month=11;
- // day=2;
- // hour=14;
- // min=32;
- // sec=0;
- //
- // DS1302_Write();
-
- //P0=0x1;
- //uint8 c=1;
- while(1){
- Uart_Check();
- UpdateNixie(0);
- WaitMs();
- UpdateNixie(1);
- WaitMs();
- UpdateNixie(2);
- WaitMs();
- UpdateNixie(3);
- WaitMs();
- UpdateLed();
- if(UpdateTime){
- UpdateTime=0;
- DS1302_readtime();//sec,min,hour,day,month,week,year
- printf("Update Time %02d-%02d-%02d %02d:%02d:%02d\r\n",year,month,day,hour,min,sec);
- }
- if(TempChange){
- TempChange=0;
- Start_Change();
- }
- if(CapTemp){
- CapTemp=0;
- Read_Temperature();
- }
- // if(ShowTemp){
- // ShowTemp=0;
- // printf("Temperature: %.1f\r\n",Temp);
- // }
- WaitMs();
- }
- }
- /*----------------------------
- UART interrupt service routine
- ----------------------------*/
- void Uart_Isr() interrupt 4 using 1
- {
- if(TI)
- {
- TI = 0;
- if(comm1_data.sendPosi < comm1_data.sendCount)
- {
- SBUF = comm1_data.sendBuf[comm1_data.sendPosi++];
- }
- else
- {
- comm1_data.sendPosi = 0;
- comm1_data.sendCount = 0;
- comm1_data.receCount = 0; //清接收地址偏移寄存器
- }
- }
- else if(RI)
- {
- RI = 0;
- comm1_data.receTimeOut = 5; //通訊超時值
- ……………………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復(fù)制代碼
NewClock.7z
(15.95 KB, 下載次數(shù): 182)
2019-3-14 15:11 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
esp8266程序(基于Arduino)
TimeNTP_ESP8266WiFi.7z
(2.08 KB, 下載次數(shù): 179)
2019-3-14 15:22 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|
評分
-
查看全部評分
|