ImageVerifierCode 换一换
格式:DOCX , 页数:26 ,大小:1.08MB ,
资源ID:18224869      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/18224869.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(51单片机新手入门之Modbus通讯Word文档下载推荐.docx)为本站会员(b****6)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

51单片机新手入门之Modbus通讯Word文档下载推荐.docx

1、/MAX1241 模数芯片引脚设置,此电路板我没焊_/sbit ADC_CS=P01;/sbit ADC_CLK=P00;/sbit ADC_DOUT=P02;sbit ADC_CS=P36;sbit ADC_CLK=P35;sbit ADC_DOUT=P37;/LCD12864 LCD屏幕引脚设置sbit cs=P22;sbit sid=P21;sbit sclk=P20;sbit DQ=P01; /DS18B20 温度引脚设置,依然没有#define N 11#define N2 20void delayms(unsigned char t) unsigned char i; unsign

2、ed char j; for(j=t;j;j-) for(i=192;i;i-);/*1ms延时*/void delayus(uint t) uint i; for(i=0;i9) hich+=7; if(loch 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)/计算校验码 uchar i; unsigned int sum

3、=0; uchar hi, lo; /uchar len = 12; for(i = 1; i 9) hi += 7; if(lo 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; sendbuffer1=0x30; sendbuffer2=0x30; sendbuffer3=0x30; sendbuffer4=0x30; send

4、buffer5=0x30; sendbuffer6=0x7C; sendbuffer7=0x30; sendbuffer8=0x30; sendbuffer9=0x30; sendbuffer10=0x30; sendbuffer11=0x30;/TEM sendbuffer12=0x30; sendbuffer13=0x30; sendbuffer14=0x5D; sendbuffer15=0x0D; sendbuffer16=0x0A;void calculate_module(unsigned char str)/lcd屏显示 unsigned int concen; uchar wan

5、,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 d4-=7; if(d3 d3-=7; if(d2 d2-=7; if(d1 d1-=7; concen = d4*4096+d3*256+d2*16+d1; gascon=concen; w

6、an=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()/气体模块初始化 Send_Buff0 = :; Send_Buff3 = 0 Send_Buff4 = 3 Send_Buff

7、5 = Send_Buff6 = Send_Buff7 = Send_Buff8 = A Send_Buff9 = Send_Buff10 = Send_Buff11 = Send_Buff12 = 1 Send_Buff1 = Creat_Addr(31, 1); Send_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;/手动添加校验,例如字

8、符0换成ASCII码0X30,添加偶校验后就是0X3A,最终发送给模块的以下数据,地址被写死,这个不像C#做的一目了然O(_)O test0=0X3A; test1=0XB1; test2=0XC6; test3=0X30; test4=0X33; test5=0X30; 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芯

9、片处理 uint ADC_Data; ADC_CLK=0; ADC_CS=0; ADC_Data=0; while(!ADC_DOUT); ADC_CLK=1;12; ADC_Data=1; ADC_Data |= ADC_DOUT; ADC_CS=1; return ADC_Data;unsigned int ad_filter()/滤波 unsigned int count1,i,j; unsigned int value_bufN; unsigned int temp; for (count1=0;count1N;count1+) value_bufcount1 =read_max124

10、1(); delayms(20); for (j=0;jvalue_bufi+1 ) temp = value_bufi; value_bufi = value_bufi+1; value_bufi+1 = temp; for(count1=3;(N-3); sum += value_bufcount1; return (unsigned int)(sum/(N-6);void calculate_o2()/测试用 uint con_fin=0; ad_data=ad_filter(); ad_vol=(ad_data/4096.0)*2500.0;/Voltage ad_data=(uint

11、)ad_vol; /concentration delayms(2); if(average_counter0) sum_o2+= ad_data; oldtempaverage_counter-1=ad_data; average_counter-; else sum_o2 -=oldtemp19; for(i=20;i0;i-) oldtempi=oldtempi-1; oldtemp0=ad_data; sum_o2+=oldtemp0; con_fin=(uint)(sum_o2/N2); /O2_con=0.8*con_fin+0.2*pre_contemp; /pre_contem

12、p=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 温度显示 复位函数-void ow_reset(void) char presence=1; while(presen

13、ce) while(presence) DQ=1; delayus(2); DQ=0; / delayus(550); / 550us / delayus(66); / 66us presence=DQ; delayus(500); /延时500us presence = DQ; DQ=1; /-18B20写命令函数-void write_byte(uchar val) for (i=8; i i-) / DQ = 0; delayus(5);/5us DQ = val&0x01; /66us val=val/2; DQ = 1; delayus(11);/-18B20读一个字节函数-ucha

14、r read_byte(void) uchar value = 0; value delayus(4); /4us DQ = 1; /4us if(DQ)value|=0x80; return(value);void Read_Temperature(void) unsigned int Temp1,Temp2; uchar bai,shi,ge; ow_reset(); /DS18B20 write_byte(0xCC); write_byte(0x44); /DS1302复位 write_byte(0xbe); Temp1=read_byte(); Temp2=read_byte(); t

15、emperature=(Temp28)|Temp1)*0.625); /0.0625=xx, 0.625=xx.x, 6.25=xx.xx bai=temperature/100; shi=temperature%100/10; ge=temperature%10; sendbuffer11=bai+0x30; sendbuffer12=shi+0x30; sendbuffer13=ge+0x30;* /图中电路板此部分没焊,此部分代码不使用_void writecmd_lcd(uchar cmd) /lcd屏写指令 uchar cmd1; cmd1=cmd; /-先写控制,选择写指令 ,还是

16、写数据111110005;i+) /必须sid先发送,然后sclk,不然不行 sid=1; sclk=1; sclk=0;3; sid=0; /delayms(10); cmd=cmd&0xf0; /先高4位8; if(cmd&0x80) else sid=0; cmd=cmd1; cmd1=(cmd14)&0xf0); /低4位 if(cmd1& cmd1=cmd1void writedata_lcd(uchar dat) uchar dat1; dat1=dat; /11111010 dat=dat& if(dat& dat=dat dat1=(dat1 if(dat1& dat1=dat1void init_lcd()/初始化lcd屏 cs=1; writecmd_lcd(0x30);/设定为8位控制 writecmd_lcd(0x0c);/显示打开 writecmd_lcd(0x01);/清屏void gotoxy(uint row, uint col) switch(row) case 1: writecmd_lcd(0x80+col);break; ca

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1