找回密码
 注册会员
更新自动建库工具PCB Footprint Expert 2024.04 Pro / Library Expert 破解版

ds18b20温控系统 有问题帮帮忙解决一下阿

[复制链接]
admin 发表于 2012-9-2 08:22:17 | 显示全部楼层 |阅读模式

本文包含原理图、PCB、源代码、封装库、中英文PDF等资源

您需要 登录 才可以下载或查看,没有账号?注册会员

×
lcd液晶屏不显示阿 请高手帮帮忙 解决一下。

#include <reg51.H> //器件配置文件
#include <intrins.h>
#include <absacc.h>

#define Busy 0x80 //常量定义
#define uchar unsigned char
#define uint unsigned int
#define DATAPORT P0 //定义P0口为LCD通讯端口
bit ON_OFF;
bit outflag;

sbit RS=P2^0; //引脚定义
sbit RW=P2^1; //引脚定义
sbit E=P2^2; //引脚定义
sbit OUT=P3^7; //控制继电器
sbit TSOR=P1^7; //温度测试端
sbit P1_4=P1^4; //时钟调整
sbit P1_5=P1^5; //时钟加
sbit P1_6=P1^6; //时钟减

uchar temp1,temp2;
uchar cnt;
uchar deda,sec; //时间变量
char min,hour;
char set,T;
uchar data buff[10];
uchar ReadStatusLCM(void); //读数据到MCU子函数声明
uchar code str0[]={"--- : : ---OF"}; //待显字符串
uchar code str1[]={"SET: C SA: . C"};

//====================函数声明=======================

void fun0(void);
void fun1(void);
void fun2(void);
void fun3(void);
void set_adj(void);
void inc_key(void);
void dec_key(void);
void key(void);
void gettempTS(void);
void initTS(void);
uchar readBTS(void);
void writeBTS(uchar byte);
void resetTS(void);
bit readTS(void);
void write1TS(void);
void write0TS(void);
void delay15us(void);
void delay60us(void);

//********延时K*1mS,12.000MHz*********

void delay(uint k)//函数名为delay的延时子函数。定义k为无符号整型变量
{ //delay函数开始
uint i,j; //定义i、j为无符号整型变量
for(i=0;i<k;i++)
{ //for循环语句开始
for(j=0;j<60;j++) // for循环语句开始
{;}
} //两个for循环体
} //delay函数结束

//***************************写指令到LCM子函数****************************
void WriteCommandLCM(uchar WCLCM, uchar BusyC) //函数名为WriteCommandLCM 的写指令到LCM子函数。定义WCLCM、BusyC 为无符号字符型变量*/
{ //WriteCommandLCM函数开始
if(BusyC)ReadStatusLCM(); //若BusyC为"1",则调用ReadStatusLCM子函数进行忙检测
DATAPORT=WCLCM; //将变量WCLCM中的指令传送至P0口
RS=0; //选中指令寄存器
RW=0; //写模式
E=0; //置LCM_EN端为低电平
E=0; //置LCM_EN端为低电平,延时一会儿
E=1; //置LCM_EN端为高电平,写入使能
E=1;
E=0;
E=0;
} // WriteCommandLCM函数结束
//*****************************写数据到LCM子函数******************************
void WriteDataLCM(uchar WDLCM) //函数名为WriteDataLCM 的写数据到LCM子函数。定义WDLCM 为无符号字符型变量
{ // WriteDataLCM函数开始
ReadStatusLCM(); //调用ReadStatusLCM子函数检测忙信号
DATAPORT=WDLCM; //将变量WDLCM中数据传送至P0口
RS=1; //选中数据寄存器
RW=0; //写模式
E=0; //置LCM_EN端为低电平
E=0; //置LCM_EN端为低电平,延时一会儿
E=1; //置LCM_EN端为高电平,写入使能
E=1;
E=0;
E=0;
} // WriteDataLCM函数结束

/*--------------------------------读状态到MCU子函数-----------------------------*/
uchar ReadStatusLCM(void) //函数名为ReadStatusLCM的读状态到MCU子函数
{ //ReadStatusLCM函数开始
DATAPORT=0xFF; //置P0口为全1
RS=0; //选中指令寄存器
RW=1; //读模式
E=0; //置LCM_EN端为低电平
E=0; //置LCM_EN端为低电平,延时一会儿
E=1; //置LCM_EN端为高电平,读使能
E=1;
E=0;
E=0;
while(P0&Busy); //检测忙信号。当P0口内容与Busy(80H)相与后不为零时,程序原地踏步
return(DATAPORT); //返回P0口的内容
} // ReadStatusLCM函数结束

/*--------------------------LCM初始化子函数----------------------------*/
void InitLcd() //函数名为InitLcd 的LCM初始化子函数
{ // InitLcd函数开始
WriteCommandLCM(0x38,1);//8位数据传送,2行显示,5*7字形,检测忙信号
WriteCommandLCM(0x08,1);//关闭显示,检测忙信号
WriteCommandLCM(0x01,1);//清屏,检测忙信号
WriteCommandLCM(0x06,1);//显示光标右移设置,检测忙信号
WriteCommandLCM(0x0c,1);//显示屏打开,光标不显示、不闪烁,检测忙信号
} // InitLcd函数结束
/*-------------------显示指定座标的一个字符子函数---------------------------*/
/*显示指定座标的一个字符(X=0~15,Y=0~1)子函数,函数名为DisplayOneChar,定义X、Y、DData为无符号字符型变量*/
void DisplayOneChar(uchar X,uchar Y,uchar DData)
{ // DisplayOneChar 函数开始
Y&=1; //Y的变化范围0~1
X&=15; // X的变化范围0~15
if(Y)X|=0x40; //若Y为1(显示第二行),地址码+0x40
X|=0x80; //指令码为地址码+0x80
WriteCommandLCM(X,0); //将指令X写入LCM,忽略忙信号检测
WriteDataLCM(DData); //再将数据Ddata写入LCM
} // DisplayOneChar 函数结束
/*--------------------显示指定座标的一串字符子函数----------------------*/
/*显示指定座标的一串字符(X=0~15,Y=0~1)子函数,函数名为DisplayListChar ,
定义X、Y为无符号字符型变量,DData 为指向code区的无符号字符型指针变量*/
void DisplayListChar(uchar X,uchar Y,uchar code *DData)
{ // DisplayListChar 函数开始
uchar ListLength=0; //定义ListLength 为无符号字符型变量,并赋初值为0
Y&=0x1; // Y的变化范围0~1
X&=0xF; // X的变化范围0~15
while(X<=15) //X<=15时进入while语句循环
{ //while语句开始
DisplayOneChar(X,Y,DData[ListLength]);//显示单个字符
ListLength++; //数组指针递增
X++; //X轴座标递增
} //while语句结束
} //DisplayListChar 函数结束
//=================================================
void init_timer0(void) //定时器T0初始化
{
TMOD=0x01;
TH0=-(50235/256);
TL0=-(50235%256);
TR0=1;
ET0=1;EA=1;
}
//==================================================
void time_zd0(void) interrupt 1 using 1 //定时器T0中断子函数
{
TH0=-(50235/256);
TL0=-(50235%256);
deda++;cnt++;
if(deda>=20){sec++;deda=0;}
if(sec>=60){min++;sec=0;}
if(min>=60){hour++;min=0;}
if(hour>=24){hour=0;}
if(cnt>=6)cnt=0;
key(); //扫描键盘
}

//==================================
void fun0(void) //液晶显示子函数0
{
WriteCommandLCM(0x0c,1);//显示屏打开,光标不显示、不闪烁,检测忙信号
DisplayListChar(0,0,str0);
DisplayListChar(0,1,str1);
//===============================
DisplayOneChar(3,0,hour/10+0x30);
DisplayOneChar(4,0,hour%10+0x30);
//=========================
DisplayOneChar(6,0,min/10+0x30);
DisplayOneChar(7,0,min%10+0x30);
//==============================
DisplayOneChar(9,0,sec/10+0x30);
DisplayOneChar(10,0,sec%10+0x30);
//=================================
DisplayOneChar(4,1,T/10+0x30);
DisplayOneChar(5,1,T%10+0x30);
//=================================
DisplayOneChar(11,1,temp1/10+0x30);
DisplayOneChar(12,1,temp1%10+0x30);
DisplayOneChar(14,1,temp2+0x30);
//================================
if(ON_OFF==0)
{
DisplayOneChar(14,0,0x4f);
DisplayOneChar(15,0,0x46);
}
else
{
DisplayOneChar(14,0,0x4f);
DisplayOneChar(15,0,0x4e);
if(outflag==1)DisplayOneChar(0,0,0x7c);
else DisplayOneChar(0,0,0xef);
}
//============================

}
/*******************************************/
void fun1(void) //液晶显示子函数1
{
WriteCommandLCM(0x0c,1);//显示屏打开,光标不显示、不闪烁,检测忙信号
DisplayListChar(0,0,str0);
DisplayListChar(0,1,str1);
//=========================
DisplayOneChar(6,0,min/10+0x30);
DisplayOneChar(7,0,min%10+0x30);
//==============================
DisplayOneChar(9,0,sec/10+0x30);
DisplayOneChar(10,0,sec%10+0x30);
//=================================
DisplayOneChar(4,1,T/10+0x30);
DisplayOneChar(5,1,T%10+0x30);
//=================================
DisplayOneChar(11,1,temp1/10+0x30);
DisplayOneChar(12,1,temp1%10+0x30);
DisplayOneChar(14,1,temp2+0x30);
//=================================
WriteCommandLCM(0x0f,1);//显示屏打开,光标显示、闪烁,检测忙信号
DisplayOneChar(3,0,hour/10+0x30);
DisplayOneChar(4,0,hour%10+0x30);
}
/********************************************/
void fun2(void) //液晶显示子函数2
{
WriteCommandLCM(0x0c,1);//显示屏打开,光标不显示、不闪烁,检测忙信号
DisplayListChar(0,0,str0);
DisplayListChar(0,1,str1);
//=========================
DisplayOneChar(3,0,hour/10+0x30);
DisplayOneChar(4,0,hour%10+0x30);
//=================================
DisplayOneChar(9,0,sec/10+0x30);
DisplayOneChar(10,0,sec%10+0x30);
//=================================
DisplayOneChar(4,1,T/10+0x30);
DisplayOneChar(5,1,T%10+0x30);
//=================================
DisplayOneChar(11,1,temp1/10+0x30);
DisplayOneChar(12,1,temp1%10+0x30);
DisplayOneChar(14,1,temp2+0x30);
//===================================
WriteCommandLCM(0x0f,1);//显示屏打开,光标显示、闪烁,检测忙信号
DisplayOneChar(6,0,min/10+0x30);
DisplayOneChar(7,0,min%10+0x30);
}
/***************************************/
void fun3(void) //液晶显示子函数3
{
WriteCommandLCM(0x0c,1);//显示屏打开,光标不显示、不闪烁,检测忙信号
DisplayListChar(0,0,str0);
DisplayListChar(0,1,str1);
//=========================
DisplayOneChar(3,0,hour/10+0x30);
DisplayOneChar(4,0,hour%10+0x30);
 楼主| admin 发表于 2012-9-2 08:22:21 | 显示全部楼层
//===============================
DisplayOneChar(6,0,min/10+0x30);
DisplayOneChar(7,0,min%10+0x30);
//=================================
DisplayOneChar(9,0,sec/10+0x30);
DisplayOneChar(10,0,sec%10+0x30);
//=================================
DisplayOneChar(11,1,temp1/10+0x30);
DisplayOneChar(12,1,temp1%10+0x30);
DisplayOneChar(14,1,temp2+0x30);
//=================================
WriteCommandLCM(0x0f,1);//显示屏打开,光标显示、闪烁,检测忙信号
DisplayOneChar(4,1,T/10+0x30);
DisplayOneChar(5,1,T%10+0x30);
}
/************************************/
void key(void) //扫描键盘
{uchar xx;
P1=0xff;
if(P1!=0xff)
{delay(10);
if(P1!=0xff)
{xx=P1;
switch(xx)
{
case 0xfe:set_adj();break;
case 0xfd:inc_key();break;
case 0xfb:dec_key();break;
case 0xf7:ON_OFF=!ON_OFF;break;
default:break;
}
}
}
}
/************************************/
void set_adj(void) //设定工作模式子函数
{
if(cnt==5)
{set++;
if(set>=4)set=0;
}
}
/***************************************/
void inc_key(void) //按键加法子函数
{
if(cnt==5)
{
switch(set)
{
case 0:if(P1==0xf7)ON_OFF=!ON_OFF;break;
case 1:hour++;if(hour>=23)hour=23;break;
case 2:min++;if(min>=59)min=59;break;
case 3:T++;if(T>=99)T=99; break;
default:break;
}
}
}
/***************************************/
void dec_key(void) //按键减法子函数
{
if(cnt==5)
{
switch(set)
{
case 0:if(P1==0xf7)ON_OFF=!ON_OFF;break;
case 1:hour--;if(hour<=0)hour=0;break;
case 2:min--;if(min<=0)min=0;break;
case 3:T--;if(T<=1)T=1;break;
default:break;
}
}
}
/*****************************************/
void delay15us(void) //延时15微秒子函数
{
uchar i;
for(i=0;i<4;i++);
}
//*************************************************
void delay60us(void) //延时60微秒子函数
{
uchar i;
for(i=0;i<15;i++);
}
//***************************************************
void write0TS(void) //write bit0
{
TSOR=1;
TSOR=0;
delay15us();delay15us();delay15us();delay15us();
TSOR=1;
_nop_();
_nop_();
}
//********************************************************
void write1TS(void) //write bit1
{
TSOR=1;
TSOR=0;
_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
TSOR=1;
_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
delay15us();delay15us();delay15us();
}
//******************************
bit readTS(void) //read databit
{
bit b;
TSOR=1;
TSOR=0;
_nop_();_nop_();_nop_();_nop_();
TSOR=1;
_nop_();_nop_();_nop_();_nop_();_nop_();
b=TSOR;
delay15us();delay15us();delay15us();
_nop_();_nop_();
return b;
}
//*************************************
void resetTS(void) //reset databit
{uchar i;
TSOR=1;
TSOR=0;
for(i=0;i<8;i++)delay60us();
TSOR=1;
while(TSOR);
for(i=0;i<8;i++)delay60us();
}
//***************************************
void writeBTS(uchar byte) //write one byte
{uchar i;
for(i=0;i<8;i++)
{
if(byte&0x01)
write1TS();
else
write0TS();
byte=byte>>1;
}
}
//****************************************
uchar readBTS(void) //read one byte
{uchar i,j;
bit b;
j=0;
for(i=0;i<8;i++)
{
b=readTS();
if(b)j+=1;
j=_cror_(j,1);
}
return j;
}
//************************************************
void initTS(void) //初始化DS18B20
{
resetTS();
writeBTS(0xcc);
writeBTS(0x4e);
writeBTS(0x64);
writeBTS(0x8a);
writeBTS(0x1f);
}
//******************************************************
void gettempTS(void) //读取测得的环境温度
{
resetTS();
writeBTS(0xcc);
writeBTS(0x44);
delay(200);
resetTS();
writeBTS(0xcc);
writeBTS(0xbe);
temp2=readBTS();
temp1=readBTS();
readBTS();readBTS();readBTS();readBTS();
readBTS();readBTS();readBTS();
temp1=temp1<<4;
temp1+=(temp2&0xf0)>>4;
temp2=(temp2&0x0f)?5:0;
}

//********主函数*********
void main(void)
{
delay(500); //延时500ms,等电源稳定
InitLcd(); //LCM初始化
init_timer0();
DisplayListChar(0,0,str0);
DisplayListChar(0,1,str1);
initTS();

for(;;)
{
//========================
switch(set) //LCD根据工作模式进行显示
{
case 0:fun0();break;
case 1:fun1();break;
case 2:fun2();break;
case 3:fun3();break;
default:break;
}
delay(300);
gettempTS(); //读取测得的环境温度
if(ON_OFF==1) //控制动作
{
if(temp1>=T+1){delay(1000);
if(temp1>=T+1){outflag=1;OUT=0;}
}
if(temp1<T){delay(1000);
if(temp1<T){outflag=0;OUT=1;}
}
}
else
{outflag=0;OUT=1;}
}
}
*滑块验证:
您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

QQ|手机版|MCU资讯论坛 ( 京ICP备18035221号-2 )|网站地图

GMT+8, 2024-11-24 09:26 , Processed in 0.055204 second(s), 10 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表