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 编辑 ]
此帖出自小平头技术问答
一周热门 更多>