您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 管理学资料 > 单片机温湿度采集C51程序
.../*------------------STC12C5410AD单片机ADC采集转换实验作者:刘会彬2009.04.21晚--------------------*/#includeSTC12C5410AD.H//如果调用这个头文件无需声明特殊功能寄存器#includeintrins.h//typedefunsignedcharU8;/*definedforunsigned8-bitsintegervariable无符号8位整型变量*/typedefsignedcharS8;/*definedforsigned8-bitsintegervariable有符号8位整型变量*/typedefunsignedintU16;/*definedforunsigned16-bitsintegervariable无符号16位整型变量*/typedefsignedintS16;/*definedforsigned16-bitsintegervariable有符号16位整型变量*/typedefunsignedlongU32;/*definedforunsigned32-bitsintegervariable无符号32位整型变量*/typedefsignedlongS32;/*definedforsigned32-bitsintegervariable有符号32位整型变量*/typedeffloatF32;/*singleprecisionfloatingpointvariable(32bits)单精度浮点数(32位长度)*/typedefdoubleF64;/*doubleprecisionfloatingpointvariable(64bits)双精度浮点数(64位长度)*///#defineucharunsignedchar#defineuintunsignedint#defineData_0_time4//unsignedchari;//----------------------------------------------////----------------IO口定义区--------------------////----------------------------------------------//sbitP2_0=P1^2;/*sbitP2_1=P2^1;sbitP2_2=P2^2;sbitP2_3=P2^3;*///----------------------------------------------////----------------定义区--------------------////----------------------------------------------//U8U8FLAG,k;U8U8count,U8temp;U8U8T_data_H,U8T_data_L,U8RH_data_H,U8RH_data_L,U8checkdata;...U8U8T_data_H_temp,U8T_data_L_temp,U8RH_data_H_temp,U8RH_data_L_temp,U8checkdata_temp;U8U8comdata;U8outdata[5];//定义发送的字节数U8indata[5];U8count,count_r=0;//U8str[5]={RS232};U16U16temp1,U16temp2;voiddelay1(unsignedintz){unsignedintx,y;for(x=0;xz;x++)for(y=0;y115;y++);}voiddelay(){unsignedcharx;for(x=0;x10;x++);}/*voidDelay(U16j){U8i;for(;j0;j--){for(i=0;i27;i++);}}voidDelay_10us(void){U8i;i--;i--;i--;i--;i--;i--;}*/voidCOM(void){...U8i;for(i=0;i8;i++){U8FLAG=2;while((!P2_0)&&U8FLAG++);/*for(i=0;i8;i++){Delay_10us();Delay_10us();Delay_10us();}*/delay();U8temp=0;if(P2_0)U8temp=1;U8FLAG=2;while((P2_0)&&U8FLAG++);//超时则跳出for循环if(U8FLAG==1)break;//判断数据位是0还是1//如果高电平高过预定0高电平值则数据位为1U8comdata=1;U8comdata|=U8temp;//0}//rof}//--------------------------------//-----湿度读取子程序------------//--------------------------------//----以下变量均为全局变量--------//----温度高8位==U8T_data_H------//----温度低8位==U8T_data_L------//----湿度高8位==U8RH_data_H-----//----湿度低8位==U8RH_data_L-----//----校验8位==U8checkdata-----//----调用相关子程序如下----------//----Delay();,Delay_10us();,COM();//--------------------------------voidRH(void){//主机拉低1-5msP2_0=0;delay1(6);P2_0=1;...//总线由上拉电阻拉高主机延时40us/*for(i=0;i8;i++){Delay_10us();Delay_10us();Delay_10us();Delay_10us();}*/delay();//主机设为输入判断从机响应信号P2_0=1;//判断从机是否有低电平响应信号如不响应则跳出,响应则向下运行if(!P2_0)//T!{U8FLAG=2;//判断从机是否发出80us的低电平响应信号是否结束while((!P2_0)&&U8FLAG++);U8FLAG=2;//判断从机是否发出80us的高电平,如发出则进入数据接收状态while((P2_0)&&U8FLAG++);//数据接收状态COM();U8RH_data_H_temp=U8comdata;COM();U8RH_data_L_temp=U8comdata;COM();U8T_data_H_temp=U8comdata;COM();U8T_data_L_temp=U8comdata;COM();U8checkdata_temp=U8comdata;P2_0=1;//数据校验U8temp=(U8T_data_H_temp+U8T_data_L_temp+U8RH_data_H_temp+U8RH_data_L_temp);if(U8temp==U8checkdata_temp)if(1){U8RH_data_H=U8RH_data_H_temp;U8RH_data_L=U8RH_data_L_temp;U8T_data_H=U8T_data_H_temp;U8T_data_L=U8T_data_L_temp;U8checkdata=U8checkdata_temp;...}//fi}//fi}//----------------------//P2_1=0;//T//P2_1=1;//T//----------------------//----------------------//P2_1=0;//T//P2_1=1;//T//----------------------//----------------------------------------------//main()功能描述:AT89C5111.0592MHz串口发//送温湿度数据,波特率9600//----------------------------------------------//voidmain()//{//U8i,j;//ucharstr[6]={RS232};/*系统初始化*///TMOD=0x20;//定时器T1使用工作方式2//TH1=253;//设置初值//TL1=253;//TR1=1;//开始计时//SCON=0x50;//工作方式1,波特率9600bps,允许接收//ES=1;//EA=1;//打开所以中断//TI=0;//RI=0;//SendData(str);//发送到串口//Delay(1);//延时100US(12M晶振)//while(1)//{//------------------------//调用温湿度读取子程序//RH();//串口显示程序//--------------------------//str[0]=U8RH_data_H;//str[1]=U8RH_data_L;//str[2]=U8T_data_H;//str[3]=U8T_data_L;...//str[4]=U8checkdata;//SendData(str);//发送到串口//读取模块数据周期不易小于2S//Delay(20000);//}//elihw//}//main/*voidRSINTR()interrupt4using2{U8InPut3;if(TI==1)//发送中断{TI=0;if(count!=5)//发送完5位数据{SBUF=outdata[count];count++;}}if(RI==1)//接收中断{InPut3=SBUF;indata[count_r]=InPut3;count_r++;RI=0;if(count_r==5)//接收完4位数据{//数据接收完毕处理。count_r=0;str[0]=indata[0];str[1]=indata[1];str[2]=indata[2];str[3]=indata[3];str[4]=indata[4];P0=0xfe;}}}*/unsignedcharcodeseg[]={0XC0,0XF9,0XA4,0XB0,0X99,0X92,0X82,0XF8,0X80,0X90,0X40,0X79,0X24,0X30,0X19,0X12,0X02,0X78,0X00,0X10};...unsignedlonginta,b;#defineSPE(x)(((x&0x3)5))#defineCHS(x)((x&0x7))#defineSETSPE(x)\{\ADC_CONTR&=~0x60;\ADC_CONTR|=SPE(x);\}#defineSETCHS(x)\{\ADC_CONTR&=~0x7;\ADC_CONTR|=CHS(x);\}#defineADC_ON()ADC_CONTR|=(17);#defineADC_OFF()ADC_CONTR&=~(17);#defineADC_STAR()ADC_CONTR|=(13);ADC_CONTR&=~(14);#defineADC_STOP()ADC_CONTR&=~(13);#defineADC_OK(ADC_CONTR&(14))unsignedintGetADC(unsignedcharin)//ADC输入函数:{unsignedinttmp;if((ADC_CONTR&0x80))//AD电源打开{//初始化ADC_CONTR=0xe0;//速度4(210clk),通道0,没有开始SETCHS(in);//设置通道ADC_STAR();//开始转换while(!ADC_OK);//等待转换结束//保存结果tmp=ADC_DATA;tmp=2;tmp|=ADC_LOW2;ret
三七文档所有资源均是用户自行上传分享,仅供网友学习交流,未经上传用户书面授权,请勿作他用。
本文标题:单片机温湿度采集C51程序
链接地址:https://www.777doc.com/doc-6011766 .html