完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
扫一扫,分享给好友
#include
#include #include #define uchar unsigned char #define uint unsigned int #define BUSY 0x80 ***it RS=P2^0; //LM1602控制信号定义 ***it RW=P2^1; ***it E=P2^2; ***it DQ=P2^7; //DS18B20数据端定义 ***it LED=P3^7; //发光管控制信号定义 uchar temp_data_L,temp_data_H; //当前温度的低位、高位 uchar code look_ASCII[10]= //0~9的ASCII码 {0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39}; uchar code TABLE_DECIMAL[16]= //当前温度小数部分对应的ASCII码 {0x30,0x31,0x31,0x32,0x33,0x33,0x34,0x34,0x35,0x36,0x36,0x37,0x38,0x38,0x39,0x39}; uchar display1[16]= //第1行显示缓冲区 {0x53,0x45,0x54,0x5F,0x54,0x45,0x4D,0x50,0x3A,0x00,0x00,0x00,0x2E,0x30,0xDF,0x43}; uchar display2[16]= //第1行显示缓冲区 {0x43,0x55,0x52,0x5F,0x54,0x45,0x4D,0x50,0x3A,0x00,0x00,0x00,0x2E,0x30,0xDF,0x43}; uint temp_current,temp_set=40; //当前温度、设定温度(初值为40℃) void delay(uint m) //延时 { uint i; for(i=0;i bit resetpulse(void) //产生复位脉冲 { DQ=0; delay(40); DQ=1; delay(4); return(DQ); } void DS18B20_init(void) //DS18B20初始化 { while(1) { if(!resetpulse()) { DQ=1; delay(40); break; } else resetpulse(); } } uchar read_bit(void) //读1位 { DQ=0; _nop_(); _nop_(); DQ=1; delay(2); return(DQ); } uchar read_byte(void) //读1个字节 { uchar i,shift,temp; shift=1; temp=0; for(i=0;i<8;i++) { if(read_bit()) { temp=temp+(shift< } delay(7); } return(temp); } void write_bit(uchar temp) //写1位 { DQ=0; if(temp==1) DQ=1; delay(5); DQ=1; } void write_byte(uchar value) //写1个字节 { uchar i,temp; for(i=0;i<8;i++) { temp=value>>i; temp=temp&0x01; write_bit(temp); delay(5); } } void read_temp() //读取当前温度 { DS18B20_init(); write_byte(0xCC); write_byte(0x44); delay(500); DS18B20_init(); write_byte(0xCC); write_byte(0xBE); temp_data_L=read_byte(); temp_data_H=read_byte(); } void test_LCDbusy() //LM1602测忙 { P0=0xFF; E=1; RS=0; RW=1; _nop_(); while(P0&BUSY) { E=0; _nop_(); E=1; _nop_(); } E=0; } void write_LCDcomm(uchar Comm) //写命令至LM1602 { test_LCDbusy(); RS=0; RW=0; E=0; _nop_(); P0=Comm; _nop_(); E=1; _nop_(); E=0; } void write_LCDdata(uchar Data) //写数据至LM1602 { test_LCDbusy(); P0=Data; RS=1; RW=0; E=1; _nop_(); E=0; } void convert_temp() //当前温度处理 { if((temp_data_H&0xF0)==0xF0) { temp_data_L=~temp_data_L; if(temp_data_L==0xFF) { temp_data_L=temp_data_L+0x01; temp_data_H=~temp_data_H; temp_data_H=~temp_data_H+0x01; } else { temp_data_L=~temp_data_L+0x01; temp_data_H=~temp_data_H; } display2[13]=TABLE_DECIMAL[temp_data_L&0x0F]; temp_current=((temp_data_L&0xF0)>>4)|(temp_data_H&0x0F)<<4); display2[9]=0x2D; display2[10]=look_ASCII[(temp_current%100)/10]; display2[11]=look_ASCII[(temp_current%100)%10]; if((temp_current%100)/10==0) //高位0不显示,负号显示在合适的位置 { display2[9]=0; display2[10]=0x2D; } else { display2[13]=TABLE_DECIMAL[temp_data_L&0x0F]; temp_current=((temp_data_L&0xF0)>>4)|(temp_data_H&0x0F)<<4); display2[9]=look_ASCII[temp_current/100]; display2[10]=look_ASCII[(temp_current%100)/10]; display2[11]=look_ASCII[(temp_current%100)%10]; if(temp_current/100==0) //高位0不显示。如015.3℃,只显示15.3℃ { display2[9]=0; if((temp_current%100)/10==0) { display2[10]=0; } } } } } void set_temp() //设定温度 { display1[9]=look_ASCII[temp_set/100]; display1[10]=look_ASCII[(temp_set%100)/10]; display1[11]=look_ASCII[(temp_set%100)%10]; if(temp_set/100==0) { display1[9]=0; //高位0不显示 if((temp_set%100)/10==0) { display1[10]=0; } } } void init_LCD(void) //LM1602初始化 { write_LCDcomm(0x01); write_LCDcomm(0x38); write_LCDcomm(0x0C); write_LCDcomm(0x06); } void display_temp() { uchar i; write_LCDcomm(0x80); for(i=0;i<16;i++) { write_LCDdata(display1[i]); } write_LCDcomm(0xC0); for(i=0;i<16;i++) { write_LCDdata(display2[i]); } } void main() //主程序 { IE=0x85; //允许INT0、INT1中断,开放总中断 IT0=1; //外部中断下降沿触发 IT1=1; init_LCD(); //LM1602初始化 LED=0; while(1) { read_temp(); //读取当前温度 convert_temp(); //当前温度处理 set_temp(); //设定温度 display_temp(); //显示温度 if(temp_current>=temp_set) //温度超限报警 { LED=~LED; delay(20); } else LED=0; delay(20); } } void EX_INT0()interrupt 0 //外部中断INT0程序 { temp_set++; //设定温度加1 } void EX_INT1()interrupt 2 //外部中断INT1程序 { temp_set--; //设定温度减1 } |
|
相关推荐
2个回答
|
|
记着,像你这种情况,一般情况下都不会有人给你去改程序的。
|
|
|
|
你要给出来你用的149的原理图才可以
|
|
|
|
只有小组成员才能发言,加入小组>>
3027个成员聚集在这个小组
加入小组2911 浏览 1 评论
MSP430FR5994 使用库函数 定时器触发AD问题请教
3562 浏览 2 评论
请问怎么把下面51单片机的代码改成msp430 g2 pocket的代码,还有改下时间变成30秒
2334 浏览 1 评论
4794 浏览 1 评论
2566 浏览 1 评论
1310浏览 3评论
MSP430FR5994 使用库函数 定时器触发AD问题请教
3564浏览 2评论
2912浏览 1评论
1489浏览 0评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-20 20:37 , Processed in 1.237162 second(s), Total 83, Slave 65 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号