|
電路原理圖如下:
c5b9f659a0e703aea3663be5efa05f8.png (163.85 KB, 下載次數(shù): 57)
下載附件
下位機(jī)原理圖
2021-4-1 15:42 上傳
單片機(jī)源程序如下:
- #include <reg52.h>
- #include <intrins.h>
- #include <stdio.h>
- #include "delay.h"
- #include "ds1302.h"
- #include "1602.h"
- sbit relay = P1^3;//接口定義
- unsigned char dis0[16];//定義顯示區(qū)域臨時(shí)存儲(chǔ)數(shù)組
- unsigned char dis1[16];
- unsigned char dis2[16];
- unsigned char ReadTimeFlag= 0;//讀取時(shí)間標(biāo)志
- unsigned char SetFlag =0; //時(shí)間設(shè)置標(biāo)志
- unsigned char i;
- unsigned char relayFlag=0; //繼電器狀態(tài)標(biāo)志
- unsigned long times_20ms=0xaaaaaaaa; //定時(shí)器計(jì)數(shù) 初始值可以任意值 這里隨便賦值為0xaaaaaaaa
- unsigned char uart_i =0; //串口接收計(jì)數(shù)
- unsigned char time_buf2[17]={20,18,4,1,12,55,00,6};//空年月日時(shí)分秒周; //更新時(shí)間數(shù)組
- bit ReadTempFlag;//定義讀時(shí)間標(biāo)志
- unsigned char repotimes ;
- unsigned char disFlag ; //更新
- xdata unsigned char dsHour_start_01 = 8; //定時(shí)時(shí)分
- xdata unsigned char dsMin_start_01 = 0;
- xdata unsigned char dsHour_end_01 = 18;
- xdata unsigned char dsMin_end_01 = 30;
- //xdata unsigned char dsHour_start_01 = 8; //A組定時(shí)時(shí)分
- //xdata unsigned char dsMin_start_01 = 0;
- //xdata unsigned char dsH02_A = 12;
- //xdata unsigned char dsM02_A = 30;
- unsigned char timeOverFlag =0;
- xdata unsigned char firstin =0; //首次接收到標(biāo)志
- xdata unsigned char tab[20]; //串口數(shù)據(jù)暫存
- xdata unsigned char Count=0; //串口接收計(jì)數(shù)
- xdata unsigned char uartbusy =0; //串口判忙
- void Init_Timer0(void); //函數(shù)聲明
- void uartSendStr(unsigned char *s,unsigned char length);
- void UART_Init(void);
- void uartSendByte(unsigned char dat);
- void main(void)
- {
- Init_Timer0(); //定時(shí)器0初始化
- times_20ms = 0; //初始化對(duì)應(yīng)值
- UART_Init();
-
- relay = 0;//打開
- DelayMs(200); //延時(shí)有助于穩(wěn)定
- relay = 1;//關(guān)閉
-
- Ds1302_Init();
- // Ds1302_Write_Time();
- Ds1302_Read_Time();//讀取時(shí)間參數(shù)
- uartSendStr("ready ok !",10);
- LCD_Init(); //初始化液晶
- DelayMs(20); //延時(shí)有助于穩(wěn)定
- LCD_Clear();
- LCD_Write_String(0,0,"my desiger! ");
-
- while(1)
- {
-
- if(SetFlag==1) //如果接收到串口信息則更新時(shí)鐘
- {
- for(i=0;i<8;i++)
- {
- time_buf1[i]=time_buf2[2*i]*10+time_buf2[2*i+1];//數(shù)據(jù)整合,如2個(gè)數(shù) 1和5整合成15
- }
- Ds1302_Write_Time();//接收更新的時(shí)間然后寫入ds1302
- SetFlag=0; //時(shí)鐘信息更新后標(biāo)志位清零
- }
- if(disFlag == 1) //定時(shí)讀取ds1302 定時(shí)時(shí)間到 則標(biāo)志位置1,處理過時(shí)間參數(shù)標(biāo)志位清零
- {
- disFlag=0; //標(biāo)志位清零
- Ds1302_Read_Time();//讀取時(shí)間參數(shù)
- if((time_buf1[4]>=dsHour_start_01)&&(time_buf1[4]<=dsHour_end_01)) //對(duì)比時(shí)間段1
- {
- if((dsHour_start_01 != dsHour_end_01)) //設(shè)置起止時(shí)不再同一小時(shí)
- {
- if((time_buf1[4]>dsHour_start_01)&&(time_buf1[4]<dsHour_end_01)) //兩個(gè)時(shí) 范圍內(nèi)
- {
- timeOverFlag = 1;//打開
- }
- else if((time_buf1[4] == dsHour_start_01) && (time_buf1[5]>=dsMin_start_01)) //啟停不在一個(gè)小時(shí)內(nèi) 當(dāng)前時(shí)間在啟動(dòng)時(shí)內(nèi)
- {
- timeOverFlag = 1;//打開
- }
- else if((time_buf1[4] == dsHour_end_01) && (time_buf1[5]<dsMin_end_01)) //啟停不在一個(gè)小時(shí)內(nèi) 當(dāng)前時(shí)間在停止時(shí)內(nèi)
- {
- timeOverFlag = 1;//打開
- }
- else
- {timeOverFlag = 0;}
- }
- else if((dsHour_end_01==dsHour_start_01)) //同一個(gè)小時(shí)內(nèi)
- {
- if((time_buf1[5]>=dsMin_start_01) && (time_buf1[5]<dsMin_end_01)) //統(tǒng)一小時(shí)分鐘范圍內(nèi)
- {timeOverFlag = 1;}//打開
- else
- {timeOverFlag = 0;} //關(guān)閉
- }
- }
- else
- {
- timeOverFlag = 0; //關(guān)閉
- }
- if(timeOverFlag == 1){relay = 0;}//打開 繼電器控制
- else {relay =1 ;}//關(guān)閉
-
- sprintf(dis0,"%02d-%02d-%02d-%d",(int)time_buf1[1],(int)time_buf1[2],(int)time_buf1[3],(int)time_buf1[7]);//年月日周 步數(shù)
- LCD_Write_String(0,0,dis0); //顯示數(shù)據(jù)
- sprintf(dis0,"s%02d:%02d",(int)dsHour_start_01,(int)dsMin_start_01);//起始時(shí)間
- LCD_Write_String(10,0,dis0); //顯示數(shù)據(jù)
-
- sprintf(dis1,"%02d:%02d:%02d ",(int)time_buf1[4],(int)time_buf1[5],(int)time_buf1[6]);//時(shí)分秒
- LCD_Write_String(0,1,dis1); //顯示數(shù)據(jù)
-
- sprintf(dis1," e%02d:%02d",(int)dsHour_end_01,(int)dsMin_end_01);//結(jié)束時(shí)間
- LCD_Write_String(9,1,dis1); //顯示數(shù)據(jù)
- repotimes++;
- if(repotimes >= 8) //定時(shí)上報(bào)
- {
- repotimes = 0;//上報(bào)時(shí)間
-
- sprintf(dis0,"*D20%02d%02d%02d#",(int)time_buf1[1],(int)time_buf1[2],(int)time_buf1[3],(int)time_buf1[7]);//年月日周
- uartSendStr(dis0,11); //發(fā)送數(shù)據(jù)
- uartSendStr("\r\n",2);
-
- sprintf(dis1,"*T%02d%02d%02d#",(int)time_buf1[4],(int)time_buf1[5],(int)time_buf1[6]);//時(shí)分秒
- uartSendStr(dis1,9); //發(fā)送數(shù)據(jù)
- uartSendStr("\r\n",2);
-
- sprintf(dis2,"*S%02d:%02d~%02d:%02d#",(int)dsHour_start_01,(int)dsMin_start_01,(int)dsHour_end_01,(int)dsMin_end_01);//打印
- uartSendStr(dis2,14); //發(fā)送數(shù)據(jù)
- uartSendStr("\r\n",2);
- }
- }
- }
- }
- void Init_Timer0(void)
- {
- //**All notes can be deleted and modified**//
- TMOD |= 0x10; //使用模式1,16位定時(shí)器,使用"|"符號(hào)可以在使用多個(gè)定時(shí)器時(shí)不受影響
- TH0=(65536-20000)/256; //重新賦值 20ms
- TL0=(65536-20000)%256;
- EA=1; //總中斷打開
- ET0=1; //定時(shí)器中斷打開
- TR0=1; //定時(shí)器開關(guān)打開
- }
- void Timer0_isr(void) interrupt 1
- {
- TH0=(65536-20000)/256; //重新賦值 20ms
- TL0=(65536-20000)%256;
- times_20ms++; //計(jì)時(shí)++
- if(times_20ms%5==0)
- {
- disFlag=1; //定時(shí)更新顯示 100ms
- }
- if(uartbusy>0) //串口數(shù)據(jù)采集處理
- {uartbusy--;} //串口一定時(shí)間內(nèi)接收到數(shù)據(jù)
- else
- {
- firstin =0; //重新賦值接收數(shù)據(jù)
- Count=0;//接收計(jì)數(shù)
- }
- }
- void UART_Init(void)
- {
- SCON = 0x50; // SCON: 模式 1, 8-bit UART, 使能接收
- TMOD |= 0x20; // TMOD: timer 1, mode 2, 8-bit 重裝
- TH1 = 0xFD; // TH1: 重裝值 9600 波特率 晶振 11.0592MHz
- TL1 = TH1;
- TR1 = 1; // TR1: timer 1 打開
- EA = 1; //打開總中斷
- ES = 1; //打開串口中斷
- }
- void uartSendByte(unsigned char dat)
- {
- unsigned char time_out;
- time_out=0x00;
- SBUF = dat; //將數(shù)據(jù)放入SBUF中
- while((!TI)&&(time_out<100)) //檢測(cè)是否發(fā)送出去
- {time_out++;DelayUs2x(10);} //未發(fā)送出去 進(jìn)行短暫延時(shí)
- TI = 0; //清除ti標(biāo)志
- }
- void uartSendStr(unsigned char *s,unsigned char length)
- {
- unsigned char NUM;
- NUM=0x00;
- while(NUM<length) //發(fā)送長(zhǎng)度對(duì)比
- {
- uartSendByte(*s); //放松單字節(jié)數(shù)據(jù)
- s++; //指針++
- NUM++; //下一個(gè)++
- }
- }
- void UART_SER (void) interrupt 4 //串行中斷服務(wù)程序
- {
- unsigned char r_buf;
- if(RI) //判斷是接收中斷產(chǎn)生
- {
- RI=0; //標(biāo)志位清零
- r_buf = SBUF;
- uartbusy = 20;
- if(r_buf=='*') //接收到起始標(biāo)志
- {
- firstin = 1; //接收標(biāo)志成功
- Count = 0;
- tab[Count++]=r_buf;
- }
- else if(firstin == 1) //接收到其實(shí)標(biāo)志成功
- {
- tab[Count++]=r_buf;
- if((Count>=18)&&(tab[17] == '#')) //接收到設(shè)置時(shí)間命令
- {
- for(i=0;i<16;i++)
- {
- time_buf2[i]=tab[1+i]&0x0F; //提取設(shè)置值
- }
- SetFlag=1 ; //設(shè)置時(shí)間標(biāo)志置位
- firstin =0;
- Count=0;
- }
- else if((Count>=14)&&(tab[13] == '#')) //接收到設(shè)置時(shí)間段//**All notes can be deleted and modified**//
- {
- if(tab[2] == 'T')
- {
- dsHour_start_01 =( tab[3] - '0' )*10 + (tab[4]-'0'); //起始時(shí)間提取
- dsMin_start_01 =( tab[5] - '0' )*10 + (tab[6]-'0');
- dsHour_end_01 =( tab[8] - '0' )*10 + (tab[9]-'0'); //結(jié)束時(shí)間提取
- dsMin_end_01 =( tab[10] - '0' )*10 + (tab[11]-'0');
- }
- firstin =0;
- Count=0;
- }
- else if(Count>=20) //接收數(shù)據(jù)很長(zhǎng) 但是不是所需要的
- {
- firstin =0;
- Count=0;
- }
- }
- }
- if(TI) //如果是發(fā)送標(biāo)志位,清零
- TI=0;
- }
復(fù)制代碼
代碼:
51-162、程序-單片機(jī)源碼.zip
(90.66 KB, 下載次數(shù): 48)
2021-4-1 15:40 上傳
點(diǎn)擊文件名下載附件
下位機(jī)程序 下載積分: 黑幣 -5
|
評(píng)分
-
查看全部評(píng)分
|