51單片機(jī)新手入門之Modbus通訊_第1頁(yè)
51單片機(jī)新手入門之Modbus通訊_第2頁(yè)
51單片機(jī)新手入門之Modbus通訊_第3頁(yè)
51單片機(jī)新手入門之Modbus通訊_第4頁(yè)
51單片機(jī)新手入門之Modbus通訊_第5頁(yè)
已閱讀5頁(yè),還剩16頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、51單片機(jī)新手入門之Modbus通訊本文和另一篇-C# WPF手入門之Modbus通訊為一個(gè)系列,所用模塊均 是氣體分析模塊,之前用C3做的上位機(jī)(主要是方便調(diào)試,單片機(jī)不好搞),既 然電腦上串口通訊代碼沒(méi)問(wèn)題,那么放到單片機(jī)稍加修改也就理所當(dāng)然肯定可行 o( n _n)o。未文包括單片機(jī)的電路設(shè)計(jì)和軟彳設(shè)計(jì)兩部分(單片機(jī)采用STC12C5A60S2雙串口),至此單片機(jī)和上位機(jī)的串口通訊均成功實(shí)現(xiàn),供需要的同學(xué)參考。1.電路設(shè)計(jì)21Altium Designer原理圖如下:電源部分:24V轉(zhuǎn)5V及6VModbus通訊預(yù)留接口,可以另接MAX232用 來(lái)調(diào)試發(fā)送給模塊數(shù)據(jù)正確性實(shí)際效果如下:9S

2、3C5ig:RLF千.V4.33諭4TC-ISP.MB第酗及官石阿站:muvt.nCMCU.tDtn技術(shù)至全5 L/符湮匚fr." F;1- t :iTjm土程與真件| LEPW文件串口助手工卷文件 除4山犍*匕送*尸中匚IT下載步驟3.打開hex文TOJR MOT X000 2130al7 K" % 二小日 urx.3 H并 EttKCJf 嵬件£tr-K- |rrw4 t下載步驟2.打開串口二口工門amxcmEg向率iu+ h,咫沃iu平 pmwrM叫"與帆:】增科于忙右FFi 詵IT中的iUf下次冷啟動(dòng)后燈牌原為:向鄙肛:振蕩召反夕陽(yáng)謖體前耕ES5

3、EV p":氏忸士 L丸用鄙正振防陰光HSTT腳*仇為SEE:上電復(fù)住幫加雨站叼宴庇延時(shí);慍拓群碩大增前(12MHz以下可選56:足的 r ho濘 High C 5下次序啟動(dòng)Fl.WH 1.:博與下竟無(wú)關(guān) 廠等于02才可以不知懷 下次不乾用月底用理厚時(shí)M均慍口回四和到為' YIC ,宜制生G部.林切兩rrj;身復(fù)位一舟帆)W國(guó)京不敢苜串所叔久i r當(dāng)目標(biāo)歸碼史旺出下載步驟4. MCU先斷電,點(diǎn) 擊下載,看到提示后上電0K /下式0E。工/ord 00 03;t-pi 00 os4=4 tin43/ ”grs tsnts/p Enaryjt OK*已加LJxm 30000 =1

4、3000 .iJJ.U XUXi cxooo J JU I I iD1T1T1 r.uj j劃為m: B】a»1 皿二m 劃如口 mmm. Rimxo 劃mm3319X0. 2m處工 3315303 XIISDOO: :mmm juijjj: XU5QXI; oiBoaosI IL-. Li 可T“ aisro: GDI3nl鼻享書需箕法叵質(zhì)運(yùn)宇匕密 度Ii電腦串口接收到的數(shù)據(jù),1C11目擊苛子她.同弭和LCD屏顯示的是一樣的ty . J1C7 M-npr Jr. gmi"十六運(yùn)制發(fā)送都遺附區(qū),享若梅火£送自動(dòng)空?qǐng)D到標(biāo)全批一一百亞姓打開笈i和口r下載后打開用口盎/

5、翁工:3Q發(fā)送計(jì)粉。匚:磊守工技COfEH;J裝甘圭快而三帙蛤故散掘位舊,|停止位卜2.軟件設(shè)計(jì)這里最麻煩的在于模塊的Modbus通訊需要偶校驗(yàn),我是手動(dòng)添加的校 驗(yàn)位,例如字符'0'換成ASCII碼0X30,添加偶校驗(yàn)后就是0X3A,把所 有需要發(fā)送的數(shù)據(jù)一個(gè)個(gè)手動(dòng)添加了再發(fā)送A_A;另外lcd12864屏也搞半天,主要照著時(shí)序圖寫必須sid先發(fā)送,然后sclk ,不然不行一口一。氣體模塊詳細(xì)的通訊協(xié)議參考和上位機(jī)通訊那篇,此處不再介紹。圖中電路板沒(méi)有焊 AD芯片和溫度芯片,引腳備用,相關(guān)代碼注釋掉了。代碼如下:#include "STC12C5A60S2.H&qu

6、ot;#include <intrins.H>.頭文件#define uchar unsigned char#define uint unsigned intuchar sendbuffer17;/發(fā)送數(shù)據(jù)uchar flag=0;uchar re_buffer32;uchar count=0;uint ad_data=0;double ad_vol=0;uint con_mid=0;uint gascon=0;long sum_o2=0;uint average_counter=20;uint idata oldtemp21;uchar idata Send_Buff20; /m

7、oduleuint pre_contemp=0;uint O2_con=0;uchar idata test21; /moduleuint temperature=0;uint dat;uint testlcd=0;uchar c尸0xb0,0xb1,0xb2,0xb3,0xb4,0xb5,0xb6,0xb7,0xb8,0xb9;/MAX1241模數(shù)芯片引腳設(shè)置,此電路板我沒(méi)焊 a_a/sbit ADC_CS=P0A1;/sbit ADC_CLK=P0A0;/sbit ADC_DOUT=P0A2;sbit ADC_CS=P3A6;sbit ADC_CLK=P3A5;sbit ADC_DOUT=

8、P3A7;/LCD12864 LCD 屏幕引腳設(shè)置sbit cs=P2A2;sbit sid=P2A1;sbit sclk=P2A0;sbit DQ=P0A1;/DS18B20 溫度引腳設(shè)置,依然沒(méi)有#define N 11#define N2 20void delayms(unsigned char t)unsigned char i;unsigned char j;for(j=t;j;j-)for(i=192;i;i-);/*1ms延時(shí) */void delayus(uint t)uint i;for(i=0;i<t;i+)_nop_();void delay(float sec)u

9、nsigned int i;unsigned int j;j=sec*100;while(j-)i=1561;while(-i);void UART1_init() / 串口 1 初始化,此串口和電腦通訊TMOD=0x20;股置定時(shí)器工作方式2TH1=0xfd; / 波特率 9600TL1=0xfd;TR1=1;REN=1;SM0=0;SM1=1;/ES=1;void UART2_init()/S2CON= 0x50;BRT = 0xf4;2 初始化,和模塊通訊Modbus/ 方式 1,允許接收/ 波特率 2400AUXR = AUXR |0X10; / 允許獨(dú)立波特率允許AUXR1 = AU

10、XR1&0xef;IE2 = IE2|0X01;/ 將 uart2 切換到 P1 口/ 允許串口2 中斷void UART1_Send (unsigned char UART_data)/ /ES=0;SBUF = UART_data;while(TI!=1);TI = 0;/ES=1;/ 將接收的數(shù)據(jù)發(fā)送回去/ 檢查發(fā)送中斷標(biāo)志位/ 另發(fā)送中斷標(biāo)志位為void UART2_Send(unsigned char UART_data)/ /ES = 0 ;S2BUF = UART_data;while(S2CON&0x02)!=0x02);S2CON &= 0x02;/E

11、S = 1 ;void UART1_Send_String (char *str, char len)/ 2 發(fā)送1 發(fā)送字符串unsigned char i;for(i=0;i<=len;i+)UART1_Send(stri);void UART2_Send_String (char *str, char len) /串口 2 發(fā)送字符串unsigned char i; for(i=0;i<=len;i+)UART2_Send(stri);unsigned char Creat_Addr(unsigned char adr, unsigned char position)/計(jì)算模

12、塊地址unsigned char hich;unsigned char loch;hich = adr/16;loch = adr%16;if(hich>9)hich+=7;if(loch>9)loch+=7;if(position = 1) return hich+0x30;else if(position = 0) return loch+0x30;unsigned char CheckSum(unsigned char *str, unsigned char position, uchar len)/ 計(jì)算校驗(yàn)碼uchar i;unsigned int sum=0;uchar

13、 hi, lo;/uchar len = 12;for(i = 1; i <= len; i +) *str +;sum += *str;sum = 256-(sum%256);hi = sum/16;lo = sum%16;if(hi > 9)hi += 7;if(lo > 9)lo += 7;hi += 0x30;lo += 0x30;if(sum = 256)hi = lo = 0x30;if(position = 1)return hi;else if(position = 0)return lo;void data_init()sendbuffer0=0x5B;se

14、ndbuffer1=0x30;sendbuffer2=0x30;sendbuffer3=0x30;sendbuffer4=0x30;sendbuffer5=0x30;sendbuffer6=0x7C;sendbuffer7=0x30;sendbuffer8=0x30;sendbuffer9=0x30;sendbuffer10=0x30;sendbuffer11=0x30;/TEMsendbuffer12=0x30;sendbuffer13=0x30;sendbuffer14=0x5D;sendbuffer15=0x0D;sendbuffer16=0x0A;void calculate_modu

15、le(unsigned char str)/lcd屏顯示unsigned int concen; uchar wan,qian,bai,shi,ge;/*uchar d4 = str7-48;uchar d3 = str8-48;uchar d2 = str9-48;uchar d1 = str10-48;*/ /濃度只需要后面部分uchar d4 = str24-48;uchar d3 = str25-48;uchar d2 = str26-48;uchar d1 = str27-48;if(d4>9)d4-=7;if(d3>9)d3-=7;if(d2>9)d2-=7;if

16、(d1>9)d1-=7;concen = d4*4096+d3*256+d2*16+d1;gascon=concen;wan=concen/10000;qian=concen%10000/1000;bai=concen%1000/100;shi=concen%100/10;ge=concen%10;/sendbuffer6=wan+0x30; / 最終顯示XXX.X%sendbuffer7=qian+0x30;sendbuffer8=bai+0x30;sendbuffer9=shi+0x30;sendbuffer10=ge+0x30;void module_init()/ 氣體模塊初始化

17、Send_Buff0 = ':'Send_Buff3 = '0'Send_Buff4 = '3'Send_Buff5 = '0'Send_Buff6 = '0'Send_Buff7 = '0'Send_Buff8 = 'A'Send_Buff9 = '0'Send_Buff10 = '0'Send_Buff11 = '0'Send_Buff12 = '1'Send_Buff1 = Creat_Addr(31, 1);Se

18、nd_Buff2 = Creat_Addr(31,0);Send_Buff13 = CheckSum(Send_Buff, 1, 12);Send_Buff14 = CheckSum(Send_Buff, 0, 12);Send_Buff15 = 0x0D;Send_Buff16 = 0x0A;/手動(dòng)添加校驗(yàn),例如字符'0'換成ASCII碼0X30,添加偶校驗(yàn)后就是0X3A, 最終發(fā)送給模塊的以下數(shù)據(jù),地址被寫死,這個(gè)不像C#做的一目了然O(n_n)Otest0=0X3A;test1=0XB1;test2=0XC6;test3=0X30;test4=0X33;test5=0X3

19、0;test6=0X30;test7=0X30;test8=0X41;test9=0X30;test10=0X30;test11=0X30;test12=0XB1;test13=0X39;test14=0XB4;test15=0X8D;test16=0X0A;/*uint read_max1241() AD 芯片處理 uint ADC_Data;uchar i;ADC_CLK=0;ADC_CS=0;ADC_Data=0; while(!ADC_DOUT);ADC_CLK=1;ADC_CLK=0;for(i=0;i<12;i+) ADC_CLK=1;ADC_Data<<=1;A

20、DC_Data |= ADC_DOUT;ADC_CLK=0;ADC_CS=1;ADC_CLK=0;return ADC_Data;unsigned int ad_filter()/ 濾波unsigned int count1,i,j;unsigned int value_bufN;unsigned int temp;unsigned int sum=0;for (count1=0;count1<N;count1+)value_bufcount1 =read_max1241(); delayms(20);for (j=0;j<(N-1);j+)for (i=0;i<(N-j);

21、i+)if ( value_bufi>value_bufi+1 )temp = value_bufi;value_bufi = value_bufi+1;value_bufi+1 = temp;for(count1=3;count1<(N-3);count1+)sum += value_bufcount1;return (unsigned int)(sum/(N-6);void calculate_o2()/ 測(cè)試用uchar wan,qian,bai,shi,ge;uint con_fin=0;uchar i;ad_data=ad_filter();ad_vol=(ad_data

22、/4096.0)*2500.0;/Voltage ad_data=(uint)ad_vol; /concentrationdelayms(2);if(average_counter>0)sum_o2+= ad_data;oldtempaverage_counter-1=ad_data;average_counter-;elsesum_o2 -=oldtemp19;for(i=20;i>0;i-)oldtempi=oldtempi-1;oldtemp0=ad_data;sum_o2+=oldtemp0;con_fin=(uint)(sum_o2/N2);/O2_con=0.8*con

23、_fin+0.2*pre_contemp;/pre_contemp=O2_con;wan=con_fin/10000;qian=con_fin%10000/1000;bai=con_fin%1000/100;shi=con_fin%100/10;ge=con_fin%10;sendbuffer1=wan+0x30;sendbuffer2=qian+0x30;sendbuffer3=bai+0x30;sendbuffer4=shi+0x30;sendbuffer5=ge+0x30;delayms(5);/18B20 溫度顯示復(fù)位函數(shù)void ow_reset(void)char presence

24、=1;while(presence)while(presence)DQ=1;delayus(2);DQ=0; /delayus(550); / 550usDQ=1; /delayus(66); / 66uspresence=DQ;delayus(500); / 延時(shí) 500us presence = DQ;DQ=1;/18B20 寫命令函數(shù)void write_byte(uchar val)uchar i;for (i=8; i>0; i-) /DQ=1;delayus(2);DQ = 0;delayus(5);/5usDQ = val&0x01;delayus(66); /66

25、usval=val/2;DQ = 1;delayus(11);/18B20 讀一個(gè)字節(jié)函數(shù)uchar read_byte(void)uchar i;uchar value = 0;for (i=8;i>0;i-) DQ=1;delayus(2);value>>=1;DQ = 0;delayus(4); /4usDQ = 1;delayus(4); /4us if(DQ)value|=0x80; delayus(66); /66us DQ=1; return(value);void Read_Temperature(void)unsigned int Temp1,Temp2;

26、uchar bai,shi,ge;ow_reset();/DS18B20write_byte(0xCC);write_byte(0x44);ow_reset();/DS1302 復(fù)位write_byte(0xCC);write_byte(0xbe);Temp1=read_byte();Temp2=read_byte();ow_reset();0.625=xx.x,temperature=(Temp2<<8)|Temp1)*0.625); /0.0625=xx, 6.25=xx.xxbai=temperature/100;shi=temperature%100/10;ge=tempe

27、rature%10;sendbuffer11=bai+0x30;sendbuffer12=shi+0x30;sendbuffer13=ge+0x30;delayms(5);* /圖中電路板此部分沒(méi)焊,此部分代碼不使用A_Avoid writecmd_lcd(uchar cmd) /lcd 屏寫指令 uchar i;uchar cmd1;cmd1=cmd;/ 先寫控制,選擇寫指令,還是寫數(shù)據(jù)11111000for(i=0;i<5;i+) / 必須 sid 先發(fā)送,然后sclk ,不然不行sid=1;sclk=1;sclk=0;for(i=0;i<3;i+)sid=0;sclk=1;s

28、clk=0;/delayms(10);cmd=cmd&0xf0; / 先高 4 位for(i=0;i<8;i+) if(cmd&0x80) sid=1;else sid=0;sclk=1;sclk=0;cmd=cmd<<1;/delayms(10);低 4位cmd1=(cmd1<<4)&0xf0); / for(i=0;i<8;i+)if(cmd1&0x80)sid=1;else sid=0;sclk=1;sclk=0;cmd1=cmd1<<1;void writedata_lcd(uchar dat)uchar

29、i;uchar dat1;dat1=dat;/11111010for(i=0;i<5;i+)sid=1;sclk=1;sclk=0;sid=0;sclk=1;sclk=0;sid=1;sclk=1;sclk=0;sid=0;sclk=1;sclk=0;/delayms(10);dat=dat&0xf0;for(i=0;i<8;i+)if(dat&0x80)sid=1;else sid=0;sclk=1;sclk=0;dat=dat<<1;/delayms(10);dat1=(dat1<<4)&0xf0);for(i=0;i<8;

30、i+)if(dat1&0x80)sid=1;else sid=0;sclk=1;sclk=0;dat1=dat1<<1;void init_lcd()/ 初始化lcd 屏cs=1;設(shè)定為 8 位控制顯示打開清屏writecmd_lcd(0x30);/ writecmd_lcd(0x0c);/ writecmd_lcd(0x01);/ void gotoxy(uint row, uint col)switch(row)case 1: writecmd_lcd(0x80+col);break;case 2: writecmd_lcd(0x90+col);break;case 3: writecmd_lcd(0x88+col);break;case 4: writecmd_lcd(0x98+col);break;void clear()writecmd_lcd(0x01);delayms(10);void SendStr(uchar *str)uchar i;for(i=0;stri!='0'i+)writedata_lcd(stri);屏顯示濃度void lcd_display(uint lcddata)/lcduchar wan,qian,bai,shi,ge;wan=lcddata/10000;qian=lcddata%

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論