熱門: 51單片機(jī) | 24小時(shí)必答區(qū) | 單片機(jī)教程 | 單片機(jī)DIY制作 | STM32 | Cortex M3 | 模數(shù)電子 | 電子DIY制作 | 音響/功放 | 拆機(jī)樂園 | Arduino | 嵌入式OS | 程序設(shè)計(jì)
|
發(fā)布時(shí)間: 2026-1-30 14:08
正文摘要:#include <bianliang.h> #include <EEPROM.H> #include <Uart.h> #include <zk.h> #include <ir_nec.h> #include <DS3231.h> #include "nongli.h" #include <DS18b20.h> #i ... |
|
#include <string.h> void UartInit4800(void) //4800bps@30.000MHz { SCON = 0x50; //8位數(shù)據(jù),可變波特率 AUXR |= 0x40; //定時(shí)器1時(shí)鐘為Fosc,即1T AUXR &= 0xFE; //串口1選擇定時(shí)器1為波特率發(fā)生器 TMOD &= 0x0F; //設(shè)定定時(shí)器1為16位自動(dòng)重裝方式 TL1 = 0xE5; //設(shè)定定時(shí)初值 TH1 = 0xF9; //設(shè)定定時(shí)初值 ET1 = 0; //禁止定時(shí)器1中斷 TR1 = 1; //啟動(dòng)定時(shí)器1 ES = 1; //使能串口1中斷 EA = 1; } void UartInit9600(void) //9600bps@30MHz { SCON = 0x50; //8位數(shù)據(jù),可變波特率 AUXR |= 0x40; //定時(shí)器1時(shí)鐘為Fosc,即1T AUXR &= 0xFE; //串口1選擇定時(shí)器1為波特率發(fā)生器 TMOD &= 0x0F; //設(shè)定定時(shí)器1為16位自動(dòng)重裝方式 TL1 = 0xF3; //設(shè)定定時(shí)初值 TH1 = 0xFC; //設(shè)定定時(shí)初值 ET1 = 0; //禁止定時(shí)器1中斷 TR1 = 1; //啟動(dòng)定時(shí)器1 ES = 1; //使能串口1中斷 EA = 1; } void UartInit1152(void) //115200bps@30.000MHz { SCON = 0x50; //8位數(shù)據(jù),可變波特率 AUXR |= 0x40; //定時(shí)器1時(shí)鐘為Fosc,即1T AUXR &= 0xFE; //串口1選擇定時(shí)器1為波特率發(fā)生器 TMOD &= 0x0F; //設(shè)定定時(shí)器1為16位自動(dòng)重裝方式 TL1 = 0xBF; //設(shè)定定時(shí)初值 TH1 = 0xFF; //設(shè)定定時(shí)初值 ET1 = 0; //禁止定時(shí)器1中斷 TR1 = 1; //啟動(dòng)定時(shí)器1 ES = 1; //使能串口1中斷 EA = 1; } void UartInit(){ switch(bps) { case 0:// UartInit1152(); break; case 1:// UartInit9600(); break; case 2:// UartInit4800(); break; default: UartInit1152(); break; } } void Uart() interrupt 4 using 1 { uchar data Rx_temp ; static uchar fg_count=0; //數(shù)據(jù)間隔,計(jì)數(shù) static uchar Rx_count=0; static uchar n=0; //握手信號計(jì)數(shù) static uchar da_count=0; //數(shù)據(jù)計(jì)數(shù) uchar idata GPRMC[6]={0x24,0x47,0x50,0x52,0x4D,0x43}; //GPS選擇接收字符$GPRMC, uchar idata GPVTG[6]={0x24,0x47,0x50,0x56,0x54,0x47}; //GPS選擇接收字符$GPVTG, if(RI) { RI=0; Rx_temp=SBUF; /******* 監(jiān)控握手信號進(jìn)行軟件復(fù)位自動(dòng)下載 ******/ if(Rx_temp==0x7f) { //STC下載指令是0x7f n++; if(n>20) //如果連續(xù)收到20次0x7f { IAP_CONTR=0x60; //復(fù)位至ISP區(qū) n=0; } } else n=0; /********* GPS數(shù)據(jù)處理 **************/ if(Rx_count<6) { if(Rx_temp==GPRMC[Rx_count]) //比較開始$GPRMC字符, Rx_count++; else Rx_count=0; } else //找到GPRMC開始保存數(shù)據(jù) { if(Rx_temp==',') //如果收到逗號, { fg_count++; //計(jì)數(shù)增加 da_count=0; } else { if(fg_count==1) //保存時(shí)間數(shù)據(jù) { if(da_count<6) //只保存前6位時(shí)間數(shù)據(jù) SJ[da_count++]=Rx_temp; } else if(fg_count==2) //保存定位信息 { if(Rx_temp=='A') //如果收到A DW_OK=1; //則定位成功 else DW_OK=0; } /*****************************************************/ else //緯度 if(fg_count==3) //保存定位信息 { if(da_count<10) //只保存前10位時(shí)間數(shù)據(jù) weidu[da_count++]=Rx_temp; } else //緯度半球N(北半球)或S(南半球) if(fg_count==4) //保存定位信息 { NS=Rx_temp; } else//經(jīng)度 if(fg_count==5) //保存定位信息 { if(da_count<10) //只保存前10位時(shí)間數(shù)據(jù) jindu[da_count++]=Rx_temp; } else //經(jīng)度半球E(東經(jīng))或W(西經(jīng)) if(fg_count==6) //保存定位信息 { EW=Rx_temp; } else //地面速率(000.0~999.9節(jié),前面的0也將被傳輸) if(fg_count==7) //保存定位信息 { if(da_count<5) //只保存前10位時(shí)間數(shù)據(jù) shudu[da_count++]=Rx_temp; } /*****************************************************/ else if(fg_count==9) //保存日期數(shù)據(jù) RQ[da_count++]=Rx_temp; else if(fg_count>9) //接收完畢 { RX_over=1; fg_count=0; da_count=0; Rx_count=0; } } } /************************************************ if (Rx_temp == '$') //如果收到字符'$',便開始接收 { rev_start = 1; rev_stop = 0; } if (rev_start == 1) //標(biāo)志位為1,開始接收 { rev_buf[num++] = Rx_temp; //字符存到數(shù)組中 if (Rx_temp == '\n') //如果接收到換行 { rev_buf[num] = '\0'; rev_start = 0; rev_stop = 1; //gps_flag = 1; num = 0; } } *************************************************/ } } double Str_To_Double(char *buf) { xdata double rev_d = 0; xdata uchar dat; xdata uchar integer = 1; xdata char *str = buf; xdata int i; while(*str != '\0') { switch(*str) { case '0': dat = 0; break; case '1': dat = 1; break; case '2': dat = 2; break; case '3': dat = 3; break; case '4': dat = 4; break; case '5': dat = 5; break; case '6': dat = 6; break; case '7': dat = 7; break; case '8': dat = 8; break; case '9': dat = 9; break; case '.': dat = '.'; break; } if(dat == '.') { integer = 0; i = 1; str ++; continue; } if( integer == 1 ) { rev_d = rev_d * 10 + dat; } else { if(i<10000) rev_d = rev_d + dat / (10 * i); i = i * 10 ; } str ++; } return rev_d; } float Str_To_Float(char *buf) { xdata float rev = 0; xdata uchar dat; xdata uchar integer = 1; xdata char *str = buf; xdata int i; while(*str != '\0') { switch(*str) { case '0': dat = 0; break; case '1': dat = 1; break; case '2': dat = 2; break; case '3': dat = 3; break; case '4': dat = 4; break; case '5': dat = 5; break; case '6': dat = 6; break; case '7': dat = 7; break; case '8': dat = 8; break; case '9': dat = 9; break; case '.': dat = '.'; break; } if(dat == '.') { integer = 0; i = 1; str ++; continue; } if( integer == 1 ) { rev = rev * 10 + dat; } else { rev = rev + dat / (10 * i); i = i * 10 ; } str ++; } return rev; } void Int_To_Str(int x,char *Str) { xdata int t; xdata char *Ptr,Buf[5]; xdata int i = 0; Ptr = Str; if(x < 10) // 當(dāng)整數(shù)小于10時(shí),轉(zhuǎn)化為"0x"的格式 { *Ptr ++ = '0'; *Ptr ++ = x+0x30; } else { while(x > 0) { t = x % 10; x = x / 10; Buf[i++] = t+0x30; // 通過計(jì)算把數(shù)字轉(zhuǎn)化成ASCII碼形式 } i -- ; for(;i >= 0;i --) // 將得到的字符串倒序 { *(Ptr++) = Buf[i]; } } *Ptr = '\0'; } void utc2btc(){ uchar xdata max; shi=(SJ[0]-0x30)*10 + (SJ[1]-0x30); //時(shí) fen=(SJ[2]-0x30)*10 + (SJ[3]-0x30); //分 miao=(SJ[4]-0x30)*10 + (SJ[5]-0x30); //秒 ri=(RQ[0]-0x30)*10 + (RQ[1]-0x30); //日 yue=(RQ[2]-0x30)*10 + (RQ[3]-0x30); //月 nian=(RQ[4]-0x30)*10 + (RQ[5]-0x30); //年 shi+=8; //轉(zhuǎn)換為北京時(shí)間 ,東8區(qū)要+8 if(shi>23) //如果超過23則到了第二天 { shi-=24; // ri+=1; //日+1 switch(yue) //獲取每月最大天數(shù) { case 2: //2月 if(nian%4==0) //判斷是否閏月,只取2000-2099年,因此簡單的%4運(yùn)算 max=29; //閏月29天 else max=28; //正常28天 break; case 4: case 6: case 9: case 11: //4,6,9,11月 max=30; //30天 break; default: max=31; //其他月份1,3,5,7,8,10,12月31天 break; } if(ri>max) { yue+=1; ri=1; if(yue>12) { nian+=1; yue=1; } } } } |
| 不知道怎么搞,有人知道嗎 |
Powered by 單片機(jī)教程網(wǎng)