久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2425|回復: 2
收起左側

請問一下protues模擬ds18b20顯示總是是15.93是什么原因呢

[復制鏈接]
ID:958419 發表于 2021-10-1 19:11 | 顯示全部樓層 |閱讀模式
1.png #include"reg52.h"
  1. #include"myled.h"
  2. #include"ds18b20.h"
  3. #include"delay.h"
  4. #include"lcd1602.h"
  5. #include"stdio.h"
  6. //#include "temp.h"

  7. void Timer0_Init(void);
  8. unsigned char menuflag,ds18b20_timer;
  9. unsigned char timer_us;
  10. unsigned int timer_ms;
  11. unsigned int timer_xs;

  12. void main()
  13. {
  14.         unsigned int ack;
  15.         int ds18b20_temp;//用來接收數據
  16.         int inttemp,dectemp;//保存分離溫度inttemp整數部分和dectemp小數部分
  17.         unsigned char str[12];//用來保存數據轉換成的字符串ascll碼
  18.         unsigned char len;
  19.         
  20.         Timer0_Init();
  21.         lcd1602_init();
  22.         delay1ms(10);
  23.         EA = 1;
  24.         while (1)
  25.         {
  26.           if(menuflag)
  27.                 {
  28. //                        inttemp = 6;
  29. //                        ack = ds18b20_giveOrder(inttemp);
  30. //                        lcd1602set_position(0,1);
  31. //                        lcd1602_write_dat(ack + '0');
  32.                         ack = ds18b20_giveOrder(0);
  33.                         
  34.                         if(ack)
  35.                         {
  36.                                 inttemp = ack>>4;//保留整數部分,即去高4位
  37.                                 dectemp = ack&0x0f;//取小數部分,就是低4位
  38.                                 len = lcd1602_integertostr(inttemp,str);//len就是inttemp的長度,這個函數就是計算長度的
  39.                                 str[len++] = '.';
  40.                                 dectemp = (dectemp*100)/16;   //*0.0625
  41.                                 str[len++] = dectemp/10+'0';  //
  42.                                 str[len++] = dectemp%10+'0';  //
  43.                                 str[len] = '\0';              //結束符
  44.                                 while(len < 6)
  45.                                 {
  46.                                         str[len++] = ' ';//空格填滿
  47.                                 }
  48.                                 lcd1602_shwo_str(0,0,str);
  49.                         }
  50. //                                   led_display(timer_ms);
  51.                 }
  52.         }
  53.         
  54. }

  55. void Timer0_Init(void)                //10微秒@12.000MHz
  56. {
  57. //                AUXR |= 0x80;                //定時器時鐘1T模式
  58.         TMOD &= 0xF0;                //設置定時器模式
  59.         TMOD |= 0x01;                //設置定時器模式
  60.         TL0 = 0x88;                //設置定時初始值
  61.         TH0 = 0xFF;                //設置定時初始值
  62.         TF0 = 0;                //清除TF0標志
  63.   ET0 = 1;
  64.         TR0 = 1;                //定時器0開始計時
  65. }

  66. void timer0_isr() interrupt 1
  67. {
  68.         TR0 = 0;

  69.         ds18b20_timer = 1;

  70.                
  71.         if(ds18b20_timer == 1)
  72.         {
  73.                 timer_us++;
  74.                 if(timer_us >= 10)
  75.                 {        
  76.                          timer_us = 0;                                
  77.                          timer_ms++;
  78.                         if(timer_ms >= 500)
  79.                         {
  80.                                 timer_ms = 0;
  81.                                 menuflag = ~menuflag;
  82.                                 timer_xs++;        
  83.                                 if(timer_xs >= 1000)
  84.                                 {
  85.                                        
  86.                                 }
  87.                         }
  88.                 }
  89.         }
  90.         TL0 = 0x88;                //設置定時初始值
  91.         TH0 = 0xFF;                //設置定時初始值
  92.         TR0 = 1;
  93. }

  94. #include"ds18b20.h"
  95. #include"intrins.h"

  96. void delay_us(uchar us)//約2us延時函數
  97. {
  98.         while(--us);
  99. }


  100. /*******************************************************************************
  101. * 函 數 名         : Ds18b20ReadByte
  102. * 函數功能                   : 讀取一個字節
  103. * 輸    入         : 無
  104. * 輸    出         : 無
  105. *******************************************************************************/
  106. unsigned char ds18b20_readbyte()
  107. {
  108.         uchar i,dat;
  109.         for(i=0;i<8;i++)
  110.         {
  111.                 ds18b20=0;
  112.                 dat>>=1;
  113.                 ds18b20=1;
  114.                 if(ds18b20)
  115.                         dat|=0x80;
  116.                 delay_us(25);
  117.         }
  118.         return (dat);        
  119. }
  120. /*******************************************************************************
  121. * 函 數 名         : ds18b20_wretebyte
  122. * 函數功能                   : 向18B20寫入一個字節
  123. * 輸    入         : 無
  124. * 輸    出         : 無
  125. *******************************************************************************/
  126. void ds18b20_writebyte(unsigned char dat)
  127. {
  128.         uchar i;
  129.         for(i=0;i<8;i++)
  130.         {
  131.                 ds18b20=0;
  132.                 ds18b20=dat&0x01;
  133.                 delay_us(25);//延時
  134.                 ds18b20=1;//釋放總線準備下一次數據的寫入
  135.                 dat>>=1;
  136.         }
  137. }

  138. bit ds18b20_init()
  139. {
  140.         bit i;        
  141.         ds18b20=1;
  142.         delay_us(5);
  143.         ds18b20=0;
  144.         delay_us(200);//拉低總線499.45us,總線上的溫度傳感器將會被全部復位
  145.         delay_us(200);
  146.         ds18b20=1;//釋放總線
  147.         delay_us(50);//延時37.95us,等待溫度傳感器發回存在信號        
  148.         i=ds18b20;
  149.         delay_us(25);//延時141.95us,讀取溫度傳感器存在的時間
  150.         return (i);
  151. }
  152. unsigned int ds18b20_giveOrder(u16 dat)//下達指令
  153.         {
  154.                 unsigned int mynum;
  155.                 unsigned char msb,lsb;
  156.                                       //初始化ds18b20
  157.                 if(dat==0)
  158.                 {
  159.                                 ds18b20_init();
  160.                                 ds18b20_writebyte(0xcc);         //跳過ROM操作命令
  161.                                 ds18b20_writebyte(0x44);         //發送溫度轉換                                                               
  162.                                 delay1ms(5);
  163.                                 ds18b20_init();
  164.                                 ds18b20_writebyte(0xcc);         //跳過ROM操作命令
  165.                                 ds18b20_writebyte(0xbe);         //發送讀取溫度命令        
  166.                                 lsb = ds18b20_readbyte();
  167.                                 msb = ds18b20_readbyte();
  168.                                 msb<<=8;
  169.                                 mynum = ((int)msb<<8)+lsb;                        
  170.                 }
  171.                 return mynum;
  172.         }
  173. #ifndef _DS18B20_H_
  174. #define _DS18B20_H_

  175. #include"reg52.h"
  176. #include"delay.h"

  177. #ifndef uchar
  178. #define uchar unsigned char
  179. #endif

  180. #ifndef u16
  181. #define u16 unsigned char
  182. #endif

  183. sbit ds18b20 = P3^7;

  184. unsigned int ds18b20_giveOrder(u16 dat1);//下達指令

  185. #endif


  186. #ifndef _LCD1602_H_
  187. #define _LCD1602_H_

  188. #include"reg52.h"
  189. #include"delay.h"

  190. #define lcd1602_dat P0
  191. //#define LCD1602_4PINS

  192. sbit lcd1602_rs = P2^0;
  193. sbit lcd1602_rw = P2^1;
  194. sbit lcd1602_en = P2^2;

  195. void lcd1602_readbf();
  196. void lcd1602_init();
  197. void lcd1602_write_cmd(unsigned char cmd);
  198. void lcd1602_write_dat(unsigned char dat);
  199. void lcd1602_shwo_str(unsigned char x,unsigned char y,unsigned char *str);
  200. unsigned char lcd1602_integertostr(long dat,unsigned char *str);
  201. void lcd1602set_position(unsigned char x,unsigned char y);


  202. #endif


  203. #include"lcd1602.h"

  204. #ifndef         LCD1602_4PINS         //當沒有定義這個LCD1602_4PINS時
  205. void lcd1602_readbf()//讀lcd忙函數
  206. {
  207.         unsigned char state;
  208.         unsigned char i;
  209.          lcd1602_dat= 0xff;//IO 口置1 做輸入
  210.          lcd1602_dat |= 0xf0;//接四路高四位 口置1 做輸入
  211.          lcd1602_rs = 0;
  212.          lcd1602_rw = 1;
  213.          do
  214.          {
  215.                  lcd1602_en = 1;
  216.                  state = lcd1602_dat;//一個脈沖只接四位 第一次為高四位
  217.                  lcd1602_en = 0;
  218.                  i++;                //lcd1602_dat就是p0總io口
  219.                  if(i>50)
  220.                          break;
  221.          }
  222.          while(state & 0x80);
  223.                
  224. }
  225. #else
  226. void lcd1602_readbf()//讀lcd忙函數
  227. {
  228.         unsigned char state;
  229.         unsigned char i;
  230. //         lcd1602_dat= 0xff;//IO 口置1 做輸入
  231.         //1602必須要接高四位
  232.          lcd1602_dat |= 0xf0;//接四路高四位 口置1 做輸入
  233.          lcd1602_rs = 0;
  234.          lcd1602_rw = 1;
  235.          do
  236.          {
  237.                  lcd1602_en = 1;
  238.                  state = lcd1602_dat;//一個脈沖只接四位 第一次為高四位
  239.                  lcd1602_en = 0;
  240.                  delay1ms(1);        //lcd1602_dat就是p0總io口
  241.                  lcd1602_en = 1;      
  242.                  state |= lcd1602_dat; //再次發送 得到低四位
  243.                  lcd1602_en = 0;
  244.                  i++;
  245.                  if(i>50)
  246.                          break;
  247.          }
  248.          while(state & 0x80);
  249.                
  250. }
  251. #endif



  252. #ifndef         LCD1602_4PINS         //當沒有定義這個LCD1602_4PINS時
  253. void lcd1602_write_cmd(unsigned char cmd)
  254. {
  255.         lcd1602_readbf();//忙檢測
  256.         lcd1602_rs = 0;//函數
  257.         lcd1602_rw = 0;//寫
  258.         lcd1602_dat= cmd;//lcd1602_dat就是p0總io口
  259.         delay1ms(1);
  260.         lcd1602_en = 1;
  261.         lcd1602_en = 0;
  262. }
  263. #else
  264. void lcd1602_write_cmd(unsigned char cmd)
  265. {
  266.         lcd1602_readbf();//忙檢測
  267.         lcd1602_rs = 0;//函數
  268.         lcd1602_rw = 0;//寫
  269.         lcd1602_dat= cmd;//高四位不需要處理,因為接的是高四位
  270.         delay1ms(5);
  271.         lcd1602_en = 1;
  272.         delay1ms(1);
  273.         lcd1602_en = 0;
  274.         lcd1602_dat = cmd << 4;
  275.         delay1ms(5);
  276.         lcd1602_en = 1;
  277.         delay1ms(1);
  278.         lcd1602_en = 0;
  279. }
  280. #endif

  281. #ifndef         LCD1602_4PINS         //當沒有定義這個LCD1602_4PINS時
  282. void lcd1602_write_dat(unsigned char dat)
  283. {
  284.         lcd1602_readbf();//忙檢測
  285.         lcd1602_rs = 1;//數據
  286.         lcd1602_rw = 0;//寫
  287.         lcd1602_dat= dat;//高四位不需要處理,因為接的是高四位
  288.         delay1ms(1);
  289.         lcd1602_en = 1;
  290.         lcd1602_en = 0;
  291. }
  292. #else
  293. void lcd1602_write_dat(unsigned char dat)
  294. {
  295.         lcd1602_readbf();//忙檢測
  296.         lcd1602_rs = 1;//數據
  297.         lcd1602_rw = 0;//寫
  298.         lcd1602_dat= dat;//高四位不需要處理,因為接的是高四位
  299.         delay1ms(5);
  300.         lcd1602_en = 1;  //lcd1602_dat就是p0總io口
  301.         delay1ms(1);
  302.         lcd1602_en = 0;
  303.         lcd1602_dat = dat << 4;//低四位需要左移 因為接的是高四位所以數據需要左移
  304.         delay1ms(5);
  305.         lcd1602_en = 1;
  306.         delay1ms(1);
  307.         lcd1602_en = 0;
  308. }
  309. #endif

  310. #ifndef         LCD1602_4PINS         //當沒有定義這個LCD1602_4PINS時
  311. void lcd1602_init()
  312. {
  313.         lcd1602_write_cmd(0x02);//歸位就是復位
  314.         lcd1602_write_cmd(0x06);//進入設置模式
  315.         lcd1602_write_cmd(0x0c);//顯示開
  316.         lcd1602_write_cmd(0x38);//8位8位數據口,兩行,5*8點陣
  317.         lcd1602_write_cmd(0x01);//清屏
  318. }
  319. #else
  320. void lcd1602_init()
  321. {
  322.         lcd1602_write_cmd(0x02);//歸位就是復位
  323.         lcd1602_write_cmd(0x06);//進入設置模式
  324.         lcd1602_write_cmd(0x0c);//顯示開
  325. //        lcd1602_write_cmd(0x38);//8位8位數據口,兩行,5*8點陣
  326.         lcd1602_write_cmd(0x33);
  327.         delay1ms(5);
  328.         lcd1602_write_cmd(0x32);
  329.         lcd1602_write_cmd(0x28);//4位8位數據口,兩行,5*8點陣
  330.         lcd1602_write_cmd(0x01);//清屏
  331. }
  332. #endif

  333. void lcd1602_shwo_str(unsigned char x,unsigned char y,unsigned char *str)//定位加*str指針方式發送字符串
  334. {
  335.         lcd1602_write_cmd(0x38);
  336.         if(y == 0)
  337.         {
  338.                 lcd1602_write_cmd(0x80 + x);
  339.         }else{
  340.                 lcd1602_write_cmd(0xc0 + x);
  341.         }
  342.         while(*str != '\0')// '\0'這個是結束符的意思
  343.         {
  344.                 lcd1602_write_dat(*str++);
  345.         }
  346.         
  347. }

  348. unsigned char lcd1602_integertostr(long dat,unsigned char *str)
  349. {
  350.         unsigned int i = 0;
  351.         unsigned char len = 0;
  352.         unsigned char buf[11];
  353.         if(dat < 0)
  354.         {
  355.                 dat = -dat;//如果是負數,取絕對值
  356.                 *str++ = '-';
  357.                 len++;
  358. //                dat = Numerical_conversion(dat);
  359.                         for(i=0;dat>9; i++)
  360.                         {
  361.                                 buf[i] = dat%10;     //先遇10取余
  362.                                 dat /=10;
  363.                                 len++;                                
  364.                         }
  365.                         *str++ = dat%10 + '0';     //轉換ascll碼 + '0'或者*0x30
  366.                          len++;
  367.                         for(i=len;i>2;i--)
  368.                         {
  369.                                 *str++ = buf[i-3] + '0';
  370.                         }
  371.                         *str = '\0';

  372.          }
  373.         if(dat > 0)
  374.         {
  375.                         for(i=0;dat>9; i++)
  376.                         {
  377.                                 buf[i] = dat%10;        //先遇10取余
  378.                                 dat /=10;
  379.                                 len++;                                
  380.                         }
  381.                         *str++ = dat%10 + '0';    //轉換ascll碼 + '0'或者*0x30
  382.                          len++;
  383.                         for(i=len;i>1;i--)
  384.                         {
  385.                                 *str++ = buf[i-2] + '0';
  386.                         }
  387.                                 *str = '\0';
  388.          }

  389.         return len;
  390. }

復制代碼



回復

使用道具 舉報

ID:213173 發表于 2021-10-1 20:42 | 顯示全部樓層
給你一個示例對照查找問題。
ds18b20 0~120度PWM恒溫控制LCD顯示 仿真.zip (161.62 KB, 下載次數: 17)
回復

使用道具 舉報

ID:639106 發表于 2021-10-4 09:11 | 顯示全部樓層
延時要長點
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 日韩www| 国产精品毛片一区二区三区 | 一区二区三区免费在线观看 | 精品久久久久一区 | 男人天堂网站 | 欧美精品网站 | 日操操夜操操 | 伊人久久一区二区 | 国产精品成人品 | 三级成人在线 | 日韩激情视频一区 | 91视频久久 | 日韩综合一区 | 欧洲妇女成人淫片aaa视频 | 国产九九九九 | 91素人 | av毛片在线 | av在线天天 | 欧美a∨ | 伊人久久大香线 | 精品国产乱码久久久久久闺蜜 | 在线观看视频一区二区三区 | 久久久久一区二区三区 | 国产91在线播放精品91 | 午夜在线观看视频 | 黄色在线观看 | 在线观看一区 | 国产激情视频网站 | 亚洲国产精品日韩av不卡在线 | 精品视频一区二区三区在线观看 | 午夜天堂 | 成人精品| 国内91在线 | 成人性视频免费网站 | 亚洲欧美一区二区三区国产精品 | 欧美精品一区二区在线观看 | 日韩美女爱爱 | 午夜av电影 | 一区二区三区精品 | 亚洲欧美日韩在线一区二区 | 日韩亚洲视频在线 |