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