|
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 编辑 ]
|
|