信息工程学院 家用多功能报警器的设计
附录B 程序
#include
#define uchar unsigned char #define uint unsigned int
#define ufloat unsigned float
#define LED_DUAN P0 //断码 #define LED_WEI P2 //位选 //单片机I/O使用位定义
sbit DIAN=P0^5; //小数点位
sbit DQ=P3^2; //ds18b20的数据接口 sbit BEEP=P3^4; //蜂鸣器接口 sbit JC_HW=P3^6; //检测红外 sbit JC_YG=P3^7; //检测烟感
bit presence=0; //ds18b20的上电正确判断位 bit BS_W=0; //半秒位
bit KEY_PB=0; //赋值屏蔽位 bit MEUN_N=0; //显示切换
bit HW_PB=0; //红外检测屏蔽位 bit YG_PB=0; //烟感检测屏蔽位 bit WD_PB=0; //温度检测屏蔽位 bit Z_PB=0; //总屏蔽位
//***********数组定义****************
uchar code wei_chose[]={0x08,0x02,0x04,0x01}; //数码管的位选 uchar code duan_ma[]={0xa0,0xbe,0x64,0x2c,0x3a,0x29,0x21,0xbc,0x20,0x28,0xe3,0xe1,0xff};//数码管的段码值
//0 1 2 3 4 5 6 7 8 9 L C
uchar data temp_data[2] = {0x00,0x00} ; //温度数据转换的临时储存空间 uchar code ditab[16] = {0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x04,
0x05,0x06,0x06,0x07,0x08,0x08,0x09,0x09} ;//温度转换后的小数部分的查询值 uchar led_dis_temp[]={0,0,0,12,0}; //led显示测量的值的临时储存区 uchar data wd_set[4]={0,6,12,12}; //温度设置值的储存空间 uchar dis_w=0; //显示位
uint wd_value=0; //温度值暂存 uint t0_1=0; //t0定时器
uchar set_wd=60; // 设置的温度值
信息工程学院 家用多功能报警器的设计
uchar key_zhi=0; //调整值
//***********变量定义*****************
//果错误跳出按键等待 ==0 正确 ==1错误
//**************************** /*************************** 函数名称: 函数功能:
***************************/
/*************************** 函数名称:delay(uint s) 函数功能:毫秒延时函数
***************************/ void Delay(uint s) {
while(s--){;} }
/*************************** 函数名称:delay_ms(uint ms) 函数功能:毫秒延时函数
***************************/ void delay_ms(uint ms) {
uint ms_i; while(ms--) {
for(ms_i=0;ms_i<200;ms_i++) {
_nop_(); _nop_(); } } }
void beep() {
BEEP=0; delay_ms(20); BEEP=1; }
/*初始化ds1820 */
/*******************************************************************/
信息工程学院 家用多功能报警器的设计
Init_DS18B20(void) {
DQ = 1 ; //DQ复位 Delay(8) ; //稍做延时
DQ = 0 ; //单片机将DQ拉低 Delay(90) ; //精确延时 大于 480us
DQ = 1 ; //拉高总线 Delay(8) ;
presence = DQ ; //如果=0则初始化成功 =1则初始化失败 Delay(100) ; DQ = 1 ;
return(presence) ; //返回信号,0=presence,1= no presence }
/* 读一个字节 */
/*******************************************************************/ ReadOneChar(void) {
unsigned char i = 0 ; unsigned char dat = 0 ;
for (i = 8 ; i > 0 ; i--) {
DQ = 0 ; // 给脉冲信号 dat >>= 1 ;
DQ = 1 ; // 给脉冲信号
if(DQ)
dat |= 0x80 ; Delay(4) ; }
return (dat) ; }
/* 写一个字节 */
/*******************************************************************/ WriteOneChar(unsigned char dat) {
信息工程学院 家用多功能报警器的设计
unsigned char i = 0 ; for (i = 8 ; i > 0 ; i--) {
DQ = 0 ;
DQ = dat&0x01 ; Delay(5) ;
DQ = 1 ; dat>>=1 ; } }
/* 数据转换与温度显示 */ /*******************************************************************/ Disp_Temperature() {
led_dis_temp[4]=temp_data[0]&0x0f ;
led_dis_temp[0]=ditab[led_dis_temp[4]] ; //查表得小数位的值 led_dis_temp[4]=((temp_data[0]&0xf0)>>4)|((temp_data[1]&0x0f)<<4) ; wd_value=led_dis_temp[4];
//led_dis_temp[3]=led_dis_temp[4]/100 ; led_dis_temp[1]=led_dis_temp[4]0 ; led_dis_temp[2]=led_dis_temp[1]/10 ; led_dis_temp[1]=led_dis_temp[1] ;
//if(led_dis_temp[3]==0) //高位为0,不显示 {
//led_dis_temp[3]=12 ;
if(led_dis_temp[2]==0) //次高位为0,不显示 led_dis_temp[2]=12 ; } }
/*************************** 函数名称:panduan() 函数功能:显示扫描程序
***************************/ void panduan() {
if((WD_PB==0)&&(set_wd<=wd_value))WD_PB=1,BEEP=0,led_dis_temp[3]=1; else
if((set_wd>wd_value)&&(WD_PB==1))BEEP=1,led_dis_temp[3]=12,WD_PB=0; if(HW_PB==0) {
信息工程学院 家用多功能报警器的设计
if(JC_HW==1)BEEP=0,led_dis_temp[3]=2; }
if(YG_PB==0) {
if(JC_YG==0)BEEP=0,led_dis_temp[3]=3; } }
/*************************** 函数名称:dis_play() 函数功能:显示扫描程序
***************************/ void dis_play() {
//if(dis_w==4) //if(meun_n<2)
LED_DUAN=0XFF; //消隐
if(MEUN_N==0) {
LED_WEI=wei_chose[dis_w]; //位选
LED_DUAN=duan_ma[led_dis_temp[dis_w]]; //段选 if(dis_w==1)DIAN=0; } else {
LED_WEI=wei_chose[dis_w]; //位选
LED_DUAN=duan_ma[wd_set[dis_w]]; //段选 }
dis_w++;
if(dis_w==4)dis_w=0; }
uchar anjian() {
uchar scan; P1=0xf0;
if((P1&0xf0)!=0xf0) {
delay_ms(50);//10ms延时 //scan=P2;
if((P1&0xf0)!=0xf0) {