基于单片机的火灾防盗监控系统的设计与仿真_毕业设计(论文) 联系客服

发布时间 : 星期五 文章基于单片机的火灾防盗监控系统的设计与仿真_毕业设计(论文)更新完毕开始阅读eefe731e2e60ddccda38376baf1ffc4ffe47e2bd

x=DQ; //稍做延时后 如果x=0则初始化成功 x=1则初始化

失败

delay(20); return 0; }

/*************************************************/ /* 读字节子函数 */ /*************************************************/ ReadOneChar(void) {

uchar i = 0; uchar dat = 0; for (i=8;i>0;i--) {

DQ = 0; // 给脉冲信号 dat>>=1; // 数据右移一位 DQ = 1; // 给脉冲信号 if(DQ) // DQ为1 dat|=0x80; // 读出数据 delay(4); // 延时 }

return(dat); }

/*************************************************/ /* 写字节子函数 */ /*************************************************/ WriteOneChar(unsigned char dat) {

uchar i = 0;

for (i=8; i>0; i--) {

DQ = 0;

DQ = dat&0x01; //写入一位数据 delay(5); DQ = 1;

dat>>=1; //右移一位数据 } return 0; }

/******************************************/ /* 发送温度转换命令 */ /******************************************/

void tmpchange(void) // DS18B20 begin change {

Init_DS18B20(); // 初始化DS18B20 delay(200); // 延时

WriteOneChar(0xcc); // 跳过序列号命令 WriteOneChar(0x44); // 发送温度转换命令 }

/******************************************/ /* 读出温度函数 */ /******************************************/ uint tmp() //get the temperature {

// float tt;

Init_DS18B20(); // 初始化ds18b2子函数 delay(1);

WriteOneChar(0xcc); // 跳过ROM命令 WriteOneChar(0xbe); // 发送读取数据命令 temp_data[0]=ReadOneChar(); // 连续读两个字节数据 temp_data[1]=ReadOneChar(); temp=temp_data[1];

temp<<=8; temp=temp|temp_data[0]; // 两字节合成一个整型变量。 return temp; // 返回温度值 }

/******************************************/ /* 温度数据显示处理函数 */ /******************************************/ void tem_deal(uint tem) {

/*************温度数据处理*****************/

if(tem>6348) // 温度值正负判断 {tem=65536-tem;flag1=1;} // 负温度求补码,标志位置1 Dis_play[4]=tem&0x0f; // 取小数部分的值 Dis_play[0]=ditab[Dis_play[4]]; // 存入小数部分显示值

Dis_play[4]=tem>>4; // 取中间八位,即整数部分的值 Dis_play[3]=Dis_play[4]/100; // 取百位数据暂存 Dis_play[1]=Dis_play[4]0; // 取后两位数据暂存 Dis_play[2]=Dis_play[1]/10; // 取十位数据暂存 Dis_play[1]=Dis_play[1]; // 取个位数据暂存 if(!Dis_play[3]) // 最高位为0都不显示 {

Dis_play[3]=0x0a; // 先判断百位是否为0 if(!Dis_play[2])

{

Dis_play[2]=0x0a; // 再判断十位是否为0 }}

if(flag1) {

Dis_play[3]=0x0b; // 为负数时,最高位显示 \ }}

/******************************************/ /* 温度数据显示 */ /******************************************/ void display() {

char k;

for(k=0;k<4;k++) //4位LED扫描控制 { Disdata=table[Dis_play[k]]; //数据显示 if (k==1){DIN=0;} //小数点显示 discan=scan_con[k]; //位选 delay(90); //延时 discan=0x0; } }、

/************************************** 键盘程序

****************************************/ #include //*** 函数定义 *** void long_delay(void); // 长延时 void short_delay(void); // 短暂延时 void delay10ms(unsigned char); // 延时10MS void write7279(unsigned char, unsigned char); // 写入到HD7279 unsigned char read7279(unsigned char); // 从HD7279读出 void send_byte(unsigned char); // 发送一个字节 unsigned char receive_byte(void); // 接收一个字节

//*** 变量及I/O口定义 *** unsigned char digit[5];

unsigned char key_number, j, k; unsigned int tmr;

unsigned long wait_cnter; sbit cs=P1^4; // cs at P1.4 sbit clk=P1^5; // clk 连接于 P1.5 sbit dat=P1^2; // dat 连接于 P1.2 sbit key=P1^3; // key 连接于 P1.3 //****** HD7279A 指令 ******

#define CMD_RESET 0xa4 #define CMD_TEST 0xbf #define DECODE0 0x80 #define DECODE1 0xc8 #define CMD_READ 0x15 #define UNDECODE 0x90 #define RTL_CYCLE 0xa3 #define RTR_CYCLE 0xa2 #define RTL_UNCYL 0xa1 #define RTR_UNCYL 0xa0 #define ACTCTL 0x98 #define SEGON 0xe0 #define SEGOFF 0xc0 #define BLINKCTL 0x88 //*** 门控主程序 *** main() { while (1) { for (tmr=0;tmr<0x2000;tmr++); // 上电延时 send_byte(CMD_RESET); // 复位HD7279A //****************************************** // 测试指令演示

//****************************************** send_byte(CMD_TEST); // 测试指令 for (j=0;j<3;j++) // 延时约3秒 { delay10ms(100); } send_byte(CMD_RESET); // 清除显示 //********************************************** // 闪烁指令及键盘接口测试

// 将用户按键的键码显示出来, 如果10秒内无按键 // 或按S0键即进入下一步演示

//********************************************** wait_cnter=0; key_number=0xff; write7279(BLINKCTL,0xfc); // 第1、2两位设为闪烁显示 write7279(UNDECODE,0X08); // 在第1位显示下划线'_' write7279(UNDECODE+1,0x08); // 在第2位显示下划线'_' do { if (!key) // 如果有键按下 {