你好 没见你的源程序 显示没变化 可能是你两个子程序中的一个或两个都有问题 再就是在主程序中没有进行循环检测及显示刷新。贴上我的程序 你自己看看吧。老是显示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()已完成一个“写命令”周期
}
总之,你这块液晶屏应该在市场上不常见。要用这个玩意,你必须有对应这块液晶屏的详细文档、数据手册,否则光这么一个程序很难把这个液晶屏玩转了。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)