徐州工程学院单片机原理及应用课程设计
sbit Beep = P1^5 ;
void delay(unsigned int i) ;
void delay(unsigned int i) {
char j;
for(i; i > 0; i--)
for(j = 200; j > 0; j--); }
/*******************************************************************************
* 函数名 : main * 函数功能
: 主函数
* 输入 : 无 * 输出 : 无
*******************************************************************************/
void main() {
TMOD = 0x01; TH0 = 60536/256; TL0 = 60536%6; EA=1; ET0=1; LcdInit();
//初始化LCD1602
//写地址 80表示初始地址
LcdWriteCom(0x88); LcdWriteData('C'); while(1) {
17
徐州工程学院单片机原理及应用课程设计
LcdDisplay(Ds18b20ReadTemp()); if(Ds18b20ReadTemp()>=400) //25 {
TR0=1;
}else{ }
Delay1ms(1000);//1s钟刷一次
TR0=0;
// }
}
/*******************************************************************************
* 函数名 : 定时器0 中断服务程序 * 函数功能
:
* 输入 : v * 输出 : 无
*******************************************************************************/
void Timer0(void) interrupt 1 { }
/*******************************************************************************
* 函数名 : LcdDisplay() * 函数功能
: LCD显示读取到的温度
TH0 = 60536/256;
TL0 = 60536%6; //产生发声100Hz的平率 Beep = ~Beep;
* 输入 : v * 输出 : 无
18
徐州工程学院单片机原理及应用课程设计
*******************************************************************************/
void LcdDisplay(int temp) //lcd显示 {
unsigned char datas[] = {0, 0, 0, 0, 0}; //定义数组
float tp; if(temp< 0)
//当温度值为负数
{
LcdWriteCom(0x80);
//写地址 80表示初始地址 //显示负
LcdWriteData('-');
//因为读取的温度是实际温度的补码,所以减1,再取反求出原码 temp=temp-1; temp=~temp; tp=temp;
temp=tp*0.0625*100+0.5;
//留两个小数点就*100,+0.5是四舍五入,因为C语言浮点数转换为整型的时候把小数点
//后面的数自动去掉,不管是否大于0.5,而+0.5之后大于0.5的就是进1了,小于0.5的就 } else {
//写地址 80表示初始地址 //显示正
//算由?.5,还是在小数点后面。
LcdWriteCom(0x80);
LcdWriteData('+');
tp=temp;//因为数据处理有小数点所以将温度赋给一个浮点型变量 //如果温度是正的那么,那么正数的原码就是补码它本身 temp=tp*0.0625*100+0.5;
//留两个小数点就*100,+0.5是四舍五入,因为C语言浮点数转换为整型的时候把小数点
19
徐州工程学院单片机原理及应用课程设计
//后面的数自动去掉,不管是否大于0.5,而+0.5之后大于0.5的就是进1了,小于0.5的就 }
LCD1602显示程序文件: #include\
20
}
//算加上0.5,还是在小数点后面。
datas[0] = temp / 10000; datas[1] = temp % 10000 / 1000; datas[2] = temp % 1000 / 100; datas[3] = temp % 100 / 10; datas[4] = temp % 10;
LcdWriteCom(0x82); //写地址 80表示初始地址
LcdWriteData('0'+datas[0]); //百位
LcdWriteCom(0x83);
//写地址 80表示初始地址
LcdWriteData('0'+datas[1]); //十位
LcdWriteCom(0x84); //写地址 80表示初始地址
LcdWriteData('0'+datas[2]); //个位
LcdWriteCom(0x85); //写地址 80表示初始地址 //显示 ‘.’
LcdWriteData('.');
LcdWriteCom(0x86); //写地址 80表示初始地址
LcdWriteData('0'+datas[3]); //显示小数点
LcdWriteCom(0x87); //写地址 80表示初始地址
LcdWriteData('0'+datas[4]); //显示小数点
徐州工程学院单片机原理及应用课程设计
/*******************************************************************************
* 函 数 名 : Lcd1602_Delay1ms * 函数功能
: 延时函数,延时1ms
* 输 入 : c * 输 出 : 无
* 说 名 : 该函数是在12MHZ晶振下,12分频单片机的延时。
*******************************************************************************/
void Lcd1602_Delay1ms(uint c) //误差 0us {
uchar a,b;
for (; c>0; c--) { }
for (b=199;b>0;b--) {
for(a=1;a>0;a--); }
}
/*******************************************************************************
* 函 数 名 : LcdWriteCom * 函数功能
: 向LCD写入一个字节的命令
* 输 入 : com * 输 出 : 无
*******************************************************************************/
#ifndef LCD1602_4PINS //当没有定义这个LCD1602_4PINS时 void LcdWriteCom(uchar com) //写入命令
21