2924|1

21

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

mega16,設置溫度上下限程序不懂寫 [复制链接]

1602液晶显示和DS18B20测温方面已经没问题,但小弟想设置上下限警报器,想各位教教我或帮我编写一下,万分感谢

编写软件:ICCAVR

单片机芯片:MEGA16

=========================================

#include "iom16v.h"
#include "macros.h"

#define RS PD4
#define WR PD5
#define EN PD6
#define DQ PA5

//PD4 RS (1-Data,0-Cmd)
//PD5 WR (1-Read,0-Write)
//PD6 EN
//PB 1602_IO

void Delay_1us(unsigned int x)
{
unsigned int i;
x=x*5/4;
for( i=0;i<x;i++);
}

//DS18B20復位函數
void DS18B20_Reset()
{
DDRA|=BIT(DQ); //DQ為輸出狀態
PORTA&=~BIT(DQ); //輸出低電平
Delay_1us(500); //延遲500微妙
PORTA|=BIT(DQ); //示范總線
Delay_1us(60); //延遲60微妙
DDRA&=~BIT(DQ); //DQ位輸出狀態
while(PINA&BIT(DQ)); //等待從機DS18B20應答(低電平有效)
while(!(PINA&BIT(DQ))); //等待從機DS18B20釋放總線
}

//DS18B20寫字節函數
void DS18B20_Write(unsigned char Data)
{
unsigned char i;
DDRA|=BIT(DQ); //DQ為輸出
for(i=0;i<8;i++)
{
PORTA&=~BIT(DQ); //拉低總線
Delay_1us(10); //延遲10微妙(最大15微妙)

if(Data&0x01) PORTA|=BIT(DQ);
else PORTA&=~BIT(DQ);
Delay_1us(40); //延遲40微妙(最大45微妙)

PORTA|=BIT(DQ); //釋放總線
Delay_1us(1); //稍微延遲
Data>>=1;
}
}

//DS18B20讀字節函數
unsigned char DS18B20_Read()
{
unsigned char i,Temp;

for(i=0;i<8;i++)
{
Temp>>=1; //數據右移

DDRA|=BIT(DQ); //DQ為輸出狀態
PORTA&=~BIT(DQ); //拉低總線,啟動輸入
PORTA|=BIT(DQ); //釋放總線
DDRA&=~BIT(DQ); //DQ為輸入狀態

if(PINA&BIT(DQ)) Temp|=0x80;
Delay_1us(45); //延遲45微妙(最大45微妙)
}

return Temp;
}

//讀溫度函數
unsigned int Read_Temperature()
{
unsigned int Temp1,Temp2;

DS18B20_Reset(); //DS18B20復位
DS18B20_Write(0xCC); //跳過ROM
DS18B20_Write(0x44); //溫度轉換

DS18B20_Reset(); //DS18B20復位
DS18B20_Write(0xCC); //跳過ROM
DS18B20_Write(0xbe); //讀取RAM

Temp1=DS18B20_Read(); //讀低八位,LS Byte, RAM0
Temp2=DS18B20_Read(); //讀高八位,MS Byte, RAM1
DS18B20_Reset(); //DS18B20復位,表示讀取結束

return (((Temp2<<8)|Temp1)*0.625); //0.0625=xx, 0.625=xx.x, 6.25=xx.xx
}
void main()
{
unsigned int Temp;
unsigned char displaystring[7]={0x30,0x30,'.',0x30,0xDF,0x43,0x00}; //字符串
int i;


Delay();
LCD_IO_Init(); //調用IO口初始化函數

LCD_Write_Cmd(0x38); //Initial 1602
LCD_Write_Cmd(0x0c); //bit3(1),bit2(1)開顯示,bit1(1)顯示光標,bit0(1)光標閃耀
LCD_Write_Cmd(0x06); //寫一個字節后指針地
LCD_Write_Cmd(0x80); //地址指針指向第一行第一列



while(1)
{
Temp=Read_Temperature();

Delay_1us(100);
displaystring[3]=Temp%10+0x30;
Temp=Temp/10;
displaystring[1]=Temp%10+0x30;
displaystring[0]=Temp/10+0x30;
for(i=0;displaystring!=0;i++) //第二行寫入
LCD_Write_Data(displaystring);
LCD_Write_Cmd(0x80);
}

}



//延遲函數
void Delay()
{
unsigned int i=10000;
while(i--);
}

//寫數據函數
void LCD_Write_Data(unsigned char Data)
{
PORTD&=~BIT(EN); //EN=0;
PORTD|=BIT(RS); //RS=1;
PORTB=Data; //送數據
PORTD|=BIT(EN); //EN=1;
Delay();
PORTD&=~BIT(EN); //EN=0﹔
}

//寫命令函數
void LCD_Write_Cmd(unsigned char Cmd)
{
PORTD&=~BIT(EN); //EN-0;
PORTD&=~BIT(RS); //RS=0;
PORTB=Cmd; //送命令
PORTD|=BIT(EN); //EN=1;
Delay();
PORTD&=~BIT(EN); //EN=0;
}

//IO初始化湖南書
void LCD_IO_Init()
{
DDRD|=BIT(RS)|BIT(WR)|BIT(EN); //PD4~PD6位輸出
DDRB=0xff; //PB口為輸出
PORTD&=~BIT(WR); //WR=0;
}




[ 本帖最后由 Hsmallguy 于 2012-3-1 00:47 编辑 ]

最新回复

看看天祥的书,C51关于DS18B20温度采集写得比较的详细。。。。。。  详情 回复 发表于 2012-3-1 11:20
点赞 关注
 

回复
举报

888

帖子

3

TA的资源

五彩晶圆(初级)

沙发
 
看看天祥的书,C51关于DS18B20温度采集写得比较的详细。。。。。。
 
个人签名邮箱:ternence.hsu@foxmail.com
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表