|
主函数程序如下:
#include"includes.h"
#include"macros.h"
#include "ds18b20.h"
#include "lcd.h"
#include "delay.h"
#define XTAL 1 //常量定义,用于ms级定义,且主频为1MHZ
#define Vref 50300 //因为我的5V直流电源的电压为5.03V,故Vref用此定义
#define DQ_IN DDRA &= ~(1 << PA7) /*设置输入*/
#define DQ_OUT DDRA |= (1 << PA7) /*设置输出*/
#define DQ_CLR PORTA &= ~(1 << PA7) /*置低电平*/
#define DQ_SET PORTA |= (1 << PA7) /*置高电平*/
#define DQ_R PINA & (1 << PA7) /*读了电平*/
//全局变量声明
unsigned char Temp_H,Temp_L; //温度高位,低位,复位成功标志
//unsigned char flag; /*中断标志缓存*/
//主程序***********************************************************************
void main(void)
{
float j;
float temp;
int count;
unsigned char *test_1="VL:";
unsigned char *test_2="WD:";
unsigned char *test_3="ALARM!" ;
unsigned char *test_4=" " ;
unsigned char *value = "0.000V";
unsigned char *string_1="hello!";
unsigned char *string_2="you are wellcome!";
unsigned char *p_value_1;
unsigned int adc_data;
unsigned char *RS;
unsigned char i_1=0;
int middle;
unsigned char f_to_p;
unsigned int i; //用于暂存读回的16位温度值
unsigned char t[9]; //用于存温度数值及单位
unsigned char *p;
Temp_H = 0;
Temp_L = 0; //初始化LCD,显示开机初始化界面
delay_nms(1);
//OSCCAL=0xab; //用内部4MHz时钟,且进行时钟校准
//LCD显示器初始化
Init_LCD();
LCD_DisplayString(1,6,string_1); //LCD液晶显示英文字符串
LCD_DisplayString(2,1,string_2); //LCD液晶显示英文字符串
delay_nms(1500);
port_1820(); //DS18B20对应单片机端口初始化
Init_LCD(); //液晶显示器再次初始化,准备显示温度值
init_adc(); //ADC模数转换器初始化
delay_nms(2); //延迟一会,准备液晶显示
LCD_DisplayString(1,1,test_1); //LCD液晶显示英文字符串
LCD_DisplayString(1,4,value); //LCD液晶显示电压值
//LCD液晶显示英文字符串"TEMP:"
LCD_Cursor(2,1);
LCD_DisplayString(2,1,test_2);
LCD_Cursor(0,1); //液晶光标定位于第一行第0位
LCD_DisplayString(1,1,test_1); //LCD液晶显示英文字符串
delay_nms(10);
while(1)
{
ds1820_reset(); //复位D18B20
ds1820_start(); //启动一次转换
delay_nms(1000); //等待转换结束
i = ds1820_read_temp(); //读取温度数值,读得的温度值为16位
//用于调试的原始温度数据
//i=0x07d0; //当温度为125oC时的i值
//i=0xff5e; //負10.125度
//i=0xfebe; //負20.125度
//i=0x0191; //正25.0625度
//i=0x0550; //正85度
if(i&0x8000) //判断温度正负
{
//溫度為負时
//一个字长的温度值转换成两个字节,分別放在Temp_L,Temp_H中
Temp_L=(char)(i&0x00ff); //取i中的低8位
Temp_H=(char)((i&0xff00)>>8); //取i中的高8位
Temp_H = ~Temp_H; //负温度。取反加1
Temp_L = ~Temp_L;
asm("clc"); //清零进位位标志
Temp_L++; //温度低字节加1
if((SREG&0x01)!=0x01) //有进位吗?
{
Temp_H++; //有进位,则温度高字节加1
}
i=Temp_H; //高8位放回i中
i=(i<<8)|Temp_L; //低8位放回i中
temp=(float)(i*0.0625);
middle=(int)(temp*100); //取整数带小数点后两位
t[0]=middle/10000+0x30;
t[1]=(middle%10000)/1000+0x30;
t[2]=(middle%1000)/100+0x30;
t[3]=0x2e; //value_1[3]为小数点存放单元
t[4]=(middle%100)/10+0x30;
t[5]=(middle%10)+0x30;
t[6]=0x20;
t[7]=0xdf; //显示"o"
t[8]=0x43; //显示"C"
LCD_Cursor(2,6); //在液晶屏上顯示"-"號
LCD_DisplayCharacter(0x2d);
p=t;
for(f_to_p=0;f_to_p<9;f_to_p++)
{
LCD_DisplayCharacter(*p++); //显示温度数据
}
}
else
{
//溫度為正
temp=(float)(i*0.0625);
middle=(int)(temp*100); //取整数带小数点后两位
//t[0]=middle/10000+0x30;
t[0]=(middle%10000)/1000+0x30;
t[1]=(middle%1000)/100+0x30;
t[2]=0x2e; //value_1[3]为小数点存放单元
t[3]=(middle%100)/10+0x30;
t[4]=(middle%10)+0x30;
//t[5]=0x20;
t[5]=0xdf;
t[6]=0x43;
p=t;
LCD_Cursor(2,4); //在液晶屏上顯示"+"號
//LCD_DisplayCharacter(0x2b);
for(f_to_p=0;f_to_p<7;f_to_p++)
{
LCD_DisplayCharacter(*p++); //显示温度数据
}
} //-------------------------------------------------------else结束
} //while结束
if(middle>6000)
{
LCD_Cursor(2,11);
LCD_DisplayCharacter(2,11,test_3);
}
if(middle<4000)
{
LCD_Cursor(2,11);
LCD_DisplayCharacter(2,11,test_4);
}
} //结束
将
LCD_Cursor(2,11);
LCD_DisplayCharacter(2,11,test_3); 加到while(1)之前加好使,这是为什么呢? |
阿莫论坛20周年了!感谢大家的支持与爱护!!
一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。
|