AVR M16实验之六 DS18B20测温

发布者:快乐球球最新更新时间:2015-11-12 来源: eefocus关键字:AVR  M16实验  DS18B20测温 手机看文章 扫描二维码
随时随地手机看文章
/**********************************************************************
* 文件名称: main.c
* 程序作者: kidcao1987
* 程序版本: V1.0
* 功能描述: 装上LCD1602,在其上,显示当前的温度。
* 编译器:WinAVR-20090313
* 芯片:ATmega16,外部11.0592MHZ晶振
* 技术支持:http://bbs.cepark.com
**********************************************************************/
#include
#include
#define uchar unsigned char
#define uint unsigned int
#define DQ PORTC&=~(1<#define DQ_ActiveHigh DDRC&=~(1<#define DQ_ActiveLow DDRC|=(1<#define DQ_SetInput DDRC&=~(1<#define DQ_Readback (PINC&0x80)
#define RS PA4
#define RW PA5
#define EN PA6
unsigned char const LedData[]=
{0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xF8,
0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};
unsigned char const LedPos[]=
{0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
uchar DisplayNum[]={"0123456789.-C"};
uchar const CharacterChar[]={"Now the Tempera-ture is: "};
uchar Num[4];
uchar TemperatureL,TemperatureH,m;
uint Temperature;
void LCD1602_Initial(void);
void LCD1602_CommandWrite(uchar com);
void LCD1602_ByteWrite(uchar date);
void LCD1602_Display(uchar adr,uchar date);
void LCD1602_BusyCheck(void);
void DS18B20_Reset(void);
void DS18B20_PORTx_Initial(void);
void DS18B20_High_BitWrite(void);
void DS18B20_Low_BitWrite(void);
void DS18B20_ByteWrite(uchar command);
uchar DS18B20_ByteRead(void);
int main(void)
{
DS18B20_PORTx_Initial();
LCD1602_Initial();
while(1)
{
DS18B20_Reset();//复位
DS18B20_ByteWrite(0xcc);//跳过ROM匹配
DS18B20_ByteWrite(0x44);//温度转换
_delay_ms(600);//延时等待温度转换结束,这个很重要!!
DS18B20_Reset();//复位
DS18B20_ByteWrite(0xcc);//跳过ROM匹配
DS18B20_ByteWrite(0xbe);//读取温度
TemperatureL=DS18B20_ByteRead();
TemperatureH=DS18B20_ByteRead();//先低字节后高字节
DS18B20_Reset();//复位打算DS18B20的输出
/*以下是温度数据处理以及显示部分*/
Temperature=TemperatureL*6.25+TemperatureH*1600;
Num[0]=Temperature/1000;
Num[1]=(Temperature%1000/100);
Num[2]=Temperature%100/10;
Num[3]=Temperature%10;
for(m=0;m<16;m++)
{
LCD1602_Display(0x80+m,CharacterChar[m]);
}
for(m=0;m<9;m++)
{
LCD1602_Display(0x80+0x40+m,CharacterChar[16+m]);
}
LCD1602_ByteWrite(DisplayNum[Num[0]]);
LCD1602_ByteWrite(DisplayNum[Num[1]]);
LCD1602_ByteWrite(DisplayNum[10]);
LCD1602_ByteWrite(DisplayNum[Num[2]]);
LCD1602_ByteWrite(DisplayNum[Num[3]]);; 
LCD1602_ByteWrite(0xdf);
LCD1602_ByteWrite(DisplayNum[12]);
}
}[page]
void DS18B20_PORTx_Initial(void)
{
DDRB=0xff;//B口全部输出
PORTB=0xff;//B口全部低电平
DQ;
DQ_ActiveHigh;
}
void DS18B20_Reset(void)
{
DQ_ActiveLow;
_delay_us(600);//延时至少480us
DQ_ActiveHigh;//释放数据线
_delay_us(70);//延时大于60us
while(DQ_Readback);//检测存在信号
_delay_us(500);//延时保证时序完整性
}
void DS18B20_High_BitWrite(void)
{
DQ_ActiveLow;//拉成低电平
_delay_us(2);//保持至少1us
DQ_ActiveHigh;//释放数据线
_delay_us(65);//等待足够时间使DS18B20采样数据线
}
void DS18B20_Low_BitWrite(void)
{
DQ_ActiveLow;//拉成低电平
_delay_us(65);//等待足够时间使DS18B20采样数据线
DQ_ActiveHigh;//释放数据线
}
uchar DS18B20_BitRead(void)
{
DQ_ActiveLow;//拉成低电平
_delay_us(2);//保持至少1us
DQ_ActiveHigh;//释放数据线
_delay_us(4);//延时使主机再15us的后阶段读取数据线
if(DQ_Readback)
return 1;
else
return 0;
}
/*DS18B20字节写函数*/
void DS18B20_ByteWrite(uchar command)
{
uchar n=0;
for(n=0;n<8;n++)
{
if(command&0x01)
DS18B20_High_BitWrite();
else
DS18B20_Low_BitWrite();
command>>=1;
_delay_us(5);
}
}
/*DS18B20字节读函数*/
uchar DS18B20_ByteRead(void)
{
uchar n=0,Readback=0;
for(n=0;n<8;n++)
{
Readback>>=1;
if(DS18B20_BitRead())
Readback|=0x80;
_delay_us(65);
}
return Readback;
}
void LCD1602_Initial(void)
{
PORTA&=~((1<DDRA|=(1<
PORTB=0x00;
DDRB=0xff; 

LCD1602_CommandWrite(0x38);
_delay_ms(15);
LCD1602_CommandWrite(0x38);
_delay_ms(5);
LCD1602_CommandWrite(0x38);
_delay_ms(5);
LCD1602_CommandWrite(0x01);
_delay_ms(1);
LCD1602_CommandWrite(0x38);
_delay_ms(1);
LCD1602_CommandWrite(0x0c);
_delay_ms(1);
LCD1602_CommandWrite(0x06);
}
/*1602写命令字子函数*/
void LCD1602_CommandWrite(uchar com)
{
LCD1602_BusyCheck();
PORTA&=~(1<PORTB=com; //将数据送到8位并行数据口
PORTA|=(1<_delay_ms(1); //延时5ms,保持EN电平
PORTA&=~(1<}
/*1602写数据子函数*/
void LCD1602_ByteWrite(uchar date)
{
LCD1602_BusyCheck();
PORTA|=(1<PORTB=date; //将数据送到8位并行数据口
PORTA|=(1<_delay_ms(1); //延时5ms,保持EN电平
PORTA&=~(1<}
/*在某位置显示某字符,参数adr为待写地址,date为待写字节*/
void LCD1602_Display(uchar adr,uchar date)
{
LCD1602_BusyCheck();
LCD1602_CommandWrite(adr);
LCD1602_BusyCheck();
LCD1602_ByteWrite(date); 
}
void LCD1602_BusyCheck(void)
{
PORTB=0xff;
DDRB=0x00;
PORTA|=(1<PORTA&=~(1<PORTA|=(1<_delay_us(5);
while(PINB&0x80);
PORTA&=~(1<PORTA&=~(1<PORTB=0xff;
DDRB=0xff;

}

视频地址:http://v.youku.com/v_show/id_XMTYxNDkyOTgw.html

关键字:AVR  M16实验  DS18B20测温 引用地址:AVR M16实验之六 DS18B20测温

上一篇:AVR M16实验之七 DS1302测试
下一篇:AVR M16 实验之五 矩阵键盘

推荐阅读最新更新时间:2024-03-16 14:39

分析AVR单片机优缺点
简介:AVR单片机是1997年由ATMEL公司研发出的增强型内置Flash的RISC(Reduced Instruction Set CPU) 精简指令集高速8位单片机。AVR的单片机可以广泛应用于计算机外部设备、工业实时控制、仪器仪表、通讯设备、家用电器等各个领域。 AVR单片机是1997年由ATMEL公司研发出的增强型内置Flash的RISC(Reduced Instruction Set CPU) 精简指令集高速8位单片机。AVR的单片机可以广泛应用于计算机外部设备、工业实时控制、仪器仪表、通讯设备、家用电器等各个领域。 avr单片机的特点及优点 高可靠性、功能强、高速度、低功耗和低价位 , 一直是衡量单片机性能
[单片机]
AVR单片机TO定时器快速PWM模式范例
AVR单片机TO定时器快速PWM模式范例: /*/////////////////////////////////////////////// ///////定时器TO的使用例程 快速PWM模式///////// //编译环境:ICCV7 for AVR //晶体: 11.0592Mhz ///////////////////////////////////////////////*/ #include #include void port_init(void) { PORTA = 0x00; DDRA = 0x00; PORTB = 0x00; DDRB = 0x08; //PB3为PWM输出 PORTC = 0x00; /
[单片机]
AVRGCC/WinAVR编译环境中断函数的使用方法
早期版本的avr-libc 对中断服务程序的书写提供了两个宏SIGNAL 和INTERRUPT,并且需要包含两个头文件:avr/signal.h 和avr/interrupt.h。新版(如2007 版WINAVR)中,INTERRUPT 宏不再可用,而建议用ISR 宏替代SIGNAL宏,ISR 和SIGNAL 是一回事,但以后的版本中SIGNAL 宏将会逐渐被丢弃,所以新的程序建议使用ISR,也就是使用ISR作为中断服务函数名,下面将举例说明一些具体的中断使用。 一.为什么没有了INTERRUPT? INTERRUPT 宏是各中断嵌套有关的,当中断程序得到执行时AVR 的硬件将全局的中断允许标记清除,其它中断无法再发生,当中断程序
[单片机]
AVRGCC/WinAVR编译环境中断函数的使用方法
JTAGICE mkII 或是 AVR单片机 的问题
这两天 用 JTAGICE mkII 的 JTAG功能 仿真 一个程序,发现 一个问题,不知 是芯片问题,还是 仿真器的问题。我 是用AVRSTDIO4的GCC 写的 程序,用 JTAGICE mkII 来 仿真,芯片 是 ATmega32。 程序 见 附录,出现的问题是:当 代码 如附录所写 时,程序 运行正常,当 把 函数func()中的代码 直接放到while(1)中,即如下:(原程序 是 用 func() 代替了 几行代码) while(1) { atimer = 0; //清1ms定时标志 atmp = (aclock)/2; if (anum!=atmp ) { anum = atmp; atimer
[单片机]
基于AVR单片机SPI的串行ADC接口设计
摘 要 :本文所进行是为提高ADC转换的精度、加快工作速度的研究,主要介绍AVR单片机的SPI与MAX187的接口设计,提供了软件编程实现。 关键字 :SPI、AVR单片机、MAX187 1、AVR单片机的SPI接口 SPI(Serial Peripheral Interface---串行外设接口)总线系统是一种同步串行外设接口,允许MCU与各种外围设备以串行方式进行通信、数据交换,广泛应用于各种工业控制领域。基于此标准,SPI系统可以直接于各个厂家生产的多种标准外围器件直接接口。SPI接口通常包含有4根线:串行时钟(SCK)、主机输入/从机输出数据线(MISO)、主机输出/从机输入数据线(MOSI)和低电平有效的从机选
[单片机]
avr单片机mega32之ADC程序
查手册,写程序,有问题再讨论 ***************************************************************** //CPU:mega32 //编译器:iar #include ioavr.h #include adc.h int main(void) { int m; adc_init(); m = adc_get(0); m=m; while(1); } void adc_init(void) { ADMUX = 1 REFS0 | 0 ADLAR ;//参考电源:AVcc 右对齐 ADCSRA = 1 ADEN | 7;//adc使能 1
[单片机]
AVR M16 实验之一 LED闪动
/********************************************************************** * 文件名称: main.c * 程序作者: kidcao1987 * 程序版本: V1.0 * 编制日期: 11-05-2009 * 功能描述: * 编译器:WinAVR-20090313 * 芯片:ATmega16,外部7.3728MHZ晶振 * 技术支持:http://www.cepark.com * **********************************************************************/ #include #include
[单片机]
轻触式开关电路在AVR单片机中的应用
引 言: 单键开关电路已经广泛应用于PDA、手机和电子词典等数码产品中,其实现方式多种多样。一般可采用RS触发器、计数器以及采用555集成电路等等。在单片机的一些实际应用中,以上的实现方式会增加整个电路的复杂度,不能达到简洁、实用的效果。本文将介绍一种可以在单片机应用中实现的,简易、稳定的轻触式单键开关电路。 1 电路原理 如图1所示,DC-DC为一个带有关断控制端的直流稳压电源芯片,MCU是一个单片机。当按下S1时,Q1和D1导通,稳压芯片工作,为单片机供电。单片机马上将相应的I/O引脚置为输出高,这时Q1和Q2导通,整个电路进入工作状态。而后单片机再将这个I/O引脚设置为输入,由于上拉电阻R4的存在,Q1和Q2一直导通。
[应用]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

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

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved