我做好实物后可以正常运行,但是仿真的时候显示器不能显示温度,我把温度传感器接上后仿真就开始报错了,不接温度传感器就不报错了,但是温度显示不出来,还有按键部分按着也没有反应。大神指导一下,或者帮忙改一下,,谢谢了
下载:
1122.zip
(82.02 KB, 下载次数: 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;
- }
- }
复制代码
|