1、恒温控制系统的程序2.1 DS18B20模块程序#include Includes.h /文件包含/* 模块级变量申明 */static void OneWire_Rst(void);static void OneWire_Init(void);static void OneWire_WriteByte(int8u cmd);static int8u OneWire_ReadByte(void);static void OneWire_Idle(void);/* 子函数定义 */* 函 数 名: static void OneWire_Init(void)* 功能描述: * 全局变量: * 输
2、 入: NO !* 输 出: NO !/* 创 建 人: 日期: */* 修 改 人: 日期: */ /* 其他说明: * 函数说明: 单总线数据传输初始化;/*/static void OneWire_Init(void) DQ = 1; NOP(); DQ = 0; /拉低数据线,准备Reset OneWire Bus; Delay_Xus(125); /延时510us,Reset One-Wire Bus. Delay_Xus(125); DQ = 1; /提升数据线; Delay_Xus(15); /延时35us; while(DQ) /等待Slave 器件Ack 信号; NOP();
3、 Delay_Xus(60); /延时125us; DQ = 1; /提升数据线,准备数据传输; /* 函 数 名: static void OneWire_Rst(void)* 功能描述: * 全局变量: No !* 输 入: NO !* 输 出: NO !/* 创 建 人: 日期: */* 修 改 人: 日期: */ /* 其他说明: : 日期:* 函数说明: 单总线Reset pulse;/*/static void OneWire_Rst(void) DQ = 0; /拉低数据线,准备Reset OneWire Bus; Delay_Xus(125); /延时511us,Reset O
4、ne-Wire Bus. DQ = 0; Delay_Xus(125); /* 函 数 名: static void OneWire_WriteByte(int8u cmd)* 功能描述: 写一个字节;* 全局变量: NO !* 输 入: cmd:8bit;* 输 出: NO !/* 创 建 人: 日期: */* 修 改 人: 日期: */ /* 其他说明: * 函数说明: cmd主要有Rom操作指令和E2Ram操作指令两种;/*/static void OneWire_WriteByte(int8u cmd) int8u i; for(i=0;i= 1; /* 函 数 名: static i
5、nt8u OneWire_ReadByte(void)* 功能描述: 读取一个字节;* 全局变量: NO !* 输 入: NO !* 输 出: 8bit data;/* 创 建 人: 日期: */* 修 改 人: 日期: */ /* 其他说明: * 函数说明: 读之前必须首先写1;/*/static int8u OneWire_ReadByte(void) int8u i; int8u tmp = 0; DQ = 1; /准备读; NOP(); for(i=0;i= 1; /低位先发; DQ = 0; /Read init; _nop_(); /2ms; DQ = 1; /必须写1,否则读出来
6、的将是不预期的数据; Delay_Xus(2); /延时9us; _nop_(); if(DQ) /在12us处读取数据; tmp |= 0x80; Delay_Xus(30); /延时55us; DQ = 1; /恢复One Wire Bus; NOP(); return tmp; /* 函 数 名: static void OneWire_Idle(void)* 功能描述: 总线空闲模式;* 全局变量: NO !* 输 入: NO !* 输 出: NO !/* 创 建 人: 日期: */* 修 改 人: 日期: */ /* 其他说明: * 函数说明: /*/static void OneW
7、ire_Idle(void) DQ = 1; NOP(); /* 函 数 名: extern void DS18B20_Init(void)* 功能描述: 器件DS18B20初始化;* 全局变量: NO !* 输 入: NO !* 输 出: NO !/* 创 建 人: 日期: */* 修 改 人: 日期: */ /* 其他说明: /*/extern void DS18B20_Init(void) OneWire_Init(); /* 函 数 名: extern void DS18B20_RomCmd(int8u romCmd)* 功能描述: DS18B20Rom操作命令写;* 全局变量: NO
8、 !* 输 入: romCmd;* 输 出: NO !/* 创 建 人: 日期: */* 修 改 人: 日期: */ /* 其他说明: * 函数说明: 0x33:Read Rom; 0x55:Match Rom; 0xcc:Skip rom; 0xf0: Search rom; 0xec:Alarm Search./*/extern void DS18B20_RomCmd(int8u romCmd) /仅写了SkipRom例程; switch(romCmd) case 0xcc: /Skip Rom command; OneWire_WriteByte(0xcc); break; defaul
9、t: break; /* 函 数 名: extern void DS18B20_MemCmd(int8u memCmd)* 功能描述: DS18B20Memory 操作命令;* 全局变量: NO !* 输 入: NO !* 输 出: NO !/* 创 建 人:xilu 日期: */* 修 改 人: 日期: */ /* 其他说明: * 函数说明: 仅写了ConvertT(0x44) 和0xBE命令; 0x44:Convert T; 0xbe:Read Scratch-pad;/*/extern void DS18B20_MemCmd(int8u memCmd) switch(memCmd) ca
10、se 0x44: /Start to Convert temperature; OneWire_WriteByte(0x44); NOP(); DS18B20_Busy(); Delay_Xms(250); /延时750ms; Delay_Xms(250); Delay_Xms(250); break; case 0xbe: /Read scratchpad; OneWire_WriteByte(0xbe); break; default: break; /* 函 数 名: extern void DS18B20_ReadDat(int8u len,int8u *buf)* 功能描述: 读取D
11、S18B20内部的Scratchpad内容;* 全局变量: NO !* 输 入: len:将要读取的数据长度;* 输 出: buf:数据缓存;/* 创 建 人: 日期: */* 修 改 人: 日期: */ /* 其他说明: * 函数说明: /*/extern void DS18B20_ReadDat(int8u len,int8u *buf) int8u i; for(i=0;ilen;i+) bufi = OneWire_ReadByte(); OneWire_Rst(); OneWire_Idle(); /* 函 数 名: extern void DS18B20_Busy(void)* 功
12、能描述: 内部模数转换中,忙* 全局变量: NO !* 输 入: NO !* 输 出: NO !/* 创 建 人: 日期: */* 修 改 人: 日期: */ /* 其他说明: * 函数说明: /*/extern void DS18B20_Busy(void) OneWire_Idle(); /* End Of File*/2.2 LCD1602模块程序#include Includes.h/* 模块级变量申明 */static void LCD_WriteDat(int8u lcd_dat);static void LCD_WriteCmd(int8u lcd_cmd);static int
13、8u LCD_ReadStatus(void);static void LCD_Goto(int8u x,int8u y);/* 函 数 名: void main(void)* 功能描述: * 全局变量: * 输 入: * 输 出: /* 创 建 人: 日期: */* 修 改 人: 日期: */ /* 其他说明: /*/extern void LCD_Init(void) Delay20ms(); LCD_WriteCmd(0x38); /功能设置:8位机接口、双行显示、57字符点阵; LCD_WriteCmd(0x0c); /显示控制:光标开启、字符不闪烁; LCD_WriteCmd(0x0
14、1); /清屏; LCD_WriteCmd(0x06); /访问模式:光标右移一位、整屏不移动; LCD_Goto(0,0); static void LCD_WriteDat(int8u lcd_dat) int8u tmp; tmp = LCD_ReadStatus(); /读状态; while(tmp & 0x80) /是否忙 ? tmp = LCD_ReadStatus(); #if 0 LCD_RS = 1; LCD_RW = 0; LCD_EN = 1; _nop_(); _nop_(); LCD_DATA = lcd_dat; _nop_(); _nop_(); LCD_EN =
15、 0; #endif LCD_RS = 1; LCD_RW = 0; LCD_DATA = lcd_dat; _nop_(); LCD_EN = 0; _nop_(); _nop_(); LCD_EN = 1; static void LCD_WriteCmd(int8u lcd_cmd) int8u tmp; tmp = LCD_ReadStatus(); while(tmp & 0x80) tmp = LCD_ReadStatus(); #if 0 LCD_RS = 0; LCD_RW = 0; LCD_EN = 1; _nop_(); _nop_(); LCD_DATA = lcd_cm
16、d; _nop_(); _nop_(); LCD_EN = 0; #endif LCD_RS = 0; LCD_RW = 0; LCD_DATA = lcd_cmd; _nop_(); LCD_EN = 0; _nop_(); _nop_(); LCD_EN = 1; static int8u LCD_ReadStatus(void) int8u tmp; #if 0 LCD_RS = 0; LCD_RW = 1; LCD_EN = 1; tmp = LCD_DATA; LCD_EN = 0; #endif LCD_DATA = 0xff; LCD_RS = 0; LCD_RW = 1; LC
17、D_EN = 0; _nop_(); _nop_(); LCD_EN = 1; tmp = LCD_DATA; return tmp; static void LCD_Goto(int8u x,int8u y) int8u tmp; if(y) /若是第二行; tmp = 0xc0 + x; LCD_WriteCmd(tmp); else tmp = 0x80 + x; LCD_WriteCmd(tmp); #if 0extern void LCD_DisplayShiftR(void) /整屏右移; LCD_WriteCmd(0x1f); extern void LCD_DisplayShi
18、ftL(void) /整屏左移; LCD_WriteCmd(0x18); #endif extern void LCD_Display(int8u row,int8u *str) if(row) LCD_Goto(0,1); else LCD_Goto(0,0); while(*str != 0) LCD_WriteDat(*str+); #if 0extern void LCD_Display(int8u x,int8u y,int8u disp_dat) LCD_Goto(x,y); LCD_WriteDat(disp_dat); #endif#if 0 extern void LCD_D
19、isplay(int8u disp_dat) int8u tmp; tmp = LCD_ReadStatus(); tmp &= 0x7f; if(tmp = 0x10) /第一行显示满则转向第二行; LCD_Goto(0,1); if(tmp = 0x50) /全屏显示满则清屏; LCD_WriteCmd(0x01); LCD_WriteDat(disp_dat); /将接收字符显示在LCD屏上; #endifextern void Delay20ms() /粗略延时; int16u tmp = 50000; while(tmp-); /* End Of File*/2.3延时函数模块程序#include Includes.h/*延时计算式:2 x+5;Step:2us;*/extern void Delay_Xus(int8u x) /x取值1255; while(-x);/ int8u i;/ x /=