找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2891|回复: 7
打印 上一主题 下一主题
收起左侧

12864显示温度单片机仿真接上温度传感器就报错 但实物后可以正常运行

[复制链接]
回帖奖励 50 黑币 回复本帖可获得 5 黑币奖励! 每人限 1 次
跳转到指定楼层
楼主
我做好实物后可以正常运行,但是仿真的时候显示器不能显示温度,我把温度传感器接上后仿真就开始报错了,不接温度传感器就不报错了,但是温度显示不出来,还有按键部分按着也没有反应。大神指导一下,或者帮忙改一下,,谢谢了

下载:
1122.zip (82.02 KB, 下载次数: 23)


  1. #include<reg52.h>
  2. #include<intrins.h>
  3. #define uchar unsigned char
  4. #define uint unsigned int
  5. #define p0 P0
  6. sbit P10=P1^0;
  7. sbit P11=P1^1;
  8. sbit P12=P1^2;
  9. sbit P13=P1^3;
  10. sbit P15=P1^5;
  11. sbit P16=P1^6;
  12. uchar code table1[]={"当前温度"};
  13. uchar code table2[]={"钢板打印中......"};
  14. uchar code table3[]={"摄氏度"};
  15. uchar code table4[]={"偏高"};
  16. uchar code table5[]={"适宜"};
  17. uchar code table6[]={"偏低"};
  18. uchar code table7[]={"缺少钢板不能打印"};  
  19. uchar code table8[]={"钢板凹凸不能打印"};
  20. uchar code table9[]={"钢板太薄打印穿透"};

  21. sbit ds = P1^4;
  22. sbit rs=P2^0;
  23. sbit rw=P2^1;
  24. sbit en=P2^2;
  25. void delay(uint k)  //延时函数
  26. {
  27.         uint i,j;        
  28.         for(i=0;i<k;i++)
  29.         for(j=0;j<121;j++);
  30. }

  31. void wcode(uchar c)    //写命令
  32. {
  33.    
  34.         rs=0;
  35.         rw=0;
  36.         en=0;
  37.         P0=c;
  38.         delay(5);
  39.         en=1;
  40.         delay(5);
  41.         en=0;
  42.         delay(5);
  43. }
  44. void wdata(uchar date)  //写数据
  45. {

  46.         rs=1;
  47.         rw=0;
  48.         en=0;
  49.         P0=date;
  50.         delay(5);
  51.         en=1;
  52.         delay(5);
  53.         en=0;
  54.         delay(5);
  55. }
  56. void init()      //12864初始化      
  57. {
  58.         wcode(0x30);
  59.         delay(5);
  60.         wcode(0x0c);
  61.         delay(5);
  62.         wcode(0x01);
  63.         delay(5);
  64. }
  65. //=====`====================================1820===============
  66. void dsInit()
  67. {
  68.      //对于11.0592MHz时钟, unsigned int型的i, 作一个i++操作的时间大于为8us
  69.     unsigned int i;  
  70.     ds = 0;
  71.     i = 100;   //拉低约800us, 符合协议要求的480us以上
  72.     while(i>0) i--;
  73.     ds = 1;    //产生一个上升沿, 进入等待应答状态
  74.     i = 4;
  75.      while(i>0) i--;
  76. }


  77. void dsWait()
  78. {
  79.      unsigned int i;
  80.      while(ds);  
  81.       while(~ds);  //检测到应答脉冲
  82.      i = 4;
  83.      while(i > 0) i--;
  84. }

  85. bit readBit()
  86. {
  87.    unsigned int i;
  88.     bit b;
  89.     ds = 0;
  90.     i++;   //延时约8us, 符合协议要求至少保持1us
  91.     ds = 1;
  92.     i++; i++;  //延时约16us, 符合协议要求的至少延时15us以上
  93.     b = ds;
  94.     i = 8;
  95.     while(i>0) i--;  //延时约64us, 符合读时隙不低于60us要求
  96.     return b;
  97. }
  98. unsigned char readByte()
  99. {
  100.     unsigned int i;
  101.     unsigned char j, dat;
  102.     dat = 0;
  103.     for(i=0; i<8; i++)
  104.     {
  105.         j = readBit();
  106.         //最先读出的是最低位数据
  107.         dat = (j << 7) | (dat >> 1);
  108.    }
  109.     return dat;
  110. }

  111. void writeByte(unsigned char dat)
  112. {
  113.     unsigned int i;
  114.     unsigned char j;
  115.     bit b;
  116.     for(j = 0; j < 8; j++)
  117.     {
  118.         b = dat & 0x01;
  119.        dat >>= 1;
  120.         //写"1", 将DQ拉低15us后, 在15us~60us内将DQ拉高, 即完成写1
  121.         if(b)   
  122.         {
  123.             ds = 0;
  124.             i++; i++;  //拉低约16us, 符号要求15~60us内
  125.            ds = 1;   
  126.            i = 8; while(i>0) i--;  //延时约64us, 符合写时隙不低于60us要求
  127.         }
  128.         else  //写"0", 将DQ拉低60us~120us
  129.         {
  130.            ds=0;
  131.           i=8; while(i>0) i--;  //拉低约64us, 符号要求
  132.             ds=1;
  133.            i++;i++;  //整个写0时隙过程已经超过60us, 这里就不用像写1那样, 再延时64us了
  134.        }
  135.     }
  136. }

  137. //向DS18B20发送温度转换命令
  138. void sendChangeCmd()
  139. {
  140.     dsInit();   
  141.     dsWait();   
  142.     delay(1);   
  143.     writeByte(0xcc); //写入跳过序列号命令字 Skip Rom
  144.     writeByte(0x44); //写入温度转换命令字 Convert T
  145. }

  146. //向DS18B20发送读取数据命令
  147. void sendReadCmd()
  148. {
  149.     dsInit();
  150.     dsWait();
  151.     delay(1);
  152.     writeByte(0xcc); //写入跳过序列号命令字 Skip Rom
  153.     writeByte(0xbe); //写入读取数据令字 Read Scratchpad
  154. }
  155. //获取当前温度值
  156. int getTmpValue()
  157. {
  158.     unsigned int tmpvalue;
  159.     int value; //存放温度数值
  160.     float t;
  161.     unsigned char low, high;
  162.     sendReadCmd();
  163.     //连续读取两个字节数据
  164.     low=readByte();
  165.     high=readByte();
  166.     //将高低两个字节合成一个整形变量
  167.     //计算机中对于负数是利用补码来表示的
  168.     //若是负值, 读取出来的数值是用补码表示的, 可直接赋值给int型的value
  169.     tmpvalue=high;
  170.     tmpvalue<<=8;
  171.     tmpvalue|=low;
  172.     value=tmpvalue;  
  173.     t=value*0.0625;
  174.     value=t*100+(value>0?0.5:-0.5);
  175.     return value;
  176. }
  177. void display(int v)
  178. {
  179.     unsigned char count;
  180.     unsigned char datas[5];
  181.     datas[0]=v/10000;
  182.     datas[1]=v%10000/1000;
  183.     datas[2]=v%1000/100;
  184.     datas[3]=v%100/10;
  185.     datas[4]=v%10;
  186.   
  187.     wcode(0x88+5);
  188.     if(v<0)
  189.     {
  190.         wdata('-');
  191.     }
  192.     else
  193.     {
  194.         wdata(' ');
  195.     }
  196.     if(datas[0]!=0)
  197.     {
  198.      wdata('0'+datas[0]);
  199.     }
  200.     for(count=1; count<5;count++)
  201.     {
  202.         wdata('0'+datas[count]);
  203.         if(count==2)
  204.         {wdata('.');}                       
  205.     }     
  206.   }               

  207. void temperaturealarm(int b)
  208. {unsigned char i;

  209. if(b>2800){wcode(0x98+1);
  210.              for(i=0;i<4;i++)
  211.              {wdata(table4[i]);
  212.              }
  213.            }
  214. else if(2200<=b&b<2800){wcode(0x98+1);
  215.              for(i=0;i<4;i++)
  216. //         if(P37==0){wcode(0x98+1);
  217.              {wdata(table5[i]);
  218.               }
  219.              }

  220. else if(b<2200){wcode(0x98+1);
  221.                for(i=0;i<4;i++)
  222. //                                                 if(P37==0){wcode(0x98+1);
  223.                {wdata(table6[i]);}   
  224.             }
  225. }

  226. void main()
  227. {      
  228. unsigned char i=0;
  229. //        int a=0;
  230. init();
  231.         P10=1;
  232.         P11=1;
  233.         P12=1;
  234. //        P13=1;
  235.         P15=0;
  236. //        P16=1;
  237. delay(200);
  238. wcode(0x80+0x00);
  239. for(i=0;i<16;i++)
  240. {wdata(table2[i]);
  241. }
  242.   wcode(0x88);
  243. for(i=0;i<10;i++)
  244. {wdata(table1[i]);
  245. }
  246. wcode(0x98+0x05);
  247. for(i=0;i<6;i++)
  248. {wdata (table3[i]);}

  249. while(1)
  250. {
  251.                 if(P15==0)
  252.                 {
  253.   display(getTmpValue());
  254.   temperaturealarm(getTmpValue());
  255.   sendChangeCmd();
  256.                 }        
  257.             if(P10==0)
  258.                         {
  259.                                 delay(200);
  260.                                 wcode(0x80+0x00);
  261.                                 for(i=0;i<16;i++)
  262.                                 wdata (table7[i]);
  263.                         }
  264.                           if(P11==0)
  265.                         {
  266.                                 delay(200);
  267.                                 wcode(0x80+0x00);
  268.                                 for(i=0;i<16;i++)
  269.                                 wdata (table8[i]);
  270.                         }
  271.                         if(P12==0)
  272.                         {
  273.                                 delay(200);
  274.                                 wcode(0x80+0x00);
  275.                                 for(i=0;i<16;i++)
  276.                                 wdata (table9[i]);
  277.                         }
  278.                         if(P13==0)
  279.                         {
  280.                                 delay(200);
  281.                         init();        
  282.                                 P15=1;
  283.                         }
  284.                         if(getTmpValue()>2800)
  285.                                 P16=0;
  286.       if(getTmpValue()<2800)
  287.                                 P16=1;                                   
  288. }
  289. }
复制代码


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:82765 发表于 2017-5-20 06:41 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

板凳
ID:47933 发表于 2017-5-20 08:00 | 只看该作者
现在的仿真软件很多时候都扯淡,测试了很多电路都是如此。18b20测温电路最明显的是数据输出线接电阻就不能运行,甚至接一根虚线仿真都出错。数字电路还好点,模拟电路就更是一塌糊涂了,比如双向可控硅,控制极悬空都能导通,太扯淡了。
回复

使用道具 举报

地板
ID:202763 发表于 2017-5-20 09:15 | 只看该作者
坚持查一下温度传感器的连线有没有问题
回复

使用道具 举报

5#
ID:111634 发表于 2017-5-20 10:27 | 只看该作者
要学懂单片机及其控制程序,才能拼接应用。其实单片机应用就是把别人成功应用的部分拼接起来。
回复

使用道具 举报

6#
ID:61002 发表于 2017-5-20 10:47 | 只看该作者
液晶屏的指令不一样
回复

使用道具 举报

7#
ID:202816 发表于 2017-5-20 11:35 | 只看该作者
我正在做12864密码锁,现在过来看看资料
回复

使用道具 举报

8#
ID:194638 发表于 2017-5-21 17:10 | 只看该作者
g753388438 发表于 2017-5-20 10:47
液晶屏的指令不一样

什么意思,该怎么改
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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