ATMEGA16A单片机的多点测温系统完成版 Proteus仿真程序

2019-10-16来源: eefocus关键字:ATMEGA16A  单片机  多点测温系统

 

0.png (38.96 KB, 下载次数: 18)

下载附件  保存到相册

2019-6-29 04:45 上传


 

单片机源程序如下:

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

*实验名   :DS18B20模块

*实验效果 :单总线调试,此代码可用于测多点温度

*显示     :此代码用了LCD显示读取地址位

*平台     : Atmega16,基于8MHz

*调试时间 :2019年6月7日 23:14

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

#include

#include

#include "ds18b20.h"

//#include "lcd1602.h"

//微妙级延迟函数avr 16 以8MHz为例加上for循环,他需要执行1142条指令才是1ms,

void delay_1us(void)

{

  asm("nop");

}

void Delay_1us(unsigned int x)//所以这里存在一定的偏差。

{

   unsigned int i=0;     

   for( i=0;i

}

//DS18B20复位函数

void DS18B20_Reset(void)

{ /*

    DQ_1;   //输出低电平

DQ_OUT;   //DQ为输出状态

DQ_0;   //输出低电平

Delay_1us(500);   //延迟500微妙

DQ_1;    //释放总线

Delay_1us(60);   //延迟60微妙

DQ_IN;   //DQ位输入状态

while(DQ_RD); //等待从机DS18B20应答(低电平有效)

while(!(DQ_RD));*/ //等待从机DS18B20释放总线机DS18B20释放总线 

    //这里要加个括号判断优先级 

  while(1)

{

       DQ_OUT;

    DQ_0;

    Delay_1us(480);   //延时480us

    DQ_1;

    Delay_1us(60); 

    DQ_IN;  //设置为输入端,接收应答信号

    if(!(DQ_RD))      //收到应答信号

   {

  DQ_1;

  Delay_1us(240);

  break; 

   }  //延时240us

}  

}

//DS18B20写字节函数

void DS18B20_Write(unsigned char Data)

{

unsigned char i;

DQ_OUT;  //DQ为输出

for(i=0;i<8;i++)

{

  DQ_0;   //拉低总线

  Delay_1us(10);     //延迟10微妙(最大15微妙)

  if(Data&0x01)DQ_1;

  else DQ_0;   

  Delay_1us(40);      //延迟40微妙(最大45微妙)

  DQ_1;     //释放总线

  Delay_1us(1);     //稍微延迟

  Data>>=1;

}

}

//DS18B20读字节函数

unsigned char DS18B20_Read(void)

{

unsigned char i,Temp;          

for(i=0;i<8;i++)

{

    Temp>>=1;      //数据右移

    DQ_OUT;     //DQ为输出状态

    DQ_0;    //拉低总线,启动输入

    DQ_1;     //释放总线

    DQ_IN;     //DQ为输入状态

    Delay_1us(2); 

    if(DQ_RD) Temp|=0x80; 

    Delay_1us(60);      //延迟45微妙(最大45微妙)

}


return Temp;

}

/*void GetROMSequence()//读地址号代码,用lcd1602显示

{

unsigned char i,temp;

DS18B20_Reset();

DS18B20_Write(READ_ROM);

for (i = 0; i < 8; i++)

ROMData1[i] = DS18B20_Read();

lcd_com(0x80);   

for(i=0;i<8;i++)

    {

       temp=ROMData1[i]>>4;

       if(temp<10)

       {

         lcd_dat(0x30+temp);

       }

       else

       {

         lcd_dat(0x37+temp);

       }

       temp=ROMData1[i]&0x0f;

       if(temp<10)

       {

         lcd_dat(0x30+temp);

       }

       else

       {

         lcd_dat(0x37+temp);

       }

    }

}*/

//读温度,然后拆字用结构体存起来。

TEMPDATA ReadTemperature(const unsigned char *pMatchData)

{

TEMPDATA TempData;

unsigned int iTempDataH;

unsigned char btDot, iTempDataL;

static unsigned char i = 0;

TempData.btNegative = 0;      //为0温度为正


DS18B20_Reset();   //DS18B20复位

DS18B20_Write(SKIP_ROM);  //跳过ROM

DS18B20_Write(TEMP_SWITCH);  //温度转换


DS18B20_Reset();   //DS18B20复位

DS18B20_Write(MATCH_ROM);//读取地址

for (i = 0; i < 8; i++) DS18B20_Write(*(pMatchData + i)); 

//DS18B20_Write(SKIP_ROM);  //跳过ROM,单个读取直接跳过ROM

DS18B20_Write(READ_MEMORY);  //读取RAM      //读数据


iTempDataL = DS18B20_Read();

iTempDataH = DS18B20_Read();

DS18B20_Reset(); //读取数值完要复位,要不然读取不了数值

iTempDataH <<= 8;

iTempDataH |= iTempDataL;

if (iTempDataH & 0x8000)

{

  TempData.btNegative = 1;

  iTempDataH = ~iTempDataH + 1;    //负数求补

}

//为了省去浮点运算带来的开销,而采用整数和小数部分分开处理的方法(没有四舍五入)

btDot = (unsigned char)(iTempDataH & 0x000F); //得到小数部分

iTempDataH >>= 4;        //得到整数部分

btDot *= 5;          //btDot*10/16得到转换后的小数数据

btDot >>= 3;

//数据处理

TempData.btThird   = (unsigned char)iTempDataH / 100;

TempData.btSecond  = (unsigned char)iTempDataH % 100 / 10;

TempData.btFirst   = (unsigned char)iTempDataH % 10;

TempData.btDecimal = btDot; 

return TempData;

}



关键字:ATMEGA16A  单片机  多点测温系统 编辑:什么鱼 引用地址:http://news.eeworld.com.cn/mcu/ic477295.html 本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

上一篇:ATmage16A UART实验往PC收发数据
下一篇:avr单片机atmega16自动浇花器Proteus仿真+源程序

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

Atmega32A驱动LCD1602显示屏
对于初学者来说,最烦躁的可能就是调试程序,往往小小一个问题,要找个一个小时,甚至几个小时才能解决,这个程序是刚调试完的,整整九个多小时啊,现在看着挺简单的,没调试好前根本不敢肯能调得好.高手别笑,初学者参考编程环境Atmel Studio 7.0 和Proteus 8仿真,说明:仿真和真实电路是有点区别的,仿真Proteus 8只能用内部晶振,最大8MHz,我的DIY板是16M,所以实际电路总是比仿真的跑快好多单片机源程序:/** LCD1602_AVR.h** Created: 2017/3/19 23:07:51*  Author: lyl*LCD1602的基本操作时序     
发表于 2019-11-11
Atmega32A驱动LCD1602显示屏
Atmega128A被我锁死,又救活了
AVR单片机编程熔丝位时候不小心选择了外部RC,导致单片机锁死的简单解决方法。今天在捣鼓Atmega128A, 惦记起了熔丝位,手闲于是写入了这个 于是乎,这个开发板就再也不能被PORGISP软件识别了, 调入flash,点击【自动】按钮就会显示error。 手闲赔钱啊,锁死了咋办?上网找答案,有处论坛里有位兄弟也是我这问题,他的解决办法就是“时钟锁死的AVR单片机可以通过外部输入一个几十K到1M左右的时钟到XTAL1引脚进行解锁”“输入的时钟电平需到5V。可以不是方波,片内有波形调整电路”“烧写好熔丝之后,再烧程序的时候不用每次都重新烧写熔丝。可以在ISP软件中把勾勾去掉”“找一个时钟输入
发表于 2019-10-25
Atmega128A被我锁死,又救活了
ATMEGA16A单片机1602字符显示程序
* 【编译环境】: ICCAVR  * 【函数功能】: 1602字符显示        * 【晶    振】:  8M                * 【芯    片】:  ATMEGA16A         #include<iom16v.h>#define uchar unsigned char #define uint unsigned
发表于 2019-10-15
Atmega128a的4位独立键盘控制程序
;  F_CPU        16000000                // 单片机主频为16MHz,用于延时子程序,熔丝位必须设置到外部高频晶振才行#include <util/delay.h>#include <avr/io.h>#include <avr/iom128.h>#include <avr/interrupt.h>           //中断信号头文件#include
发表于 2019-10-15
Atmega8a的采样(查询法)
];//存温度#define get while(!(ADCSRA & (1 << ADIF)))//若转化完成,ADIF=1========================================atmega8和16不同,16的采样可以由定时器触发
发表于 2018-10-07
Atmega8a的采样(查询法)
小家电热销带动盛群,新唐单片机出货量激增
由于今年白色小家电需求依旧热络,10月开始一波急单带动IC设计盛群(6202)、新唐(4919)MCU出货量增,加上年底耶诞节购物需求,及上半年库存去化告一段落,第四季业绩将优于第三季,全年营运可望倒吃甘蔗。10月相关白牌小家电零组件IC出现节前急单拉货潮,盛群表示,10月开始,已感受到订单回流迹象,客户及终端库存去化、中国双11及年底拉货旺季到来,且中国去美化政策逐季发酵,客户拉货态度转趋积极。上半年受到贸易战影响,客户拉货态度观望,下半年库存水位已降至低点,MCU厂在客户要求下,于10月备妥急单需求,主要以小家电商品IC为主,第四季进入全年出货旺季,法人预估今年第四季MCU厂业绩可望成为全年最高点。
发表于 2019-11-11
小广播
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2019 EEWORLD.com.cn, Inc. All rights reserved