四川信息职业技术学院毕业设计说明书
附录1 主要程序代码
主要程序代码及说明(见注释语句)如下: 数字温度传感器模块和显示子模块程序:
#include
#define uchar unsigned char //无符号字符型 宏定义 变量范围0~255 #define uint unsigned int //无符号整型 宏定义 #include \
//数码管段选定义 0 1 2 3 4 5 6 7 8 9
Ucharcodesmg_du[]={0x28,0xee,0x42,0x52,0xe5,0xa8,0x41,0xe7,0x20,0xa0, 0x60,0x25,0x39,0x26,0x31,0x71,0xff}; //断码 //数码管位选定义
uchar code smg_we[]={0xef,0xdf,0xbf,0x7f};
uchar dis_smg[8] = {0x28,0xee,0x32,0xa2,0xe4,0x92,0x82,0xf8}; uchar smg_i = 3; //显示数码管的个位数 sbit dq = P2^4;
bit flag_lj_en; bit flag_lj_3_en;
//按键连加使能
//按键连3次连加后使能 加的数就越大了 //18b20 IO口的定义
变量范围0~65535
uchar key_time,key_value; //用做连加的中间变量 bit key_500ms ; sbit pwm = P2^3;
uchar f_pwm_l ; //越小越暗
第 19 页
四川信息职业技术学院毕业设计说明书
uint temperature ; // bit flag_300ms ;
uchar menu_1; //菜单设计的变量
uint t_high = 300,t_low = 100; //温度上下限报警值 /********************1ms延时函数*************************/
void delay_1ms(uint q) {
uint i,j; for(i=0;i /***********************小延时函数*************************/ void delay_uint(uint q) { while(q--); } /***********************数码显示函数**********************/ void display() { static uchar i; i++; if(i >= smg_i) i = 0; //消隐 //位选 for(j=0;j<120;j++); P1 = 0xff; P3 = smg_we[i]; P1 = dis_smg[i]; //段选 第 20 页 四川信息职业技术学院毕业设计说明书 } /***************把数据保存到单片机内部eepom中***************/ void write_eeprom() { SectorErase(0x2000); byte_write(0x2000, t_high % 256); byte_write(0x2001, t_high / 256); byte_write(0x2002, t_low % 256); byte_write(0x2003, t_low / 256); byte_write(0x2055, a_a); } /*************把数据从单片机内部eeprom中读出来**************/ void read_eeprom() { t_high = byte_read(0x2001); t_high <<= 8; t_high |= byte_read(0x2000); t_low = byte_read(0x2003); t_low <<= 8; t_low |= byte_read(0x2002); a_a = byte_read(0x2055); } /**************开机初始化保存的数据*****************/ void init_eeprom() { 第 21 页 四川信息职业技术学院毕业设计说明书 read_eeprom(); if(a_a != 22) { t_high = 320; t_low = 280; a_a = 22; //先读 //新的单片机初始单片机内问eeprom write_eeprom(); //保存数据 } } /*******************18b20初始化函数*************************/ void init_18b20() { bit q; dq = 1; //把总线拿高 delay_uint(1); dq = 0; //15us //给复位脉冲 //750us //把总线拿高 等待 //110us //读取18b20初始化信号 //200us //把总线拿高 释放总线 delay_uint(80); dq = 1; delay_uint(10); q = dq; delay_uint(20); dq = 1; } /*************写18b20内的数据***************/ void write_18b20(uchar dat) { 第 22 页 四川信息职业技术学院毕业设计说明书 uchar i; for(i=0;i<8;i++) { //写数据是低位开始 //把总线拿低写时间隙开始 dq = 0; dq = dat & 0x01; //向18b20总线写数据了 delay_uint(5); dq = 1; // 60us //释放总线 dat >>= 1; } } /*************读取18b20内的数据***************/ uchar read_18b20() { uchar i,value; for(i=0;i<8;i++) { } return value; } 第 23 页 dq = 0; //把总线拿低读时间隙开始 value >>= 1; //读数据是低位开始 dq = 1; //释放总线 //开始读写数据 if(dq == 1) value |= 0x80; //60us 读一个时间隙最少要保持60us的时间 delay_uint(5); //返回数据