1、中国计量学院检测技术课程设计DS18B20程序/*copyright (c) 计量 2014* 文件名:li.c * 平台:ATMEGA16开发板* 实验名称:检测技术课程设计* 介绍: 组成:液晶1602驱动;lcd1602.h 键盘驱动;ds18b20.h 温度传感器DS18B20驱动;key.h 功能:第一页第一行显示当前温度状态,第一页第二行显示当前温度 第二页第一行显示温度报警上限,第二页第一行显示温度报警下限 按键2进行第一页和第二页的切换 按键3在设定上下限温度时的切换 按键4可根据按键3增加选定的温度上下限 按键5可根据按键3减小选定的温度上下限 * 作者:李超 QQ:6706
2、56469*/*-#include-*/#include#include#includelcd1602.h#includeds18b20.h#includekey.h/*-#define-*/*-函数声明-*/void Atmeg16_PortInit(void);/* 名称:void main(void)* 功能:主程序* 输入:无* 输出:无* 备注: */void main(void) unsigned int Temp; unsigned char DisFlag=0,SetFlag=0; unsigned char i,Temp1,Temp2,dian; unsigned char
3、TemperatureH = 30,TemperatureL = 25; /设定温度报警上下限初值 Atmeg16_PortInit(); /引脚初始化 CLI(); /关中断 LCD_Init(); /液晶初始化 while(1) /大循环 Temp = DS18B20_ReadTemperature(); /把读出的温度写入Temp Temp1 = Temp&0x0f; /把小数部分读出值写入Temp1 Temp2 = (Temp4); /把整数部分读出值写入Temp2 dian = Temp1*625/1000; /小数部分数据处理,保留一位小数 if(Key_Scan(KEY_2)=K
4、EY_ON) /按键检测,KEY_2 DisFlag = DisFlag; /显示页面切换 LCD_Clean(); /液晶清屏 if(DisFlag=0) /显示标志位为0 Write_X_Y(1,0); Write_String(Temp is ); Write_XXnum(Temp2); Write_Date(.); Write_Date(dian+0); Write_Date( ); Write_Date(C); if(Temp2 = TemperatureH) /如果当前温度超过设定温度上限 Write_X_Y(0,0); Write_String(TempStatus HIGN!)
5、; else if(Temp2 0;i-) /延时,设定采样频率 DelayUS(500); /* 名称:void Atmeg16_PortInit(void)* 功能:AVR单片机引脚初始化* 输入:无* 输出:无* 备注:DDxn用来选择引脚的方向。DDxn为1“时,Pxn配置为输出,否则配置为输入 引脚配置为输入时,若PORTxn为1“,上拉电阻将使能 引脚配置为输出时,若PORTxn为1“,引脚输出高电平(1“),否则输出低电平(“0“)。 */void Atmeg16_PortInit(void) PORTA=0xFF; /初始都为高电平 DDRA=0xFF; /端口使能,输出状态
6、PORTB=0xFB; DDRB=0xFB; PORTC=0xFF; DDRC=0xFF; PORTD=0xFF; DDRD=0x02; /TXD为输出,其余均为输入/* (C) COPYRIGHT 2014 计量*END OF FILE*/*copyright (c) 计量 2014 * 文件名:lcd1602.h * 平台:ATMEGA16开发板* 实验名称:检测技术课程设计* 介绍:液晶引脚:DatePort:PC0-PC7 PA5:LCD_RS; PA6:LCD_RW; PA7:LCD_EN;* 作者:李超 QQ:670656469*/* 控制线操作 PORTA &= 0x20;/ L
7、CD_RS = 0 PORTA |= 0x20;/ LCD_RS = 1 PORTA $= 0x40;/ LCD_RW = 0 PORTA |= 0x40;/ LCD_RW = 1 PORTA &= 0x80;/ LCD_EN = 0 PORTA |= 0x80;/ LCD_EN = 1*/#define DataPort PORTC #define BUSY 0x80/* 名称:void DelayUS(unsigned int nTime)* 功能:延时函数* 输入:nTime* 输出:无* 备注:*/void DelayUS(unsigned int nTime) while(nTime
8、-);/* 名称:unsigned char Busy_Check(void)* 功能:判忙函数* 输入:无* 输出:* 备注: */unsigned char Busy_Check(void) unsigned char LCD_Status; DDRC = 0x00;/ PINC设置为输入模式 PORTA &= 0x20;/ LCD_RS = 0; PORTA |= 0x40;/ LCD_RW = 1; PORTA |= 0x80;/ LCD_EN = 1; DelayUS(50); LCD_Status = PINC & BUSY; PORTA &= 0x80;/ LCD_EN = 0;
9、 return LCD_Status;/while(Busy_Check() = BUSY);/* 名称:void Write_CMD(unsigned char cmd)* 功能:写指令* 输入:* 输出:* 备注:*/void Write_CMD(unsigned char cmd) while(Busy_Check() = BUSY); DDRC = 0Xff;/ PINC设置为输出模式 PORTA &= 0x20;/ LCD_RS = 0 PORTA &= 0x40;/ LCD_RW = 0 PORTA &= 0x80;/ LCD_EN = 0 DataPort = cmd; PORT
10、A |= 0x80;/ LCD_EN = 1 DelayUS(50); PORTA &= 0x80;/ LCD_EN = 0 /* 名称:void Write_Date(unsigned char date)* 功能:写数据* 输入:* 输出:* 备注:*/void Write_Date(unsigned char date) while(Busy_Check() = BUSY); DDRC = 0Xff;/ PINC设置为输出模式 PORTA |= 0x20;/ LCD_RS = 1 PORTA &= 0x40;/ LCD_RW = 0 PORTA &= 0x80;/ LCD_EN = 0
11、DataPort = date; PORTA |= 0x80;/ LCD_EN = 1 DelayUS(50); PORTA &= 0x80;/ LCD_EN = 0 /* 名称:void LCD_Clean(void)* 功能:清屏函数* 输入:* 输出:* 备注:*/void LCD_Clean(void) Write_CMD(0x01);/* 名称:void Write_X_Y(unsigned char X,unsigned char Y)* 功能:设置LCD指针的坐标* 输入:X(0-1),Y(0-15)* 输出:无* 备注:*/void Write_X_Y(unsigned cha
12、r X,unsigned char Y) if(X = 0) Write_CMD(0x80+Y); if(X = 1) Write_CMD(0x80+0x40+Y);/* 名称:void Write_String(char *pchar)* 功能:输出字符串* 输入:* 输出:* 备注:*/void Write_String(char *pchar) unsigned int i; for(i=0;pchari!=0;i+) Write_Date(pchari); /* 名称:void write_XXnum(unsigned char XXnum) * 功能:写入一个两位数 * 输入:一个两
13、位数 * 输出: /*/void Write_XXnum(unsigned char XXnum) unsigned char ge,shi; ge = XXnum%10; shi = XXnum%100/10; Write_Date(shi+0); Write_Date(ge+0);/* 名称:void LCD_init(void)* 功能:液晶初始化* 输入:* 输出:* 备注:*/void LCD_Init(void) DelayUS(15); Write_CMD(0x38); /显示模式设置 :16*2显示,5*7点阵。8位数据口 DelayUS(1); Write_CMD(0x06)
14、; /显示光标移动位置 :整屏不动,字符后移 DelayUS(1); Write_CMD(0x0c); /显示开及光标设置 :显示开,关光标 DelayUS(1); Write_CMD(0x01); /显示清屏/* (C) COPYRIGHT 2014 计量*END OF FILE*/*copyright (c) 计量 2014* 文件名:key.h * 平台:ATMEGA16开发板* 实验名称:检测技术课程设计* 介绍:* 作者:李超 QQ:670656469*/*-#define-*/#define KEY_ON 0#define KEY_OFF 1#define KEY_2 1#defi
15、ne KEY_3 2#define KEY_4 3#define KEY_5 4/if(PIND&0x04) = 0) KEY_2/if(PIND&0x08) = 0) KEY_3/if(PINB&0x04) = 0) KEY_4/if(PIND&0x40) = 0) KEY_5/* 名称:void Delay_Key(unsigned int nTime)* 功能:延时函数* 输入:* 输出:* 备注:延时US*/void Delay_Key(unsigned int nTime) while(nTime-);/* 名称:unsigned char Key_Scan(unsigned cha
16、r key)* 功能:按键检测* 输入:KEY_2-KEY_5* 输出:KEY_ON(0)/KEY_OFF(1)* 备注:有松手检测,松手后返回,不松手则循环等待*/unsigned char Key_Scan(unsigned char key) switch(key) /输入按键的编号 case 1: if(PIND&0x04) = 0) /按键2 Delay_Key(5000); /延时消抖 if(PIND&0x04) = 0) /确认按键按下 while(PIND&0x04) = 0); /等待松手 return KEY_ON; /返回KEY_ON else return KEY_OFF; break; case 2: /按键3 if(PIND&0x08) = 0) Delay_Key(5000); /延时消抖 if(PIND&0x08) = 0) /确认按键按下 while(PIND&0x08) = 0); /等待松手 return K