mega16,設置溫度上下限程序不懂寫

2019-03-24 20:58发布

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 编辑 ] 此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
1条回答
37°男人
1楼-- · 2019-03-25 07:06
看看天祥的书,C51关于DS18B20温度采集写得比较的详细。。。。。。

一周热门 更多>