用DMAVR128开发板设计温度采集系统
连接数字温度传感器DS18B20,采集温度数据在数码管、LCD液晶上显示或通过串口将数据传递至PC。
访问时钟芯片DS1302,将年、月日、时、分、秒调整到当前时间。
设置按键,通过按键调整温度的记录间隔时间,可任意设定(1S到1h,步长1s),能按设定时间存储数据。
按照间隔时间读取温度,并记录读取温度的时间。 通过按键回放温度和读取温度时的时间参数。
将温度数据存储在EEPROM AT24C01内。
设定温度告警门限,通过蜂鸣器、发光二极管进行告警显示。
通过切换按钮可以切换华氏度和摄氏度显示。
用RS232连接电脑 PC助手显示结果
只差了个头文件了 各位求帮忙
/************************************************
文件:main.c
用途:
注意:内部8M晶振
************************************************/
#include "config.h"
unsigned char i=0,j;
unsigned char LED_table[]={0xFF,0x00,0xFF,0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F,
0xFF,0x00,0xFF,0x7F,0xBF,0xDF,0xEF,0xF7,0xFB,0xFD,0xFE,
0xFF,0x00,0xFF,0x7E,0xBD,0xDB,0xE7,0xFF,0x00,0xE7,0xDB,
0xBD,0x7E,0xFF,0x00};
void main(void)
{
float temp=0.0;
unsigned char Key;
Key_init();
HC_595_init();
init_1820();
temp=gettemp();
delay_nms(1000);
while(1)
{
temp=gettemp();
Seg7_Led_float(temp);
deal_temp((unsigned char)(temp));
led();
for(j=0;j<50;j++) //产生灯延时
{
Seg7_Led_float(temp);
deal_temp((unsigned char)(temp));
delay_nms(5);
Seg7_Led_float(temp);
deal_temp((unsigned char)(temp));
}
}
while(1)
{
Seg7_Led_float(temp);
Key=get_key();
switch(Key)
{
case ( ((1<<S4)^0xF0) ):
{
++temp;
break;
}
case ( ((1<<S3)^0xF0) ):
{
--temp;
break;
}
case ( ((1<<S2)^0xF0) ):
{
Seg7_Led_float(temp);
break;
}
case ( ((1<<S1)^0xF0) ):
{
Seg7_Led_float(temp);
break;
}
default:
{
break;
}
}
}
}
void led(void)
{
DDRE=0xff;
PORTE=0xff;
if(i==36)
i=0;
PORTE = LED_table[i++];
/************************************************
文件:18b20.c
用途:
注意:
************************************************/
#include "config.h"
/**************************************************************
** 函数名称: void init_1820(void)
** 功能描述: 18b20初始化
** 输 入: 无
** 全局变量: 无
** 调用模块: 无
** 说明:
** 注意:
**************************************************************/
void init_1820(void)
{
TEM_DDR &=~ (1<<TEM_SDT);
SET_TEM_DDR; //设置数据端口为输出
SET_TEM_SDT;
CLR_TEM_SDT;
delay_nus(480); //480us以上
SET_TEM_SDT;
CLR_TEM_DDR;
delay_nus(20); //15~60us
while(CHECK_TEM_SDT);
SET_TEM_DDR;
SET_TEM_SDT;
delay_nus(140); //60~240us
}
/**************************************************************
** 函数名称: void write_1820(unsigned char data)
** 功能描述: 向18b20写入1B的数据
** 输 入: unsigned char data 要写入的数据
** 全局变量: 无
** 调用模块: 无
** 说明:
** 注意:
**************************************************************/
void write_1820(unsigned char data)
{
unsigned char i;
for(i=0;i<8;i++)
{
CLR_TEM_SDT; //从高到低,产生写间隙
if(data&(1<<i)) //写数据,先写低位
SET_TEM_SDT;
else
CLR_TEM_SDT;
delay_nus(40); //15~60us
SET_TEM_SDT;
}
SET_TEM_SDT;
}
/**************************************************************
** 函数名称: unsigned char read_1820(void)
** 功能描述: 从18b20读出1B的数据
** 输 入: 无
** 全局变量: 无
** 调用模块: 无
** 说明:
** 注意:
**************************************************************/
unsigned char read_1820(void)
{
unsigned char temp,k,n;
temp=0;
for(n=0;n<8;n++)
{
CLR_TEM_SDT;
SET_TEM_SDT; //从高到低再到高,产生读间隙
CLR_TEM_DDR; //设为输入
k=CHECK_TEM_SDT; //读数据,从低位开始
if(k)
temp|=(1<<n);
else
temp&=~(1<<n);
delay_nus(50); //60~120us
SET_TEM_DDR; //设为输出
}
return (temp);
}
/**************************************************************
** 函数名称: unsigned char gettemp(void)
** 功能描述: 返回温度值
** 输 入: 无
** 全局变量:
** 调用模块: 无
** 说明:wmh为温度的高位,wml为温度的低位,返回值为温度值,范围0~99摄氏度,字符型
** 注意:
**************************************************************/
float gettemp(void) //读取温度值
{
float t;
unsigned char temh,teml,wm0,wm1,wm2,wm3,wmh,wml;
int temp;
init_1820(); //复位18b20
write_1820(0xCC); // 跳过ROM
write_1820(0x44); // 温度变换
init_1820();
write_1820(0xCC); // 跳过ROM
write_1820(0xbe); // 写暂存存储器
teml=read_1820(); //读数据
temh=read_1820();
//wm0=teml>>4; //只要高8位的低四位和低8位的高四位,温度范围0~99
// wm1=temh<<4;
temp=temh;
temp<<=8; //两个字节组合为1个字
temp=temp|teml;
t=temp*0.0625; //温度在寄存器中是12位,分辨率是0.0625
temp=t*10+0.5;
return t;
/* wm2=wm1+wm0; //16进制转10进制
wm3=wm2/100;
wmh=(wm2%100)/10; //wmh是显示的高位,wml是显示的低位
wml=(wm2%100)%10;
temp=wmh*10+wml;
return temp;*/
}
void deal_temp(unsigned char tmp) //处理函数,当前温度与温度上下限比较
{
DDRG|=(1<<4); //蜂鸣器端:PG4
if(tmp!=85)
{
if(tmp>=TEM_MAX)
{
PORTG|=(1<<4);
delay_nus(80);
PORTE=0xf0;//警告灯:PE
PORTG=0;delay_nus(200);
}
else if(tmp<=TEM_MIN)
{
PORTG|=(1<<4);
delay_nus(100);
PORTE=0x0f;//警告灯:PE
PORTG=0;
delay_nus(100);
}
}
}