资源描述:
《第30章 单片机实现远程监控系统参考程序》由会员上传分享,免费在线阅读,更多相关内容在学术论文-天天文库。
1、#include//包含头文件#include//包含调令头文件typedefunsignedcharuchar;//新类型定义typedefunsignedintuint;//新类型定义sbitSCL=P2^7;//定义显示器时钟引脚sbitSDA=P2^6;//定义显示器数据引脚ucharsamplecnt;//采样次数变量ucharsamplev[6];//采样水位值ucharreceb[5];//接收缓冲区ucharsendb[6];//发送缓冲区ucharreceposi;//接收位置指针uchartimecnt;//定时器中断次数变
2、量#defineENDCHAR0X90//结束符#defineSTARTCHAR0XB0//起始符#defineSLAVEADD1//从机地址,不同从机值不同,要注意修改#defineREADCOMM'R'//读命令码ucharsendv;//传给上位机的水位值ucharsamplecon;//采样水位的控制位ucharcodedepthv[]={7,5,12,17,10,22,27,15,32,37,20,42,25,30,35,40,45,50};//水深表ucharcodevolvalue[]={13,20,25,35,41,46,56,61,66,76,82,87,97,102,
3、123,143,164,184,};//电压表#defineADCADDPORTP2//A/D数据地址口#defineADCDATAPORTP0//A/D数据口sbitSTARTADC=P2^4;//启动转换引脚sbitADCBUSY=P2^3;//转换结束引脚ucharcodeSEGCODE[]={0XC0,0XF9,0XA4,0XB0,0X99,0X92,0X82,0XF8,0X80,0X90};//显示段码/*入口参数:vl:采样的电压值出口参数:水深值*/ucharCov_Vol_Depth(ucharvl){uchari,m,n;for(i=0;i<19;i++){//查找采样
4、电压范围if(vln)returndepthv[i-1];//返回差值小的端点对应的水位值elsereturndepthv[i];}/*入口参数:无出口参数:A/D转换值*/ucharRead_Adc0809(){uchari;ADCADDPORT&=0xf8;//发通道地址号STARTADC=1;//发通道锁存及启动转换信号START
5、ADC=0;while(ADCBUSY==0);//等待转换结束i=ADCDATAPORT;//读取转换结果returni;}/*入口参数:无出口参数:水深值*/ucharSample_Depth(){uchari,j;uintm;i=Read_Adc0809();//启动一次转换j=Read_Adc0809();//启动第二次转换m=i+j;//求和i=m/2;//取平均值i=Cov_Vol_Depth(i);//转换成水位值returni;}voidSort_Data(){uchari,j,m;for(i=0;i<5;i++)//外重循环5次,每次找出最大的一个数for(j=i+1;
6、j<6;j++){if(samplev[i]7、到samplecnt=0;Sort_Data();//对数据排序j=0;//求和取平均值for(i=0;i<4;i++)j+=samplev[i];sendv=j/4;}}}/*入口参数:无出口参数:接收命令是否正确*/ucharCheck_Data(){uchari;if(receb[4]!=ENDCHAR)//检验结束符return0;i=receb[1]^receb[2];//生成校验和if(i!=receb[3])//检验检