历史上的今天
今天是:2025年04月18日(星期五)
2020年04月18日 | AVR单片机采集DS18B20并LCD显示
2020-04-18 来源:eefocus
#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);
史海拾趣
|
1、自动化仪表与企业的信息化 自动化仪表技术包括信息采集、处理和应用。“企业信息化”实际上是企业信息的集成和整合。为此,必须用自动化和系统的信息模型“简化”、“规则”和“抽象”信息,以便最有效地利用信息。这是自动化仪表领域的一 ...… 查看全部问答> |
|
我想用WinIO.sys获取cpu的当前温度,为什么程序老是失败,temp_dwPortVal=0xffffffff 在头文件中导入: #include \"WinIO.h\" #pragma comment(lib,\"WinIo.lib\") 在实现中: DWORD temp_dwPortVal=0;   ...… 查看全部问答> |
|
s3c2440 camera 疑惑(基于7113的视频采集) 各位大侠,小弟现在正在搞2440 的视频开发,初次涉及,想用7113来做视频采集,烦请各位给提供个简单的思路,或者是大致的方向,不胜感激… 查看全部问答> |
|
自学开始学习单片机,差不多学会了几种,包括8位的51系列和16位的msp430系列,以及32位的arm系列。 听一些人说一般要学会8位的51单片机后学习16位和32位才会比较容易,但是我实在对于他们的区别没有明显的感觉。特别是8位和16位单片机的区别,使用 ...… 查看全部问答> |
|
PSMN1R8-40YLC N-channel 40 V 1.8 mΩ 这款芯片是sot669封装,但是我不清楚是几脚的,关于mb ,到底是画成第五个引脚还是,就只是四个引脚,四个引脚的话,那个Drain是第几引脚?为啥1,2,3引脚都是source引脚?此芯片是用的AltiumDesigner 画的封装,跪求指导。。。… 查看全部问答> |




