标题:
12864显示温度单片机仿真接上温度传感器就报错 但实物后可以正常运行
[打印本页]
作者:
黄瓜芝麻酱紫
时间:
2017-5-20 01:29
标题:
12864显示温度单片机仿真接上温度传感器就报错 但实物后可以正常运行
我做好实物后可以正常运行,但是仿真的时候显示器不能显示温度,我把温度传感器接上后仿真就开始报错了,不接温度传感器就不报错了,但是温度显示不出来,还有按键部分按着也没有反应。大神指导一下,或者帮忙改一下,,谢谢了
112211.jpg
(143.08 KB, 下载次数: 73)
下载附件
2017-5-20 01:26 上传
下载:
1122.zip
(82.02 KB, 下载次数: 23)
2017-5-20 01:23 上传
点击文件名下载附件
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define p0 P0
sbit P10=P1^0;
sbit P11=P1^1;
sbit P12=P1^2;
sbit P13=P1^3;
sbit P15=P1^5;
sbit P16=P1^6;
uchar code table1[]={"当前温度"};
uchar code table2[]={"钢板打印中......"};
uchar code table3[]={"摄氏度"};
uchar code table4[]={"偏高"};
uchar code table5[]={"适宜"};
uchar code table6[]={"偏低"};
uchar code table7[]={"缺少钢板不能打印"};
uchar code table8[]={"钢板凹凸不能打印"};
uchar code table9[]={"钢板太薄打印穿透"};
sbit ds = P1^4;
sbit rs=P2^0;
sbit rw=P2^1;
sbit en=P2^2;
void delay(uint k) //延时函数
{
uint i,j;
for(i=0;i<k;i++)
for(j=0;j<121;j++);
}
void wcode(uchar c) //写命令
{
rs=0;
rw=0;
en=0;
P0=c;
delay(5);
en=1;
delay(5);
en=0;
delay(5);
}
void wdata(uchar date) //写数据
{
rs=1;
rw=0;
en=0;
P0=date;
delay(5);
en=1;
delay(5);
en=0;
delay(5);
}
void init() //12864初始化
{
wcode(0x30);
delay(5);
wcode(0x0c);
delay(5);
wcode(0x01);
delay(5);
}
//=====`====================================1820===============
void dsInit()
{
//对于11.0592MHz时钟, unsigned int型的i, 作一个i++操作的时间大于为8us
unsigned int i;
ds = 0;
i = 100; //拉低约800us, 符合协议要求的480us以上
while(i>0) i--;
ds = 1; //产生一个上升沿, 进入等待应答状态
i = 4;
while(i>0) i--;
}
void dsWait()
{
unsigned int i;
while(ds);
while(~ds); //检测到应答脉冲
i = 4;
while(i > 0) i--;
}
bit readBit()
{
unsigned int i;
bit b;
ds = 0;
i++; //延时约8us, 符合协议要求至少保持1us
ds = 1;
i++; i++; //延时约16us, 符合协议要求的至少延时15us以上
b = ds;
i = 8;
while(i>0) i--; //延时约64us, 符合读时隙不低于60us要求
return b;
}
unsigned char readByte()
{
unsigned int i;
unsigned char j, dat;
dat = 0;
for(i=0; i<8; i++)
{
j = readBit();
//最先读出的是最低位数据
dat = (j << 7) | (dat >> 1);
}
return dat;
}
void writeByte(unsigned char dat)
{
unsigned int i;
unsigned char j;
bit b;
for(j = 0; j < 8; j++)
{
b = dat & 0x01;
dat >>= 1;
//写"1", 将DQ拉低15us后, 在15us~60us内将DQ拉高, 即完成写1
if(b)
{
ds = 0;
i++; i++; //拉低约16us, 符号要求15~60us内
ds = 1;
i = 8; while(i>0) i--; //延时约64us, 符合写时隙不低于60us要求
}
else //写"0", 将DQ拉低60us~120us
{
ds=0;
i=8; while(i>0) i--; //拉低约64us, 符号要求
ds=1;
i++;i++; //整个写0时隙过程已经超过60us, 这里就不用像写1那样, 再延时64us了
}
}
}
//向DS18B20发送温度转换命令
void sendChangeCmd()
{
dsInit();
dsWait();
delay(1);
writeByte(0xcc); //写入跳过序列号命令字 Skip Rom
writeByte(0x44); //写入温度转换命令字 Convert T
}
//向DS18B20发送读取数据命令
void sendReadCmd()
{
dsInit();
dsWait();
delay(1);
writeByte(0xcc); //写入跳过序列号命令字 Skip Rom
writeByte(0xbe); //写入读取数据令字 Read Scratchpad
}
//获取当前温度值
int getTmpValue()
{
unsigned int tmpvalue;
int value; //存放温度数值
float t;
unsigned char low, high;
sendReadCmd();
//连续读取两个字节数据
low=readByte();
high=readByte();
//将高低两个字节合成一个整形变量
//计算机中对于负数是利用补码来表示的
//若是负值, 读取出来的数值是用补码表示的, 可直接赋值给int型的value
tmpvalue=high;
tmpvalue<<=8;
tmpvalue|=low;
value=tmpvalue;
t=value*0.0625;
value=t*100+(value>0?0.5:-0.5);
return value;
}
void display(int v)
{
unsigned char count;
unsigned char datas[5];
datas[0]=v/10000;
datas[1]=v%10000/1000;
datas[2]=v%1000/100;
datas[3]=v%100/10;
datas[4]=v%10;
wcode(0x88+5);
if(v<0)
{
wdata('-');
}
else
{
wdata(' ');
}
if(datas[0]!=0)
{
wdata('0'+datas[0]);
}
for(count=1; count<5;count++)
{
wdata('0'+datas[count]);
if(count==2)
{wdata('.');}
}
}
void temperaturealarm(int b)
{unsigned char i;
if(b>2800){wcode(0x98+1);
for(i=0;i<4;i++)
{wdata(table4[i]);
}
}
else if(2200<=b&b<2800){wcode(0x98+1);
for(i=0;i<4;i++)
// if(P37==0){wcode(0x98+1);
{wdata(table5[i]);
}
}
else if(b<2200){wcode(0x98+1);
for(i=0;i<4;i++)
// if(P37==0){wcode(0x98+1);
{wdata(table6[i]);}
}
}
void main()
{
unsigned char i=0;
// int a=0;
init();
P10=1;
P11=1;
P12=1;
// P13=1;
P15=0;
// P16=1;
delay(200);
wcode(0x80+0x00);
for(i=0;i<16;i++)
{wdata(table2[i]);
}
wcode(0x88);
for(i=0;i<10;i++)
{wdata(table1[i]);
}
wcode(0x98+0x05);
for(i=0;i<6;i++)
{wdata (table3[i]);}
while(1)
{
if(P15==0)
{
display(getTmpValue());
temperaturealarm(getTmpValue());
sendChangeCmd();
}
if(P10==0)
{
delay(200);
wcode(0x80+0x00);
for(i=0;i<16;i++)
wdata (table7[i]);
}
if(P11==0)
{
delay(200);
wcode(0x80+0x00);
for(i=0;i<16;i++)
wdata (table8[i]);
}
if(P12==0)
{
delay(200);
wcode(0x80+0x00);
for(i=0;i<16;i++)
wdata (table9[i]);
}
if(P13==0)
{
delay(200);
init();
P15=1;
}
if(getTmpValue()>2800)
P16=0;
if(getTmpValue()<2800)
P16=1;
}
}
复制代码
作者:
cjjcjj1
时间:
2017-5-20 06:41
提示:
作者被禁止或删除 内容自动屏蔽
作者:
lyf898
时间:
2017-5-20 08:00
现在的仿真软件很多时候都扯淡,测试了很多电路都是如此。18b20测温电路最明显的是数据输出线接电阻就不能运行,甚至接一根虚线仿真都出错。数字电路还好点,模拟电路就更是一塌糊涂了,比如双向可控硅,控制极悬空都能导通,太扯淡了。
作者:
HUZAO
时间:
2017-5-20 09:15
坚持查一下温度传感器的连线有没有问题
作者:
zl2168
时间:
2017-5-20 10:27
要学懂单片机及其控制程序,才能拼接应用。其实单片机应用就是把别人成功应用的部分拼接起来。
作者:
g753388438
时间:
2017-5-20 10:47
液晶屏的指令不一样
作者:
走三关
时间:
2017-5-20 11:35
我正在做12864密码锁,现在过来看看资料
作者:
黄瓜芝麻酱紫
时间:
2017-5-21 17:10
g753388438 发表于 2017-5-20 10:47
液晶屏的指令不一样
什么意思,该怎么改
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1