#include #include #define uchar unsigned char #define uint unsigned int #define beep_0 (PORTD = PORTD&0x7F) #define beep_1 (PORTD = PORTD|0x80) #define RS_0 PORTC &= ~(1< #define DQ PB3 #define DQ_SET (PORTB)|=(1< uchar yes0; uchar temp_flag; uchar temp_comp; uchar disp_buf[8]={0}; uchar temp_data[2]={0x00,0x00}; uchar line1_data[]=" DS18b20 OK "; uchar line2_data[]=" TEMP: "; uchar menu1_error[]=" DS18B20 ERR "; uchar menu2_error[]=" TEMP:--- "; /*****函数声明*****/ void port_init(void); void TempDisp(void); void beep(void); void MenuError(void); void MenuOk(void); void GetTemperture(void); void TempConv(void); void delay_us(unsigned int n); void Delay_ms(uint xms); uchar lcd_busy(void); void lcd_wcmd(uchar cmd); void lcd_wdat(uchar dat); void lcd_clr(void); void lcd_init(void); void LocateXY(uchar x,uchar y); void LCD_write_char(uchar x,uchar y,uchar data); void LCD_write_str(uchar x,uchar y,uchar *s); void PortDS18B20_Init(void); uchar Init_DS18B20(void); uchar ReadOneByte(void); void WriteOneByte(uchar dat); /*****端口设置函数*****/ void port_init(void) { PORTA = 0xFF; DDRA = 0xFF; PORTC = 0xFF; DDRC = 0xFF; DDRD = (1< PORTB = 0xFF; } /*****蜂鸣器函数*****/ void beep() { beep_0; Delay_ms(100); beep_1; Delay_ms(100); } /*****温度值显示函数*****/ void TempDisp() { LocateXY(6,1); lcd_wdat(disp_buf[3]); lcd_wdat(disp_buf[2]); lcd_wdat(disp_buf[1]); lcd_wdat('.'); lcd_wdat(disp_buf[0]); lcd_wdat(0xDF); lcd_wdat('C'); } /*****DS18B20正常时的菜单函数*****/ void MenuOk() { LCD_write_str(0,0,line1_data); LCD_write_str(0,1,line2_data); } /*****DS18B20出错时的菜单函数*****/ void MenuError() { lcd_clr(); LCD_write_str(0,0,menu1_error); LCD_write_str(0,1,menu2_error); LocateXY(11,1); lcd_wdat(0xDF); lcd_wdat('C'); } /*****读取温度值函数*****/ void GetTemperture(void) { SREG = 0x00; Init_DS18B20(); IF(yes0==0) { WriteOneByte(0xCC); WriteOneByte(0x44); Delay_ms(1000); Init_DS18B20(); WriteOneByte(0xCC); WriteOneByte(0xBE); temp_data[0] = ReadOneByte(); temp_data[1] = ReadOneByte(); temp_flag = 1; } else temp_flag = 0; SREG = 0x80; } /*****温度数据转换函数*****/ void TempConv() { uchar sign = 0; uchar temp; if(temp_data[1]>127) { temp_data[0] = (~temp_data[0]) + 1; if((~temp_data[0])>=0xFF) temp_data[1] = (~temp_data[1]) + 1; else temp_data[1]=~temp_data[1]; sign = 1; } temp = temp_data[0]&0x0F; disp_buf[0] = (temp*10/16) + 0x30; temp_comp = ((temp_data[0]&0xF0)>>4)|((temp_data[1]&0x0F)<<4); disp_buf[3] = temp_comp/100 + 0x30; temp = temp_comp % 100; disp_buf[2] = temp/10 + 0x30; disp_buf[1] = temp%10 + 0x30; if(disp_buf[3] == 0x30) { disp_buf[3] = 0x20; if(disp_buf[2] == 0x30) disp_buf[2] = 0x20; } if(sign) disp_buf[3] = 0x2D; } /*****主函数*****/ void main(void) { port_init(); PortDS18B20_Init(); lcd_init(); lcd_clr(); while(1) { GetTemperture(); if(temp_flag == 0) { beep(); MenuError(); } if(temp_flag == 1) { TempConv(); MenuOk(); TempDisp(); } } } /***** #include"1602LCD_drive.h" *****/ /****us延时函数*****/ void delay_us(unsigned int n) { if(n == 0) return; while(--n); } /*****ms延时函数*****/ void Delay_ms(uint xms) { int i,j; for(i=0;i } /*****LCD忙碌检查函数*****/ uchar lcd_busy() { uchar result; DDRA = 0x00; RS_0; RW_1; EN_1; delay_us(40); result = PINA&0x80; EN_0; return result; } /*****写指令寄存器IR函数*****/ void lcd_wcmd(uchar cmd) { DDRA = 0xFF; while(lcd_busy()); RS_0; RW_0; EN_0; PORTA = cmd; delay_us(40); EN_1; delay_us(40); EN_0; } /*****写寄存器DR函数*****/ void lcd_wdat(uchar dat) { DDRA = 0xFF; while(lcd_busy()); RS_1; RW_0; EN_0; PORTA = dat; delay_us(40); EN_1; delay_us(40); EN_0; } /*****LCD清屏函数*****/ void lcd_clr() { lcd_wcmd(0x01); Delay_ms(5); } /*****LCD初始化函数*****/ void lcd_init() { Delay_ms(15); while(lcd_busy()); lcd_wcmd(0x38); Delay_ms(10); while(lcd_busy()); lcd_wcmd(0x38); Delay_ms(10); while(lcd_busy()); lcd_wcmd(0x38); Delay_ms(10); while(lcd_busy()); lcd_wcmd(0x0c); Delay_ms(10); while(lcd_busy()); lcd_wcmd(0x06); Delay_ms(10); while(lcd_busy()); lcd_wcmd(0x01);
上一篇:如何解决AVR单片机烧写过程中弄错熔丝位而造
下一篇:为什么AVR单片机需要写1作为清0中断标志位
推荐阅读最新更新时间:2024-11-09 09:58
设计资源 培训 开发板 精华推荐
- NUCLEO-L476RG,STM32 Nucleo 开发板,带有 STM32L476RGT6 MCU,支持 Arduino 和 ST morpho 连接
- LTC2939HMS 电源和温度监视器的典型应用电路
- 使用 Analog Devices 的 LT3066IDE 的参考设计
- NSV45015WT1G 可调电流 LED 串并联 CCR 的典型应用
- 具有固定输出电压、2.8V ADP162 超低静态电流、150mA CMOS 线性稳压器的典型应用电路
- 基于stm32的分布式大棚管理系统
- ESP8266/RFID胸牌
- ESP32电子负载仪
- 热插拔和缓冲 I2C 总线
- 使用 Analog Devices 的 AD9361BBCZ 的参考设计
- 是德科技有奖问答活动之三,极限温度测试示波器探头方案,答题闯关赢好礼!
- 从终端到架构,TE Connectivity(TE)助你连接5G高速未来 看视频答题赢好礼!
- 邀你参加:EEWORLD&ST 智能产品线下研讨会(12月6日-深圳)
- MPS电机研究院 让电机更听话的秘密! 第二站:电机设计经验征集令!
- 读PI 汽车电子参考设计,赢京东卡!
- 直播已结束|如何通过【TI MSPM0 固件示例】及【常用电机驱动器方案和拓扑】,在10分钟内旋转电机
- 1月22日下午14:00Mouser携手Maxim邀您观看有奖直播:深入浅出可穿戴健康监测
- 下载有好礼!TE 户外监控,创建安全稳定社会的重要保障和趋势之选!
- 【预约有礼】全球测量圈大咖直播:验证5G核心网,确保最佳性能
- 调查:量身定制你的 M0 单片机!参与问卷有好礼!