您的当前位置:首页单片机温湿度采集C51程序

单片机温湿度采集C51程序

来源:锐游网


单片机温湿度采集C51页)

--本页仅作为文档封面,使用时请直接删除即可-- --内页可以根据需求调整合适字体及大小--

程序总9

(/*------------------ STC12C5410AD单片机 ADC采集转换实验 作者:刘会彬 晚

--------------------*/

#include<>//如果调用这个头文件无需声明特殊功能寄存器 #include <> //

typedef unsigned char U8; /* defined for unsigned 8-bits integer variable 无符号8位整型变量 */

typedef signed char S8; /* defined for signed 8-bits integer variable 有符号8位整型变量 */

typedef unsigned int U16; /* defined for unsigned 16-bits integer variable 无符号16位整型变量 */

typedef signed int S16; /* defined for signed 16-bits integer variable 有符号16位整型变量 */

typedef unsigned long U32; /* defined for unsigned 32-bits integer variable 无符号32位整型变量 */

typedef signed long S32; /* defined for signed 32-bits integer variable 有符号32位整型变量 */

typedef float F32; /* single precision floating point variable (32bits) 单精度浮点数(32位长度) */

typedef double F64; /* double precision floating point variable (64bits) 双精度浮点数(64位长度) */ //

#define uchar unsigned char #define uint unsigned int #define Data_0_time 4 //unsigned char i;

//----------------------------------------------// //----------------IO口定义区--------------------// //----------------------------------------------// sbit P2_0 = P1^2; /*sbit P2_1 = P2^1 ; sbit P2_2 = P2^2 ; sbit P2_3 = P2^3 ;*/

//----------------------------------------------// //----------------定义区--------------------// //----------------------------------------------// U8 U8FLAG,k;

U8 U8count,U8temp;

U8 U8T_data_H,U8T_data_L,U8RH_data_H,U8RH_data_L,U8checkdata;

2

U8

U8T_data_H_temp,U8T_data_L_temp,U8RH_data_H_temp,U8RH_data_L_temp,U8checkdata_temp; U8 U8comdata;

U8 outdata[5]; //定义发送的字节数 U8 indata[5];

U8 count, count_r=0; //U8 str[5]={\"RS232\ U16 U16temp1,U16temp2;

void delay1(unsigned int z) { unsigned int x,y; for(x=0;xvoid delay() { unsigned char x; for(x=0;x<10;x++); }

/*void Delay(U16 j) {

U8 i; for(;j>0;j--) { for(i=0;i<27;i++); } }

void Delay_10us(void) { U8 i; i--; i--; i--; i--; i--; i--; }*/

void COM(void) {

3

U8 i; for(i=0;i<8;i++) { U8FLAG=2; while((!P2_0)&&U8FLAG++); /* for(i=0;i<8;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高电平值则数据位为 1 U8comdata<<=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(); //--------------------------------

void RH(void) { //主机拉低 1-5ms P2_0=0; delay1(6); P2_0=1;

4

//总线由上拉电阻拉高 主机延时40us /* for(i=0;i<8;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;

5

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()功能描述: AT89C51 串口发 //送温湿度数据,波特率 9600

//---------------------------------------------- //void main() //{ //U8 i,j; //uchar str[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;

6

// str[2]=U8T_data_H; // str[3]=U8T_data_L; // str[4]=U8checkdata; // SendData(str) ; //发送到串口 //读取模块数据周期不易小于 2S // Delay(20000); // }//elihw //}// main

/*void RSINTR() interrupt 4 using 2 { U8 InPut3; 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; } } }*/

unsigned char code seg[]={ 0XC0,0XF9,0XA4,0XB0,0X99, 0X92,0X82,0XF8,0X80,0X90,

7

0X40,0X79,0X24,0X30,0X19, 0X12,0X02,0X78,0X00,0X10};

unsigned long int a,b;

#define SPE(x) (((x & 0x3) << 5)) #define CHS(x) ((x & 0x7))

#define SETSPE(x) \\ {\\

ADC_CONTR &= ~0x60;\\ ADC_CONTR |= SPE(x);\\ }

#define SETCHS(x) \\ {\\

ADC_CONTR &= ~0x7;\\ ADC_CONTR |= CHS(x);\\ }

#define ADC_ON() ADC_CONTR |= (1<<7); #define ADC_OFF() ADC_CONTR &= ~(1<<7);

#define ADC_STAR() ADC_CONTR |= (1<<3); ADC_CONTR &= ~(1<<4); #define ADC_STOP() ADC_CONTR &= ~(1<<3);

#define ADC_OK (ADC_CONTR & (1<<4))

unsigned int GetADC(unsigned char in)//ADC输入函数: {

unsigned int tmp;

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; return tmp;

8

}

else {

ADC_ON(); return -1; } }

/************************************ 平滑滤波

************************************/ #define N 12

unsigned long int filter() { unsigned char count;

unsigned long int sum = 0; for ( count=0;countsum += GetADC(0x00); //delay1(1); }

return (unsigned long int)(sum/N); }

/********************************** 消抖滤波法

**********************************/ /*#define N 12

unsigned long int filter() { char count=0; unsigned long int value; unsigned long int new_value; new_value = GetADC(0x07); while (value!=new_value) { count++; if (count>=N) return new_value; //delay1(1); new_value = GetADC(0x07); } return value; }*/

/*********************************/

9

void xianshi()//显示子程序 { P3=0xff; P2=seg[a/1000]; delay1(5); P3=0xfe; delay1(5); P3=0xff; P2=seg[a%1000/100]; delay1(5); P3=0xfd; delay1(5); P3=0xff; P2=seg[a%100/10]; delay1(5); P3=0xfb; delay1(5); P3=0xff; P2=seg[a%10]; delay1(5); P3=0xf7; delay1(5); }

void main() { while(1) { RH(); a=U8RH_data_H; a<<=8; a|=U8RH_data_L; xianshi(); } }

10

11

因篇幅问题不能全部显示,请点此查看更多更全内容

Top