首页资源分类嵌入式处理器51内核 > 温度报警器C语言

温度报警器C语言

已有 445025个资源

下载专区

上传者其他资源

文档信息举报收藏

标    签:C语言温度

分    享:

文档简介

温控报警器,温度控制,C语言

文档预览

#include #include #include #define uchar unsigned char #define uint unsigned int void Serial_Init(void); //申明串口初始化函数 void GSM_Call(uchar *num); //声明拨打电话函数 void Delay_ms(uint time); //声明延时函数 void SPI_WR_Byte(uchar dat); //声明显示的延时函数 void PDU (char num[],char sms1[]); //【小巴士集团】杜瓦罐压力降低,已切换到备用气罐,请及时更换 /******************************************************************************************************/ sbit KEY0=P1^0; //按键0, 拨打电话 sbit KEY1=P1^1; //按键1, 发送一条1 {【小巴士集团】杜瓦罐压力降低,已切换到备用气罐,请及时更换} sbit KEY2=P1^2; //按键2, 发送一条1 {【小巴士集团】已经换上满的杜瓦罐,已切换回杜瓦罐!} /******************************************************************************************************/ sbit diancifa1=P2^1; //电磁阀正 sbit diancifa2=P2^4; //电磁阀反 sbit lb=P2^3; sbit DS=P2^2; //温度传感器信号线 sbit SDI=P2^5; // SDI 串行数码管数据线 sbit CLK=P2^6; // CLK 串行数码管时钟线 sbit LCK=P2^7; // LCK 串行数码管锁存线 sbit qiehuan=P0^1; //切换 sbit jia=P0^2; //加 sbit jian=P0^3; //减 bit qhbz=0; bit k1=0; bit k2=0; //以上可以 /******************************************************************************************************/ uchar code Tab[] = { //串行数码管段码-共阳(共阴数码管可以这样引用 ~Tab[0],做数据取反操作) 0xc0,0xf9,0xa4,0xb0, 0x99,0x92,0x82,0xf8, 0x80,0x90,0xff }; //0 1 2 3 4 5 6 7 8 9 熄灭 uint temp; // 定义整型的温度数据 uchar flag1; // sign of the result positive or negative uchar wendu=70; uint jishi=0; /******************************************************************************************************/ //以下可以改 char code num[]="15806820588F";//要拨打的电话号码 char code num1[]="13869239939F";//要拨打的电话号码 char code sms1[]="301051EF80DC94A27ED367843011675C74E67F50538B529B964D4F4EFF0C8BF753CA65F666F46362FF01";//【小巴士集团】杜瓦罐压力降低,已切换到备用气罐,请及时更换! char code sms2[]="301051EF80DC94A27ED3678430115DF27ECF63624E0A6EE17684675C74E67F50FF0C8BF7653E5FC34F7F7528FF01";//【小巴士集团】已经换上满的杜瓦罐,已切换回杜瓦罐! char code smsa[]="5C0A656C768498865BFCFF1A301051EF80DC94A27ED367843011675C74E67F50538B529B964D4F4EFF0C8BF753CA65F666F46362FF01"; //尊敬的领导:【小巴士集团】杜瓦罐压力降低,已切换到备用气罐,请及时更换! char code smsb[]="5C0A656C768498865BFCFF1A301051EF80DC94A27ED3678430115DF27ECF63624E0A6EE17684675C74E67F50FF0C8BF7653E5FC34F7F7528FF01"; //尊敬的领导:【小巴士集团】已经换上满的杜瓦罐,已切换回杜瓦罐! //以上内容可以更改 /******************************************************************************************************/ //以下不要动 char code str1[]="AT\n" ; //与gsm模块握手 char code str2[]="AT+CMGF=0\n"; //切换成中文模式 char code str3[]="AT+CSCS=GSM\n"; //使用GSM字符集 char code str4[]="AT+CSMP=17,167,0,8\n"; //设置成PDU模式 使用8位的编码 char code str5[]="AT+CMGS="; //发送短信 char code str6[]="0891683108504305F011000D9168";//自己改{683108504305F0} 山东德州的信息中心号码 char code str7[]="000800"; //短信的属性不要动 //温度延时函数 void delay(uint count) //温度延时函数 { uint i; while(count) { i=200; while(i>0) i--; count--; } } //温度发送复位和初始化命令 void dsreset(void) //温度发送复位和初始化命令 { uint i; DS=0; i=103; while(i>0)i--; DS=1; i=4; while(i>0)i--; } //温度读字节读1位数据函数函数 bit tmpreadbit(void) //温度读字节读1位数据函数函数 { uint i; bit dat; DS=0;i++; //i++ 起延时作用 DS=1;i++;i++; dat=DS; i=8;while(i>0)i--; return (dat); } //温度读1个字节数据函数 uchar tmpread(void) //温度读1个字节数据函数 { uchar i,j,dat; dat=0; for(i=1;i<=8;i++) { j=tmpreadbit(); dat=(j<<7)|(dat>>1); //读出的数据最低位在最前面,这样刚好一个字节在DAT里 } return(dat); } //温度向DS18B20写一个字节数据函数 void tmpwritebyte(uchar dat) //温度向DS18B20写一个字节数据函数 { uint i; uchar j; bit testb; for(j=1;j<=8;j++) { testb=dat&0x01; dat=dat>>1; if(testb) //写1 { DS=0; i++;i++; DS=1; i=8;while(i>0)i--; } else { DS=0; //写 0 i=8;while(i>0)i--; DS=1; i++;i++; } } } //DS18B20 开始获取温度并转换 void tmpchange(void) //DS18B20 开始获取温度并转换 { dsreset(); delay(1); tmpwritebyte(0xcc); // 写跳过读ROM指令 tmpwritebyte(0x44); //写温度转换指令 } uint tmp() //温度读取寄存器中存储的温度数据 { float tt; uchar a,b; dsreset(); delay(1); tmpwritebyte(0xcc); tmpwritebyte(0xbe); a=tmpread();//读低8位 b=tmpread();//读高8位 temp=b; temp<<=8; //两个字节组合为1个字 temp=temp|a; tt=temp*0.0625;//温度在寄存器中为12位,分辨率为0.0625° temp=tt*10+0.5;//乘以10表示小数点后面只取1位,加0.5是四舍五入 return temp;//temp是整型 } //显示程序 void display(uint temp) //显示程序 { uchar A1,A2,A2t,A3; A1=temp/100; A2t=temp%100; A2=A2t/10; A3=A2t%10; SPI_WR_Byte(0x39); //(共阴代码0X39, 共阳代码0xc6)显示C SPI_WR_Byte(~Tab[A3]); //显示个位 //SPI_WR_Byte(~Tab[A3]); //显示个位(共阴数码管驱动代码样例,只需在Tab前加~取反符号) SPI_WR_Byte(~Tab[A2] - 0x80); //显示十位带小数点. SPI_WR_Byte(~Tab[A1]); //显示百位 LCK= 1; //打开显示//串行数码管锁存线 LCK= 0; //串行数码管锁存线 } /******************************************************************************************************/ //判断赋值 void k1k2() { if(k1==0&&k2==0) { if(KEY1==0){ Delay_ms(50); if(KEY1==0) {k1=1;} } if(KEY2==0){ Delay_ms(50); if(KEY2==0) {k2=1;} } } } //主函数 void main(void) { Serial_Init();//调用串口初始化函数 TI=1; while(1) { tmpchange(); display(tmp()); //------------------------------------------------------------ if(qiehuan==0) { Delay_ms(50); //确定切换键被按下 if(qiehuan==0) { EA = 1; ET0 = 1; qhbz=1; //打开定时器进入计时并显示预设值 while(qhbz) { display(wendu); } } } //------------------------------------------------------------ k1k2(); //调用赋值 if(KEY0==0) //打电话 { Delay_ms(50); GSM_Call(num); Delay_ms(9000); } if(KEY1==0&&k1==1)//【 集团】杜瓦罐压力降低,已切换到备用气罐,请及时更换 { Delay_ms(50); if(KEY1==0&&k1==1) { Delay_ms(50); diancifa1=0; //电磁阀正接通 Delay_ms(1000); //电磁阀接通延时时间 diancifa1=1; //电磁阀正断开 Delay_ms(1000); PDU(num,sms1); //给主号码发信息 Delay_ms(3000); PDU(num1,smsa); //给副号码发信息 Delay_ms(3000); lb=0; Delay_ms(500); lb=1; k1=0; k2=1; Delay_ms(50); } } if(KEY2==0&&k2==1)//【 集团】已经换上满的杜瓦罐,已切换回杜瓦罐! { Delay_ms(50); if(KEY2==0&&k2==1) { Delay_ms(50); diancifa2=0; //电磁阀正接通 Delay_ms(1000); //电磁阀接通延时时间 diancifa2=1; //电磁阀正断开 Delay_ms(1000); PDU(num,sms2); //给主号码发信息 Delay_ms(3000); PDU(num1,smsb); //给副号码发信息 lb=0; Delay_ms(500); lb=1; k1=1; k2=0; Delay_ms(50); } } } } /******************************************************************************************************/ void GSM_Call(uchar *num)//打电话 函数 { printf("ATD"); printf("%s;\n",num); Delay_ms(20); } void PDU(char num[],char sms1[])//声明发送PDU短信模式函数子函数 { uchar i; printf("%s",str1); Delay_ms(1000); printf("%s",str2); Delay_ms(1000); printf("%s",str3); Delay_ms(1000); printf("%s",str4); Delay_ms(1000); printf("%s",str5); printf("%d\n",strlen(sms1)/2+15); Delay_ms(1000); printf("%s",str6); for(i=0;i<6;i++) { printf("%c%c",num[2*i+1],num[2*i]); } printf("%s",str7); printf("%02x",strlen(sms1)/2); printf("%s\x1a",sms1); Delay_ms(1000); } void Serial_Init(void)//串口初始化函数 { SCON=0x50; //串口方式 1 ,允许发送和接送 TMOD=0x20; //定时器1.模式2,8位自动重装模式用于产生波特率 TH1=0xFD; TL1=0xFD; //11.0592M晶振 波特率9600 TR1=1; //开启定时器1 } void Delay_ms(uint time)//延时函数 { uint i,j; for(i=time;i>0;i--) for(j=110;j>0;j--); } //温度显示函数 void SPI_WR_Byte(uchar dat) { uchar i; CLK= 0; for(i=0;i<8;i++) { if(dat&0x80) { SDI = 1; } else { SDI = 0; //串行数码管数据线 } CLK= 1; //串行数码管时钟线 dat <<= 1; CLK= 0; //串行数码管时钟线 } } void shezhi() { if(jia==0){wendu++; if(wendu>=99)wendu=99;} if(jian==0){wendu--; if(wendu==0)wendu=0; } } void InitTimer0(void) { TMOD = 0x01; TH0 = 0x0D8; TL0 = 0x0F0; // EA = 1; // ET0 = 1; TR0 = 1; } void main(void) { InitTimer0(); } void Timer0Interrupt(void) interrupt 1 { TH0 = 0x0D8; TL0 = 0x0F0; jishi++; //十毫秒加1 }

Top_arrow
回到顶部
EEWORLD下载中心所有资源均来自网友分享,如有侵权,请发送举报邮件到客服邮箱bbs_service@eeworld.com.cn 或通过站内短信息或QQ:273568022联系管理员 高员外,我们会尽快处理。