1
完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
|
相关推荐
2 个讨论
|
|
# include
#define uint unsigned int #define uchar unsigned char //宏定义 ***it p34=P2^4; ***it p35=P2^5; ***it p36=P2^6; ***it dp=P0^7; ***it p37=P2^7; ***it DQ=P2^2; //定义DS18B20总线I/O ***it SET=P3^1; //定义选择报调整警温度上限和下限(1为上限,0为下限) /****P3.2和P3.3为调整温度报警增加键和减少键******/ ***it LING=P2^0; //定义响铃 signed char m; //温度值全局变量 bit sign=0; //外部中断状态标志 signed char shangxian=38; //上限报警温度,默认值为38 signed char xiaxian=6; //下限报警温度,默认值为5 uchar code LEDData[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff,0xbf}; /*****延时子程序*****/ void Delay(uint i) { while( i-- ); } void Init_DS18B20(void) { unsigned char x=0; DQ=1; Delay(8); //稍做延时 DQ=0; //单片机将DQ拉低 Delay(80); //精确延时,大于480us DQ=1; //拉高总线 Delay(14); x=DQ; //稍做延时后,如果x=0则初始化成功,x=1则初始化失败 Delay(20); } /*****读一个字节*****/ unsigned char 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); } /*****写一个字节*****/ void 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; } } void Tmpchange(void) //发送温度转换命令 { Init_DS18B20(); WriteOneChar(0xCC); //跳过读序号列号的操作 WriteOneChar(0x44); //启动温度转 } unsigned int ReadTemperature(void) { unsigned char a=0; unsigned char b=0; unsigned int t=0; float tt=0; Tmpchange(); Init_DS18B20(); WriteOneChar(0xCC); //跳过读序号列号的操作 WriteOneChar(0xBE); //读取温度寄存器 a=ReadOneChar(); //读低8位 b=ReadOneChar(); //读高8位 t=b; t<<=8; t=t|a; tt=t*0.0625; t= tt*100+0.5; //放大10倍输出并四舍五入 return(t); } /*****显示开机初始化等待画面*****/ Disp_init() { P0 = 0x80; //显示- p34=1;p35=0;p36=0;p37=0; Delay(200); P0 = 0x80; p34=0;p35=1;p36=0;p37=0; Delay(200); P0 = 0x80; p34=0;p35=0;p36=1;p37=0; Delay(200); P0 = 0x80; p34=0;p35=0;p36=0;p37=1; Delay(200); P0 = 0x80; } Disp_Temperature() //显示温度 { uint a,b,c,d,e; e=ReadTemperature(); //获取温度值 a=e/1000; //计算得到十位数 b=e/100-a*10; //计算得到个位数字 d=e%10; //计算得到小数点后两位 c=(e%100)/10; //计算得到小数点后一位 m=e/100; if(m>shangxian || m P0 =LEDData[d]; //显示小数点后两位 p34=1;p35=0;p36=0;p37=0; Delay(300); p34=0;p35=0;p36=0;p37=0; P0 =LEDData[c]; //显示小数点后一位 p34=0;p35=1;p36=0;p37=0; Delay(300); p34=0;p35=0;p36=0;p37=0; P0 =LEDData[b]; //显示个位 dp=0; p34=0;p35=0;p36=1;p37=0; Delay(300); p34=0;p35=0;p36=0;p37=0; P0 =LEDData[a]; //显示十位 p34=0;p35=0;p36=0;p37=1; Delay(300); p34=0;p35=0;p36=0;p37=0; //关闭显示 } disptiaozheng() { uchar f,g,j,k; f=shangxian/10; g=shangxian%10; j=xiaxian/10; k=xiaxian%10; p34=0;p35=0;p36=0;p37=0; P0 =0xc0; //显示0 p34=1;p35=0;p36=0;p37=0; Delay(200); p34=0;p35=0;p36=0;p37=0; P0 =0xc0; //显示0 p34=0;p35=1;p36=0;p37=0; Delay(200); p34=0;p35=0;p36=0;p37=0; if(SET==1) { P0 =LEDData[g]; dp=0; //显示上限温度个位 } else { P0 =LEDData[k]; dp=0; } p34=0;p35=0;p36=1;p37=0; Delay(200); p34=0;p35=0;p36=0;p37=0; if(SET==1) P0 =LEDData[f]; //显示上限温度十位 else { if(f==0) P0=0x00; //不显示下限温度十位 else P0 =LEDData[j]; //显示下限温度十位 } p34=0;p35=0;p36=0;p37=1; Delay(200); p34=0;p35=0;p36=0;p37=0; //关闭显示 Delay(20); } void int0(void) interrupt 0 { EX0=0; //关外部中断0 sign=1; if(SET==1) shangxian++; else xiaxian++; Delay(500); EX0=1; } /*****外部中断1服务程序*****/ void int1(void) interrupt 2 { EX1=0; //关外部中断0 sign=1; if(SET==1) shangxian--; else xiaxian--; Delay(500); EX1=1; } /*****主函数*****/ void main(void) { uint z; IT0=1; IT1=1; EX0=1; EX1=1; EA=1; ReadTemperature(); LING=0; for(z=0;z<100;z++) { Disp_init(); } while(1) { Disp_Temperature(); if(sign==1) { for(z=0;z<300;z++) disptiaozheng(); sign=0; } } } |
|
|
|
|
|
只有小组成员才能发言,加入小组>>
3052个成员聚集在这个小组
加入小组2965 浏览 1 评论
MSP430FR5994 使用库函数 定时器触发AD问题请教
3677 浏览 2 评论
请问怎么把下面51单片机的代码改成msp430 g2 pocket的代码,还有改下时间变成30秒
2362 浏览 1 评论
4827 浏览 1 评论
2586 浏览 1 评论
1362浏览 3评论
MSP430FR5994 使用库函数 定时器触发AD问题请教
3677浏览 2评论
2965浏览 1评论
1557浏览 0评论
小黑屋| 手机版| Archiver| 德赢Vwin官网 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-21 16:28 , Processed in 1.601522 second(s), Total 44, Slave 38 queries .
Powered by 德赢Vwin官网 网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
德赢Vwin官网 观察
版权所有 © 湖南华秋数字科技有限公司
德赢Vwin官网 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号