基于AVR单片机的温湿度采集系统 - 图文 下载本文

内容发布更新时间 : 2024/5/22 5:25:04星期一 下面是文章的全部内容请认真阅读。

AVR单片机系统开发板

PQ-1A

速度:1MIPS/s 16K FLASH

512字节EEPROM 1K SRAM

JTAG接口、UART接口、SPI接口 I/O直接驱动数码管、LED、继电器等 功耗低、具有加密功能

5 选择DS18B20同时选择ICCAVR及AVR STUDIO进行编程及下载 关于程序设计:

#include //包含型号头文件 #include //包含\位\操作头文件 #include //标准输入输出头文件 #include //包含自定义常量头文件 #include \ //包含数码管显示函数

/******************************************* 函数名称: B20_init 功 能: 复位DS18B20 参 数: 无 返回值 : 无

/********************************************/ void B20_init(void) {

DDRA|=BIT(DS18B20); //配置为输出 PORTA&=~BIT(DS18B20); //拉低 Delayus(600); //等待600微秒 PORTA|=BIT(DS18B20); //释放总线 Delayus(60); //等待60微秒 DDRA&=~BIT(DS18B20); //配置为输入 while((PINA&(BIT(DS18B20)))); //等待DS18B20拉低

while(!(PINA&(BIT(DS18B20)))); //等待DS18B20释放总线 }

/******************************************* 函数名称: B20_readB

功 能: 读取一个字节的数据 参 数: 无

返回值 : retd--返回的一个字节数据

/********************************************/ uchar B20_readB(void) {

uchar i,retd=0;

for(i=0;i<8;i++) //位计数值 {

retd>>=1; //右移,准备接受新的数据位 DDRA|=BIT(DS18B20); //配置为输出 PORTA&=~BIT(DS18B20); //拉低,启动读数据位

6

PORTA|=BIT(DS18B20); //释放总线 Delayus(5); //等待5微秒 DDRA&=~BIT(DS18B20); //配置为输入,开始读取数据位 if(PINA&BIT(DS18B20)) //该位是否为高 {

retd|=0x80; //是就将此位置高 }

Delayus(50); //等待50微秒 }

return retd; //将读到的一个字节返回 }

/******************************************* 函数名称: B20_writeB

功 能: 写入一个字节的数据 参 数: wrd--要写入的数据 返回值 : 无

/********************************************/ void B20_writeB(uchar wrd) {

uchar i;

for(i=0;i<8;i++) //位计数值 {

DDRA|=BIT(DS18B20); //配置为输出 PORTA&=~BIT(DS18B20); //拉低,启动写数据位 Delayus(1); //等待1微秒 if(wrd&0x01) //此位数据是否为高 {

PORTA|=BIT(DS18B20); //是高则将单总线拉高 } else {

PORTA&=~BIT(DS18B20); //是低则将单总线拉低 }

Delayus(50); //等待50微秒 PORTA|=BIT(DS18B20); //释放总线 wrd>>=1; //右移,为写入新的数据位做准备 }

Delayus(50); //等待50微秒 }

/******************************************* 函数名称: Read_temp 功 能: 读取温度值 参 数: 无

返回值 : rettemp--返回的温度值

/********************************************/ uint Read_temp(void) {

uchar templ,temph; uint temp; B20_init(); //初始化,每次写命令都从初始化开始 B20_writeB(0xcc); //跳过ROM

B20_writeB(0x44); //启动温度转换 B20_init(); //初始化,每次写命令都从初始化开始 B20_writeB(0xcc); //跳过ROM B20_writeB(0xbe); //读寄存器 templ=B20_readB(); //读温度低字节 temph=B20_readB(); //读温度高字节

temp=templ+temph*256;//将温度整理成16位变量 return temp; //返回16位变量 }

/******************************************* 函数名称: Num_BCD 7

功 能: 将一个字节的整数转换成三位BCD码 参 数: num--需要转换的整数 返回值 : chr--三位BCD码数组指针

/********************************************/ uchar* Num_BCD(uint num) {

uchar i,chr[3]; uchar *rept; rept=&(chr[0]); //返回指针指向BCD码数组 for(i=0;i<3;i++) {

chr[2-i]=num; //对10取余数(其实是求模,但是对于正数,取余与求模是相等的) num/=10; //除以10,为取出下一位做准备 }

return rept; //返回指针 }

/******************************************* 函数名称: main

功 能: 完成温度的读取与显示 参 数: 无 返回值 : 无

/********************************************/ void main(void) {

uint t;

uchar *temppt; uchar i,temp[3]; Board_init( ); //初始化开发板 while(1) {

t=Read_temp(); //读取温度值 t*=0.625; //转换成实际温度的10倍 temppt=Num_BCD(t);//将实际温度的10倍转换成BCD码 for(i=0;i<3;i++) //将转换后的BCD码存入显示数组 {

temp[i]=*(temppt+i); }

for(i=0;i<3;i++) //显示温度 {

if(i==1) {

temp[1]+=16; //如果是各位,则加上小数点(数码管的译码数组有所改变,读者可以看10_DS18B20文件夹下的SMG.C文件) }

One_smg_display(temp[i],i+1); Delayms(5); } } }

大致流程图:

8

6 进行软硬件调试及数据采集:

运用AVR STUDIO及DS18B20温度传感器部分实验图:

(测量室温图) (测量体温升温过程) (四)结题预期目标:

1.加强C语言基础从而自行编译控制程序,并熟练应用AVR STUDIO软件。 2.熟练应用DHT11湿度传感器并增加测量湿度试验。

9

3.进行数据采集并进行分析处理 (五)经费使用情况 书费 100元 其他费用 100元

附件:DHT11温湿度传感器C语言程序

10