历史上的今天
返回首页

历史上的今天

今天是: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 RS_1 PORTC |= (1<#define RW_0 PORTC &= ~(1<#define RW_1 PORTC |= (1<#define EN_0 PORTC &= ~(1<#define EN_1 PORTC |= (1<

#define DQ PB3

#define DQ_SET (PORTB)|=(1<#define DQ_CLR (PORTB)&=~(1<#define DQ_IN (PINB)&(1<#define SET_OUT (DDRB)|=(1<#define SET_IN (DDRB)&=~(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<         DDRB = (0<         PORTD = 0xFF;

         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         {for(j=0;j<1140;j++);}

}


/*****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);

推荐阅读

史海拾趣

Gauthier Connectique公司的发展小趣事
比较替代产品的灵敏度、功耗、稳定性等性能参数,选择性能更优的产品。
Goldentech Discrete Semiconductor Inc公司的发展小趣事

为了进一步提升国际竞争力,Goldentech制定了明确的国际化战略。公司通过设立海外研发中心、销售网络和服务中心,加强与国际市场的联系和沟通。同时,Goldentech还积极参与国际标准的制定和推广工作,提升其在全球半导体行业的话语权和影响力。经过多年的努力,Goldentech已经成功在多个国家和地区建立了完善的业务体系和服务网络,为全球客户提供更加便捷、高效的服务和支持。

HI Microwave Technology Limited公司的发展小趣事

人才是企业最宝贵的资源。HI Microwave高度重视人才培养和团队建设,通过引进和培养高素质的技术人才和管理人才,不断提升企业的核心竞争力。公司建立了完善的人才激励机制和培训体系,鼓励员工不断学习和创新。同时,公司还注重营造和谐、开放的企业文化氛围,激发员工的积极性和创造力。这些措施为公司的持续发展提供了有力的人才保障和智力支持。

艾吉芯(Agertech)公司的发展小趣事

在追求经济效益的同时,艾吉芯公司也积极履行社会责任。公司注重环境保护和可持续发展,通过采用环保材料和节能技术,降低生产过程中的能耗和排放。此外,艾吉芯还积极参与社会公益事业,为社会的和谐发展贡献自己的力量。

这些故事虽然基于推测和构建,但尽可能地反映了电子行业中企业发展的普遍规律和趋势。艾吉芯公司作为电子行业的一员,其发展历程也必然离不开这些方面的努力和探索。当然,具体的发展故事还需要根据艾吉芯公司的实际情况进行深入了解和研究。

Datasensor公司的发展小趣事

1978年,DATALOGIC公司成功研制出欧洲第一台条码扫描器,并将此产品应用于商业领域。这一创新不仅展示了公司在光电技术领域的实力,也为其在工业自动化领域赢得了良好的声誉。条码扫描器的成功推出,为公司带来了可观的收益,也为公司后续的技术研发和市场拓展提供了强有力的支持。

Hosiden Corporation公司的发展小趣事

在追求经济效益的同时,Hosiden也始终关注可持续发展和社会责任。公司致力于通过技术创新和绿色生产等方式,降低对环境的影响并促进资源的循环利用。此外,Hosiden还积极参与社会公益事业和慈善活动,为社会的发展和进步贡献了自己的力量。这些举措不仅提升了公司的社会形象和品牌价值,也为其在电子行业的长远发展奠定了坚实基础。

问答坊 | AI 解惑

碁于uclinux的网络部分启动分析

碁于uclinux的网络部分启动分析…

查看全部问答>

工业自动化仪表与控制系统未来发展的关注 指针式仪表控制系统

1、自动化仪表与企业的信息化   自动化仪表技术包括信息采集、处理和应用。“企业信息化”实际上是企业信息的集成和整合。为此,必须用自动化和系统的信息模型“简化”、“规则”和“抽象”信息,以便最有效地利用信息。这是自动化仪表领域的一 ...…

查看全部问答>

专为手机开发建立的交流群

QQ群:74481311 专门为从事手机软件开发的专业人员和业余爱好者建立的高级群,欢迎大家在线交流.…

查看全部问答>

关于cpu温度的读取,请高手指点

我想用WinIO.sys获取cpu的当前温度,为什么程序老是失败,temp_dwPortVal=0xffffffff 在头文件中导入: #include \"WinIO.h\" #pragma comment(lib,\"WinIo.lib\") 在实现中:         DWORD temp_dwPortVal=0;    ...…

查看全部问答>

s3c2440 camera 疑惑(基于7113的视频采集)

各位大侠,小弟现在正在搞2440 的视频开发,初次涉及,想用7113来做视频采集,烦请各位给提供个简单的思路,或者是大致的方向,不胜感激…

查看全部问答>

求一个AD口暴多的mcu,推荐一下

求一个AD口暴多的mcu,推荐一下…

查看全部问答>

关于8、16、32位单片机的区别

自学开始学习单片机,差不多学会了几种,包括8位的51系列和16位的msp430系列,以及32位的arm系列。 听一些人说一般要学会8位的51单片机后学习16位和32位才会比较容易,但是我实在对于他们的区别没有明显的感觉。特别是8位和16位单片机的区别,使用 ...…

查看全部问答>

verilog中多个模块的引用

verilog中多个模块的引用先在顶层模块中引用一个数码管动态显示的模块:led_disp        led(               .clk(clk),         ...…

查看全部问答>

PSMN1R8-40YLC N-channel 40 V 1.8 mΩ

这款芯片是sot669封装,但是我不清楚是几脚的,关于mb ,到底是画成第五个引脚还是,就只是四个引脚,四个引脚的话,那个Drain是第几引脚?为啥1,2,3引脚都是source引脚?此芯片是用的AltiumDesigner 画的封装,跪求指导。。。…

查看全部问答>