标题:
单片机仿真时候LM016L一直不显示数据只亮而已,试了几个例子也是这样,请问问题在哪
[打印本页]
作者:
萌新一个
时间:
2019-3-14 16:11
标题:
单片机仿真时候LM016L一直不显示数据只亮而已,试了几个例子也是这样,请问问题在哪
1.png
(53.97 KB, 下载次数: 46)
下载附件
2019-3-14 16:07 上传
作者:
wc86110
时间:
2019-3-14 21:33
空白芯片还能怎样
作者:
wulin
时间:
2019-3-15 16:35
在没有充分经验的情况下不要试图一下子把复杂的程序调通,你可以先把1602调通,再把按调通,然后调一路DS18b20,调通后再加到4路。要循序渐进。给你一个单路DS18b20测温LCD1602显示程序和仿真图参考。
无标题.jpg
(160.24 KB, 下载次数: 44)
下载附件
2019-3-15 16:33 上传
/*-----------------------------------------------
名称:DS18b20测温LED显示(-55~128度)
------------------------------------------------*/
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
#define DataPort P0 //定义数据端口
/************定义端口*************/
sbit LCD_RS=P3^5; //液晶屏RS口 写指令低,写数据高
sbit LCD_EN=P3^4; //液晶屏EN口 高脉冲使能写指令/数据,低跳变执行
sbit DQ=P2^2; //DS18B20 端口
/************定义全局变量*************/
uchar TempData[7]; //存储显示值的全局变量
bit ReadTempFlag; //读时间标志
/*------------------------------------------------
函数声明
------------------------------------------------*/
void WriteOneChar(uchar dat); //写入DS18B20一个字节
uchar ReadOneChar(void); //读取DS18B20一个字节
uint ReadTemperature(void); //读取DS18B20温度值
bit Init_DS18B20(void); //初始化DS18B20
void Init_Timer0(void); //定时器初始化
void DelayUs2x(uchar t); //uS延时函数
void DelayMs(uchar t); //mS延时函数
void LCDinit();
void write_com(uchar com);
void write_date(uchar date);
void delay(uint x);
/*------------------------------------------------
主函数
------------------------------------------------*/
void main()
{
uchar i;
uint temp;
long tempM;
bit negative;//负数标志
uchar TempH,TempL,TempK;
Init_Timer0();
LCDinit();
while(1) //主循环
{
if(ReadTempFlag==1)//定时标志
{
ReadTempFlag=0;
temp=ReadTemperature();//读取温度
if(temp&0x8000)
{
negative=1; //负号标志
temp=~temp; //取反加1
temp +=1;
}
else negative=0; //正数
tempM=temp*0.0625*100; //换算为10进制温度值再放大100倍
TempH=tempM/100; //分解出整数值
TempL=tempM%100; //分解出小数值
TempL=(TempL+TempK)/2+0.5;//小数取两次平均值加四舍五入
TempK=TempL;
/* TempH=temp>>4; //分解为整数
TempL=temp&0x0F; //分解为小数
TempL=TempL*6/10; //保留一位小数
*/
if(negative==1)
TempData[0]='-';//显示负号
else if(TempH/100==0)//小于100
TempData[0]=' '; //百位消隐
else
TempData[0]=TempH/100+'0'; //显示百位温度
if((TempH/100==0)&&((TempH%100)/10==0))
TempData[1]=' '; //十位消隐
else
TempData[1]=(TempH%100)/10+'0'; //显示十位温度
TempData[2]=(TempH%100)%10+'0'; //显示个位温度
TempData[3]='.'; //显示小数点
TempData[4]=TempL/10+'0'; //显示温度小数1位
TempData[5]=TempL%10+'0'; //显示温度小数2位
TempData[6]='C'; //显示C
write_com(0x80); //数据指针第一行起始0x80位置
for(i=0;i<7;i++) //每循环一次写一个字节数据
{
write_date(TempData[i]); //写一个字节数据
}
}
}
}
/*------------------------------------------------
定时器初始化子程序
------------------------------------------------*/
void Init_Timer0(void)
{
TMOD |= 0x01; //使用模式1,16位定时器,使用"|"符号可以在使用多个定时器时不受影响
TH0=(65536-5000)/256; //给定初值
TL0=(65536-5000)%256;
EA=1; //总中断打开
ET0=1; //定时器中断打开
TR0=1; //定时器开关打开
}
/*------------------------------------------------
定时器中断子程序
------------------------------------------------*/
void Timer0_isr(void) interrupt 1
{
static uint num;
TH0=(65536-5000)/256; //重新赋值 2ms
TL0=(65536-5000)%256;
num++;
if(num>=25) //500ms
{
num=0;
ReadTempFlag=1; //读标志位置1
}
}
/*------------------------------------------------
uS延时函数,含有输入参数 unsigned char t,无返回值
unsigned char 是定义无符号字符变量,其值的范围是
0~255 这里使用晶振12M,精确延时请使用汇编,大致延时
长度如下 T=tx2+5 uS
------------------------------------------------*/
void DelayUs2x(uchar t)
{
while(--t);
}
/*------------------------------------------------
mS延时函数,含有输入参数 unsigned char t,无返回值
unsigned char 是定义无符号字符变量,其值的范围是
0~255 这里使用晶振12M,精确延时请使用汇编
------------------------------------------------*/
void DelayMs(uchar t)
{
while(t--)
{
//大致延时1mS
DelayUs2x(245);
DelayUs2x(245);
}
}
/*------------------------------------------------
18b20初始化
------------------------------------------------*/
bit Init_DS18B20(void)
{
bit dat=0;
DQ = 1; //DQ复位
DelayUs2x(5); //稍做延时
DQ = 0; //单片机将DQ拉低
DelayUs2x(200); //精确延时 大于 480us 小于960us
DelayUs2x(200);
DQ = 1; //拉高总线
DelayUs2x(50); //15~60us 后 接收60-240us的存在脉冲
dat=DQ; //如果x=0则初始化成功, x=1则初始化失败
DelayUs2x(25); //稍作延时返回
return dat;
}
/*------------------------------------------------
读取一个字节
------------------------------------------------*/
uchar ReadOneChar(void)
{
uchar i=0;
uchar dat = 0;
for (i=8;i>0;i--)
{
DQ = 0; // 给脉冲信号
dat>>=1;
DQ = 1; // 给脉冲信号
if(DQ)
dat|=0x80;
DelayUs2x(25);
}
return(dat);
}
/*------------------------------------------------
写入一个字节
------------------------------------------------*/
void WriteOneChar(uchar dat)
{
uchar i=0;
for(i=8; i>0; i--)
{
DQ = 0;
DQ = dat&0x01;
DelayUs2x(25);
DQ = 1;
dat>>=1;
}
DelayUs2x(25);
}
/*------------------------------------------------
读取温度
------------------------------------------------*/
uint ReadTemperature(void)
{
uchar a=0;
uint b=0;
uint t=0;
Init_DS18B20();
WriteOneChar(0xCC); // 跳过读序号列号的操作
WriteOneChar(0x44); // 启动温度转换
DelayMs(10);
Init_DS18B20();
WriteOneChar(0xCC); //跳过读序号列号的操作
WriteOneChar(0xBE); //读取温度寄存器等(共可读9个寄存器) 前两个就是温度
a=ReadOneChar(); //低位
b=ReadOneChar(); //高位
b<<=8;
t=a+b;
return(t);
}
/*******100us延时程序********/
void delay(uint x)
{
uint a,b;
for(a=x;a>0;a--)
for(b=10;b>0;b--);
}
/*******液晶写指令程序********/
void write_com(uchar com)
{
LCD_EN=0; //初始设置LCD_EN低电平
LCD_RS=0; //允许写指令
P0=com; //传递指令
delay(10); //延时1ms
LCD_EN=1; //使能写入
delay(10); //延时1ms
LCD_EN=0; //低跳变执行
}
/*******液晶写数据程序********/
void write_date(uchar date)
{
// LCD_EN=0; //初始设置LCD_EN低电平
LCD_RS=1; //允许写数据
P0 =date; //传递数据
delay(10); //延时1ms
LCD_EN=1; //使能写入
delay(10); //延时1ms
LCD_EN=0; //低跳变执行
}
/*******液晶初始化程序********/
void LCDinit() //设置显示模式、
{
write_com(0x38);//设置16*2显示,5*7点阵,8位数据接口
write_com(0x01);//显示清零,数据指针清零
// write_com(0x0f);//设置开显示,显示光标,光标闪烁
// write_com(0x0e);//设置开显示,显示光标,光标不闪
write_com(0x0c);//设置开显示,不显光标
write_com(0x06);//设置写一个字符后地址指针加1
// write_com(0x07);//设置写一个字符后整屏左移
write_com(0x80);//数据指针初始化,设置显示初始位置
}
复制代码
作者:
春风十里吹
时间:
2019-3-16 07:31
晕,你这个网上都有一模一样的例子,不知道你为什么不先在网上找一找,看看别人的例子,再敲代码!
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1