用液晶12864和DS18B20传感器做的温度传感器为什么不会变化,老是显示85度?

用液晶12864和DS18B20传感器做的温度传感器为什么不会变化,老是显示85度?,第1张

你好 没见你的源程序 显示没变化 可能是你两个子程序中的一个或两个都有问题 再就是在主程序中没有进行循环检测及显示刷新。贴上我的程序 你自己看看吧。老是显示85是上电时18B20没有进入正常状态,读出的数据。把我主程序中对你没有用的删了 自己看着搞吧 硬件接口上须从新对应一历扰下。我的仿真库没有新型的18264 给你贴个老的仿真图

/***********ds18b20子程序*************************/

#include <REG52.H>

#include <intrins.h>

unsigned char week_value[2]

unsigned char TempBuffer[3],temp_value      //温度

sbit DQ = P1^0        //温度传送数据IO口

sbit start = P3^2 圆塌    //化成启动按键

sbit led = P3^0

unsigned char hc_start=0

/***********ds18b20延迟子函数(晶振12MHz )*******/

void delay_18B20(unsigned int i)

{

while(i--)

}

/**********ds18b20初始化函数**********************/

void Init_DS18B20(void)

{

 unsigned char x=0

 DQ = 1          //DQ复位

 delay_18B20(8)  //稍做延时

 DQ = 0          //单片机将DQ拉低

 delay_18B20(80) //精确延时 大于 480us

 DQ = 1          //拉高总线

 delay_18B20(14)

 x=DQ            //稍做延时后 如果x=0则初始化成功 x=1则初始化失败

 delay_18B20(20)

}

/***********ds18b20读一个字节**************/

unsigned char ReadOneChar(void)

{

uchar i=0

uchar dat = 0

for (i=8i>0i--)

 {

  DQ = 0 // 给脉冲信号

  dat>>=1

  DQ = 1 // 给脉冲信号

  if(DQ)

  dat|=0x80

  delay_18B20(4)

 }

return(dat)

}

/*************ds18b20写一个字节****************/

void WriteOneChar(uchar dat)

{

unsigned char i=0

for (i=8 i>0 i--)

{

DQ = 0

DQ = dat&0x01

delay_18B20(5)

DQ = 1

dat>>=1

}

}

/**************读取ds18b20当前温度************/

void ReadTemp(void)

{

unsigned char a=0

unsigned char b=0

unsigned char t=0

Init_DS18B20()

WriteOneChar(0xCC)     // 跳过读序号列号的 *** 作

WriteOneChar(0x44)  // 启动温度转换

delay_18B20(100)       // this message is wery important

Init_DS18B20()

WriteOneChar(0xCC)  //跳过读序号列号的 *** 作

WriteOneChar(0xBE)  //读取温度寄存器等(共可读9个寄存器) 前两个就是温度

delay_18B20(100)

a=ReadOneChar()     //读取温度值低位

b=ReadOneChar()    //读取温度值高位

temp_value=b<<4

temp_value+=(a&0xf0)>>4

}

void temp_to_str()   //温度数据转换成橘烂圆液晶字符显示

{

TempBuffer[0]=temp_value/10+'0'  //十位

TempBuffer[1]=temp_value%10+'0'  //个位

TempBuffer[2]='\0'

}

/**************************************

1ms延时子程序

**************************************/

void Delay1ms(unsigned int count)

{

unsigned int i,j

for(i=0i<counti++)

for(j=0j<120j++)

}

/*********延时子程序***********/

void mdelay(uint delay)

{ uint i

for(delay>0delay--)

{for(i=0i<62i++) //1ms延时.

{}

}

}

/*------------------------------------------------

按键扫描函数,返回扫描键值

------------------------------------------------*/

void key_scan(void)                               //键盘扫描函数

{

if(start == 0)                             //如果按键按下

{

mdelay(9)                            //延时一段时间,消除键抖

while(start == 0)

    hc_start=1

TR0=1

led=0

lcdreset()                    //初始化LCD屏

}

}

/***********18264子程序*************************/

#define uchar unsigned char

#define uint unsigned int

//#define TURE 1

//#define FALSE 0

#define Lcd_Bus P0         //MCU P2<------> LCM

#define FIRST_ADDR 0       //定义字符/汉字显示起始位置

uchar xdata sun

sbit RS = P2^0

sbit RW = P2^1

sbit E  = P2^2

sbit RST= P2^4

sbit PSB= P2^3

void chk_busy()

void delay(unsigned int t)

void write_com(unsigned char cmdcode)

void write_data(unsigned char Dispdata)

void lcdreset()

void hzkdis(unsigned char code *s)

void clrscreen()

void first()

/*******************检查忙位******************************************

函 数 名:chk_busy()

功    能:检查忙位程序

说    明:无

入口参数:无

返 回 值:无

设    计:           日    期:2008-03-19

修    改:                    日    期:

***********************************************************************/

void chk_busy()

{  RS=0

RW=1

E=1

Lcd_Bus=0xff

while((Lcd_Bus&0x80)==0x80)

E=0

}

/********************延时子程序*****************************************

函 数 名:delay()

功    能:延时子程序

说    明:无

入口参数:无

返 回 值:无

设    计:           日    期:2008-03-19

修    改:                    日    期:

***********************************************************************/

void delay(unsigned int t)

{  unsigned int i,j

for(i=0i<ti++)

for(j=0j<10j++)

}

/*******************写命令到LCD**************************************

函 数 名:write_com()

功    能:写命令到LCD程序

说    明:无

入口参数:无

返 回 值:无

设    计:           日    期:2008-03-19

修    改:                    日    期:

***********************************************************************/

void write_com(unsigned char cmdcode)

{

chk_busy()

RS=0

RW=0

E=1

Lcd_Bus=cmdcode

delay(5)////////////////////在数据写入的时候加入适当的延时

E=0

delay(5)

}

/*********************写数据到LCD************************************

函 数 名:write_data()

功    能:写数据到LCD程序

说    明:无

入口参数:无

返 回 值:无

设    计:           日    期:2008-03-19

修    改:                    日    期:

***********************************************************************/

void write_data(unsigned char Dispdata)

{

chk_busy()

RS=1

RW=0

E=1

Lcd_Bus=Dispdata

delay(5)///////////////////在数据写入的时候加入适当的延时

E=0

delay(5)

}

/********************************************************************

函 数 名:lcdreset()

功    能:初始化LCD屏程序

说    明:无

入口参数:无

返 回 值:无

设    计:           日    期:2008-03-19

修    改:                    日    期:

***********************************************************************/

void lcdreset()

{  PSB=1

RST=0

delay(0)

RST=1

delay(2000)

write_com(0x30)

delay(10)             //选择基本指令集

write_com(0x30)       //选择8bit数据流

delay(5)

write_com(0x0c)       //开显示(无游标、不反白)

delay(10)

write_com(0x01)       //清除显示,并且设定地址指针为00H

delay(500)

write_com(0x06)       //指定在资料的读取及写入时,设定游标的移动方向及指定显示的移位

delay(0)

}

/***********************显示字符串*******************************

函 数 名:hzkdis()

功    能:显示字符串程序

说    明:无

入口参数:无

返 回 值:无

设    计:           日    期:2008-03-19

修    改:                    日    期:

***********************************************************************/

/*void hzkdis(unsigned char code *s)

{  while(*s>0)

{  write_data(*s)

s++

delay(50)

}

}  */

/***********************显示函数*******************************

函 数 名:void display(uint a,unsigned char b,unsigned char *str)

功    能:显示字符(串)程序

说    明:无

入口参数:无

返 回 值:无

设    计:           日    期:2008-03-19

修    改:                    日    期:

***********************************************************************/

void display(uint a,unsigned char b,unsigned char *str)        

{    //显示函数  显示位置为第a行第b位 显示c所代表的数

uint disaddr=0x80 

if(a==2) disaddr=0x90+b

else if(a==3) disaddr=0x88+b 

else if(a==4) disaddr=0x98+b 

else disaddr=0x80+b

write_com(disaddr)

while(*str!='\0')

{

write_data(*str)

str++

}

}

/***********************************************

名称:主程序

论坛:www.

编写:Liang yun feng

日期:

修改:无

内容:

************************************************/

#include <REG52.H>

#include <intrins.h>

#include <12846.c>

#include <18b20.c>

#define uint unsigned int

#define uchar unsigned char

/*****************************************

函 数 名:未化成时屏幕显示及时间调整

功    能:

说    明:

调    用:

入口参数:

返 回 值:无

******************************************/

void show_time()   //液晶显示程序

{

display(1,2,"欢迎使用")

display(2,1,"蓄电池化成仪")

display(4,0,"按[Star]启动化成")

Delay1ms(100)                 //扫描延时

}

/*****************************************

函 数 名:化成时屏幕显示

功    能:

说    明:

调    用:

入口参数:

返 回 值:无

******************************************/

void show_time_run()   //液晶显示程序

{

time_count()  //获取时钟芯片的时间数据

ReadTemp()                    //开启温度采集程序

temp_to_str()                 //温度数据转换成液晶字符

if(hour==22)

{TR0=0,mcout_z=mcout_f=1

 display(1,0,"本次化成已完成")

display(2,0,"电池温度")

display(2,5,TempBuffer)       //显示温度液晶字符显示位置

display(2,6,"℃")

display(3,0,"请进行后续 *** 作")

display(4,2,TimeString) //显示时间

 goto output

}

if(temp_value>45)

{if(TR0==1)

   {TR0=0

    mcout_f=mcout_z=1

   }

 display(1,0,"!!电池超温!!")

display(2,0,"电池温度")

display(2,5,TempBuffer)       //显示温度液晶字符显示位置

display(2,6,"℃")

display(3,1,"化成暂停!!!!")

display(4,2,TimeString) //显示时间

}

if(temp_value<45)

{if(TR0==0)

   {TR0=1}

 display(1,0,"化成中请等侯..")

display(2,0,"电池温度")

display(2,5,TempBuffer)       //显示温度液晶字符显示位置

display(2,6,"℃")

display(3,1,"已用化成时间")

display(4,2,TimeString) //显示时间

}

output:  Delay1ms(100)                 //扫描延时

}

/*****************************************

函 数 名:主程序main()

功    能:

说    明:

调    用:

入口参数:

返 回 值:无

******************************************/

main()

{

lcdreset()          //初始化LCD屏

Init_DS18B20( )     //DS18B20初始化

write_com(0x01)     //清除显示,并且设定地址指针为00H

delay(5)

while(1)

{

if(hc_start==0)

{show_time()     //液晶显示数据

key_scan()  //化成启动

   }

 if(hc_start==1)

   {

    show_time_run()  //液晶显示数据

}

}

}

光看代码你是不能了解它的使用历程的,最码答如好看看使用手册,下面的代码是用迟启1602液举启晶

#include<reg52.h>

#define uchar unsigned char

#define uint unsigned int

uchar code table[]="I LIKE MCU!"

uchar code table1[]="www.TXMCU.COM"

sbit lcden=P3^4

sbit lcdrs=P3^5

sbit dula=P2^6

sbit wela=P2^7

uchar num

void delay(uint z)

{

uint x,y

for(x=zx>0x--)

for(y=110y>0y--)

}

void write_com(uchar com)

{

lcdrs=0

P0=com

delay(5)

lcden=1

delay(5)

lcden=0

}

void write_data(uchar date)

{

lcdrs=1

P0=date

delay(5)

lcden=1

delay(5)

lcden=0

}

void init()

{

dula=0

wela=0

lcden=0

write_com(0x38)

write_com(0x0e)

write_com(0x06)

write_com(0x01)

write_com(0x80+0x10)

}

void main()

{

init()

for(num=0num<11num++)

{

write_data(table[num])

delay(20)

}

// write_com(1)

write_com(0x80+0x53)

for(num=0num<13num++)

{

write_data(table1[num])

delay(20)

}

for(num=0num<16num++)

{

write_com(0x18)

delay(20)

}

while(1)

}

你这个液晶屏不是一般开发板能带有的。大致读了迅孙一下:

#include <avr/io.h>#include "board.h" #include "manage.h"//调用头文件 #include "scan.h" #include "timer.h" #include "lcd.h"

void sys_init(void)

void bus_reset(void)

int main(void) //主程序

{ uint8_t i = 0//这里定义了一个计数器,用于指示灯闪烁计时用

sys_init()//系统初始化,具体程序在下面

int_init()//又初始化了一个什么东西,先不管

// timer0_init()//没有用到time0

timer1_init()//time1初始化,但是就现有程序而言还无法知道计时周期

// timer2_init()

// adc_init()

wdt_disable()//先禁用看门狗

wdt_enable(WDTO_250MS)//设置看门狗250ms为一周期

wdt_reset()//复位看门狗

sei()//禁用中断

// 初始化LCD

lcd_init()//调用液晶屏初始化程序

while(1) //主程序循环

{ manage()//应该是处理液晶显示内容用的子程序

if (i &0x10)

LED_ON()//0x10个周期后LED闪烁

else

LED_OFF()

i++

delay_ms(10)

wdt_reset()//复位看门狗

}

}

// 系统初始化

void sys_init(void) //系统初始化子程序的详细内容(看来只定义了IO口还真不知道这个系统内单片机的定时器如何初始化的)

{

PORTA = 0xf2 //定义IO口

DDRA = 0x0a// PA7~PA4 键盘输入,PA3: LCD_A0复用电池测量时,输出1

// PA2: 输入,测电池电压, PA1:LCD_CS, PA0:输入,测总线电压?

PORTB = 0xff

DDRB = 0x00// PB输出,LCD_DB,PB0~PB4 KEY SCAN

PORTC = 0x80

DDRC = 0xc0// PC输出,PC7:LCD_RST,PC6:LCD_LED+,

PORTD = 0x03

DDRD = 0xf3// PD7:PWM,PD6:ZL,PD5:ZH,PD4:LED

// PD3返回,PD2开关, PD1:LCD_RD, PD0:LCD_WR

}

void lcd_init(void) //LCD的初始化

{

uint8_t i

LCD_RST_L()//应该是复位LCD

delay_ms(2)//延时毁塌

LCD_RST_H()//复位完毕,该复位引脚拉高

for (i=0i<8i++) //复位8次看门狗?

{

delay_ms(20)

wdt_reset()

}

write_cmd(0xe2)//system reset 24 //写一个复位命令?

delay_ms(10)

write_cmd(0xeb)//set bias RATIO=1/12 27 =E8 FOR LOW POWER //设置液晶屏偏压

write_cmd(0x81)//set refence voltage pm 11 DOUBLE command ?//设置参考电压

write_cmd(0x83)//set RGB ? D1 21 //设置RGB方式?

write_cmd(0x2f)//set color mode,65K 22 D4 FOR 256 COLOR 3r-3g-2b//设置彩色显示深度

write_cmd(0x2b)//set line rate,35.8kps 15 A3?//设置啥?不是很明白

write_cmd(0x24)//set n-line ? 5,Temp.Compensation 00//设置某种补偿?

write_cmd(0xa2)// 15 set line rate 29.6k

write_cmd(0xd0)//set partial display? 21 D0 BGR//设置一个副屏幕?或许这个彩屏还附带一个小屏幕?

write_cmd(0xd6)//set cen? 22 d6 64k color 5-6-5//不明白

write_cmd(0xc0)//亩余链 19 LC[2:0]

write_cmd(0xaf)//set display on 18, DC[4:2]=111//仍然不明白

delay_ms(10)

wdt_reset()//重启看门狗

}

void write_cmd(uint8_t cmd)//“写命令”子程序

{

LCD_A0_L()//应该是拉低“命令\数据”引脚的电平

LCD_CS_L()//片选引脚

PORTB = cmd//PORTB的8个引脚作为并行口向液晶屏输出数据

DDRB = 0xff//PORTB的方向定义为输出

LCD_WR_L()//写LCD引脚电平拉低,看来这程序可能是为了防止被中断或者别的情况打乱,特地发送了两遍

LCD_WR_L()

LCD_WR_H()

LCD_CS_H()

DDRB = 0//改PORTB为高阻态

//个人觉得后面应该还需要两个语句:LCD_CS_H()和LCD_A0_H()已完成一个“写命令”周期

}

总之,你这块液晶屏应该在市场上不常见。要用这个玩意,你必须有对应这块液晶屏的详细文档、数据手册,否则光这么一个程序很难把这个液晶屏玩转了。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12394122.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-25
下一篇 2023-05-25

发表评论

登录后才能评论

评论列表(0条)

保存