微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > PCB设计问答 > PCB设计学习讨论 > 用DMAVR128开发板设计温度采集系统

用DMAVR128开发板设计温度采集系统

时间:10-02 整理:3721RD 点击:

连接数字温度传感器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);

              }

       }

}

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top