找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 5913|回復: 10
收起左側(cè)

程序加載入Proteus中仿真沒反應,燒入買來的單片機開發(fā)板就可以顯示,這是什么原因?

[復制鏈接]
ID:481409 發(fā)表于 2019-3-26 19:24 | 顯示全部樓層 |閱讀模式
程序加載入Proteus中仿真沒反應,燒入買來的單片機開發(fā)板就可以顯示,這是什么原因?

1111111.png
2222222222222222.jpg

仿真.zip

89.76 KB, 下載次數(shù): 15

程序和仿真

回復

使用道具 舉報

ID:481409 發(fā)表于 2019-3-26 22:45 | 顯示全部樓層
仿真運行時,發(fā)現(xiàn)DS18B20一直是紅色的高電平,寫了一串用來顯示的字符的程序加載進去運行,LCD可以正常顯示,LCD應該沒問題,就是DS18B20為什么一直是高電平,我改了下引腳燒進開發(fā)板,結(jié)果都可以正常讀取溫度,就是仿真不行,各位看看什么情況???
回復

使用道具 舉報

ID:140489 發(fā)表于 2019-3-27 09:53 | 顯示全部樓層
ds18b20的DQ腳接個上拉電阻試試
回復

使用道具 舉報

ID:426861 發(fā)表于 2019-3-27 10:25 | 顯示全部樓層
看下你的開發(fā)板上的相關(guān)電路和仿真的電路哪里有不同
回復

使用道具 舉報

ID:213173 發(fā)表于 2019-3-27 10:55 | 顯示全部樓層
本帖最后由 wulin 于 2019-3-27 11:32 編輯

判忙函數(shù)有點不兼容,屏蔽掉即可正常仿真;虬慈缦滦抟部梢哉7抡妗/*------------------------------------------------
              判忙函數(shù)
------------------------------------------------*/
bit LCD_Check_Busy(void)
{
        bit i;
        DataPort= 0xFF;
        RS_CLR;
        RW_SET;
        EN_SET;
        _nop_();
        i=(bit)(DataPort & 0x80);
        EN_CLR;
        return i;
}



回復

使用道具 舉報

ID:481409 發(fā)表于 2019-3-27 11:29 | 顯示全部樓層
wulin 發(fā)表于 2019-3-27 10:55
判忙函數(shù)有點不兼容,屏蔽掉即可正常仿真。

您好,我把判忙函數(shù)屏蔽了,結(jié)果可以顯示,但是仿真時一直提示LCD is busy,還有原本是顯示Temp +溫度℃,但是現(xiàn)在顯示的是emp+溫度℃,這是怎么回事?   還有仿真時判忙函數(shù)屏蔽那做實物的時候需要屏蔽嗎?還是說我的判忙函數(shù)寫的有問題。  謝謝
回復

使用道具 舉報

ID:213173 發(fā)表于 2019-3-27 13:53 | 顯示全部樓層
愛學習的佩奇 發(fā)表于 2019-3-27 11:29
您好,我把判忙函數(shù)屏蔽了,結(jié)果可以顯示,但是仿真時一直提示LCD is busy,還有原本是顯示Temp +溫度℃ ...

把判忙函數(shù)按如下修改即可正常仿真。
bit LCD_Check_Busy(void)
{
        bit i;
        DataPort= 0xFF;
        RS_CLR;
        RW_SET;
        EN_SET;
        _nop_();
        i=(bit)(DataPort & 0x80);
        EN_CLR;
        return i;
}
回復

使用道具 舉報

ID:213173 發(fā)表于 2019-3-27 14:29 | 顯示全部樓層
愛學習的佩奇 發(fā)表于 2019-3-27 11:29
您好,我把判忙函數(shù)屏蔽了,結(jié)果可以顯示,但是仿真時一直提示LCD is busy,還有原本是顯示Temp +溫度℃ ...

也可以這樣改成-55~128度測溫
無標題.jpg

  1. /*-----------------------------------------------
  2.   名稱:DS18b20 溫度檢測液晶顯示
  3.   編寫:shifang
  4.   日期:2009.5
  5.   修改:無
  6.   內(nèi)容:
  7. ------------------------------------------------*/
  8. #include<reg52.h> //包含頭文件,一般情況不需要改動,頭文件包含特殊功能寄存器的定義
  9. #include<intrins.h>
  10. #include<stdio.h>
  11. #define RS_CLR RS=0
  12. #define RS_SET RS=1
  13. #define RW_CLR RW=0
  14. #define RW_SET RW=1
  15. #define EN_CLR EN=0
  16. #define EN_SET EN=1
  17. #define DataPort P0
  18. sbit RS = P2^0;   //定義端口
  19. sbit RW = P2^1;
  20. sbit EN = P2^2;
  21. sbit DQ=P1^0;//ds18b20 端口
  22. unsigned char Temp[]={'T','e','m','p',':','\0'};
  23. unsigned char TempData[]={0,0,0,'.',0,0,0x01,'C','\0'}; //存儲顯示值的全局變量
  24. bit ReadTempFlag;//定義讀時間標志
  25. /*------------------------------------------------
  26.                     定時器初始化子程序
  27. ------------------------------------------------*/
  28. void Init_Timer0(void)
  29. {
  30.         TMOD= 0x01;          //使用模式1,16位定時器,使用"|"符號可以在使用多個定時器時不受影響                     
  31.         TH0=(65536-2000)/256;        //賦值 2ms
  32.         TL0=(65536-2000)%256;
  33.         EA=1;            //總中斷打開
  34.         ET0=1;           //定時器中斷打開
  35.         TR0=1;           //定時器開關(guān)打開
  36. }
  37. /*------------------------------------------------
  38.                  定時器中斷子程序
  39. ------------------------------------------------*/
  40. void Timer0_isr(void) interrupt 1
  41. {
  42.         static unsigned int num;
  43.         TH0=(65536-2000)/256;                  //重新賦值 2ms
  44.         TL0=(65536-2000)%256;        
  45.         num++;
  46.         if(num==300)        //
  47.         {
  48.                 num=0;
  49.                 ReadTempFlag=1; //讀標志位置1
  50.         }
  51. }
  52. /*------------------------------------------------
  53. uS延時函數(shù),含有輸入?yún)?shù) unsigned char t,無返回值
  54. unsigned char 是定義無符號字符變量,其值的范圍是
  55. 0~255 這里使用晶振12M,精確延時請使用匯編,大致延時
  56. 長度如下 T=tx2+5 uS
  57. ------------------------------------------------*/
  58. void DelayUs2x(unsigned char t)
  59. {   
  60.         while(--t);
  61. }
  62. /*------------------------------------------------
  63. mS延時函數(shù),含有輸入?yún)?shù) unsigned char t,無返回值
  64. unsigned char 是定義無符號字符變量,其值的范圍是
  65. 0~255 這里使用晶振12M,精確延時請使用匯編
  66. ------------------------------------------------*/
  67. void DelayMs(unsigned char t)
  68. {     
  69.         while(t--)
  70.         {
  71.                  //大致延時1mS
  72.                  DelayUs2x(245);
  73.                  DelayUs2x(245);
  74.         }
  75. }

  76. /*------------------------------------------------
  77.               判忙函數(shù)
  78. ------------------------------------------------*/
  79. bit LCD_Check_Busy(void)
  80. {
  81.         bit i;
  82.         DataPort= 0xFF;
  83.         RS_CLR;
  84.         RW_SET;
  85.         EN_SET;
  86.         _nop_();
  87.         i=(bit)(DataPort & 0x80);
  88.         EN_CLR;
  89.         return i;
  90. }
  91. /*------------------------------------------------
  92.               寫入命令函數(shù)
  93. ------------------------------------------------*/
  94. void LCD_Write_Com(unsigned char com)
  95. {  
  96.         while(LCD_Check_Busy()); //忙則等待
  97.         RS_CLR;
  98.         RW_CLR;
  99.         EN_SET;
  100.         DataPort= com;
  101.         _nop_();
  102.         EN_CLR;
  103. }
  104. /*------------------------------------------------
  105.               寫入數(shù)據(jù)函數(shù)
  106. ------------------------------------------------*/
  107. void LCD_Write_Data(unsigned char Data)
  108. {
  109.         while(LCD_Check_Busy()); //忙則等待
  110.         RS_SET;
  111.         RW_CLR;
  112.         EN_SET;
  113.         DataPort= Data;
  114.         _nop_();
  115.         EN_CLR;
  116. }

  117. /*------------------------------------------------
  118.                 清屏函數(shù)
  119. ------------------------------------------------*/
  120. void LCD_Clear(void)
  121. {
  122.         LCD_Write_Com(0x01);
  123.         DelayMs(5);
  124. }
  125. /*------------------------------------------------
  126.               寫入字符串函數(shù)
  127. ------------------------------------------------*/
  128. void LCD_Write_String(unsigned char x,unsigned char y,unsigned char *s)
  129. {     
  130.         if (y == 0)
  131.         {     
  132.                 LCD_Write_Com(0x80 + x);     //表示第一行
  133.         }
  134.         else
  135.         {      
  136.                 LCD_Write_Com(0xC0 + x);      //表示第二行
  137.         }        
  138.         while (*s)
  139.         {     
  140.                 LCD_Write_Data( *s);     
  141.                 s ++;     
  142.         }
  143. }
  144. /*------------------------------------------------
  145.               寫入字符函數(shù)
  146. ------------------------------------------------*/
  147. /*
  148. void LCD_Write_Char(unsigned char x,unsigned char y,unsigned char Data)
  149. {     
  150. if (y == 0)
  151.          {     
  152.          LCD_Write_Com(0x80 + x);     
  153.          }   
  154. else
  155.          {     
  156.          LCD_Write_Com(0xC0 + x);     
  157.          }        
  158. LCD_Write_Data( Data);  
  159. }*/
  160. /*------------------------------------------------
  161.               初始化函數(shù)
  162. ------------------------------------------------*/
  163. void LCD_Init(void)
  164. {
  165.         LCD_Write_Com(0x38);    /*顯示模式設(shè)置*/
  166.         DelayMs(5);
  167.         LCD_Write_Com(0x38);
  168.         DelayMs(5);
  169.         LCD_Write_Com(0x38);
  170.         DelayMs(5);
  171.         LCD_Write_Com(0x38);  
  172.         LCD_Write_Com(0x08);    /*顯示關(guān)閉*/
  173.         LCD_Write_Com(0x01);    /*顯示清屏*/
  174.         LCD_Write_Com(0x06);    /*顯示光標移動設(shè)置*/
  175.         DelayMs(5);
  176.         LCD_Write_Com(0x0C);    /*顯示開及光標設(shè)置*/
  177. }
  178. /*------------------------------------------------   
  179. 設(shè)定二個自定義字符,LCD1602中自定義字符的地址為0x00--0x07,
  180. 即可定義8個字符
  181. 這里我們設(shè)定把一個自定義字符放在0x00位置(000),
  182. 另一個放在0x01位子(001)
  183. ------------------------------------------------*/

  184. void Lcd_User_Chr(void)
  185. { //第一個自定義字符
  186. LCD_Write_Com(0x40); //"01 000 000"  第1行地址 (D7D6為地址設(shè)定命令形式D5D4D3為字符存放位置(0--7),D2D1D0為字符行地址(0--7))
  187. LCD_Write_Data(0x00); //"XXX 11111" 第1行數(shù)據(jù)(D7D6D5為XXX,表示為任意數(shù)(一般用000),D4D3D2D1D0為字符行數(shù)據(jù)(1-點亮,0-熄滅)
  188. LCD_Write_Com(0x41); //"01 000 001"  第2行地址
  189. LCD_Write_Data(0x04); //"XXX 10001" 第2行數(shù)據(jù)
  190. LCD_Write_Com(0x42); //"01 000 010"  第3行地址
  191. LCD_Write_Data(0x0e); //"XXX 10101" 第3行數(shù)據(jù)
  192. LCD_Write_Com(0x43); //"01 000 011"  第4行地址
  193. LCD_Write_Data(0x0e); //"XXX 10001" 第4行數(shù)據(jù)
  194. LCD_Write_Com(0x44); //"01 000 100"  第5行地址
  195. LCD_Write_Data(0x0e); //"XXX 11111" 第5行數(shù)據(jù)
  196. LCD_Write_Com(0x45); //"01 000 101"  第6行地址
  197. LCD_Write_Data(0x1f); //"XXX 01010" 第6行數(shù)據(jù)
  198. LCD_Write_Com(0x46); //"01 000 110"  第7行地址
  199. LCD_Write_Data(0x04); //"XXX 11111" 第7行數(shù)據(jù)
  200. LCD_Write_Com(0x47); //"01 000 111"  第8行地址
  201.    LCD_Write_Data(0x00); //"XXX 00000" 第8行數(shù)據(jù)
  202. //第二個自定義字符

  203. LCD_Write_Com(0x48); //"01 001 000"  第1行地址  
  204. LCD_Write_Data(0x03); //"XXX 00001" 第1行數(shù)據(jù)
  205. LCD_Write_Com(0x49); //"01 001 001"  第2行地址
  206. LCD_Write_Data(0x03); //"XXX 11011" 第2行數(shù)據(jù)
  207. LCD_Write_Com(0x4a); //"01 001 010"  第3行地址
  208. LCD_Write_Data(0x00); //"XXX 11101" 第3行數(shù)據(jù)
  209. LCD_Write_Com(0x4b); //"01 001 011"  第4行地址
  210. LCD_Write_Data(0x00); //"XXX 11001" 第4行數(shù)據(jù)
  211. LCD_Write_Com(0x4c); //"01 001 100"  第5行地址
  212. LCD_Write_Data(0x00); //"XXX 11101" 第5行數(shù)據(jù)
  213. LCD_Write_Com(0x4d); //"01 001 101"  第6行地址
  214. LCD_Write_Data(0x00); //"XXX 11011" 第6行數(shù)據(jù)
  215. LCD_Write_Com(0x4e); //"01 001 110"  第7行地址
  216. LCD_Write_Data(0x00); //"XXX 00001" 第7行數(shù)據(jù)
  217. LCD_Write_Com(0x4f); //"01 001 111"  第8行地址
  218. LCD_Write_Data(0x00); //"XXX 00000" 第8行數(shù)據(jù)
  219. }
  220. /*------------------------------------------------
  221.                     18b20初始化
  222. ------------------------------------------------*/
  223. bit Init_DS18B20(void)
  224. {
  225.          bit dat=0;
  226.          DQ = 1;    //DQ復位
  227.          DelayUs2x(5);   //稍做延時
  228.          DQ = 0;         //單片機將DQ拉低
  229.          DelayUs2x(200); //精確延時 大于 480us 小于960us
  230.          DelayUs2x(200);
  231.          DQ = 1;        //拉高總線
  232.          DelayUs2x(50); //15~60us 后 接收60-240us的存在脈沖
  233.          dat=DQ;        //如果x=0則初始化成功, x=1則初始化失敗
  234.          DelayUs2x(25); //稍作延時返回
  235.          return dat;
  236. }

  237. /*------------------------------------------------
  238.                     讀取一個字節(jié)
  239. ------------------------------------------------*/
  240. unsigned char ReadOneChar(void)
  241. {
  242.         unsigned char i=0;
  243.         unsigned char dat = 0;
  244.         for (i=8;i>0;i--)
  245.         {
  246.                 DQ = 0; // 給脈沖信號
  247.                 dat>>=1;
  248.                 DQ = 1; // 給脈沖信號
  249.                 if(DQ)
  250.                 dat|=0x80;
  251.                 DelayUs2x(25);
  252.         }
  253.         return(dat);
  254. }
  255. /*------------------------------------------------
  256.                     寫入一個字節(jié)
  257. ------------------------------------------------*/
  258. void WriteOneChar(unsigned char dat)
  259. {
  260.         unsigned char i=0;
  261.         for (i=8; i>0; i--)
  262.         {
  263.                 DQ = 0;
  264.                 DQ = dat&0x01;
  265.                 DelayUs2x(25);
  266.                 DQ = 1;
  267.                 dat>>=1;
  268.         }
  269.         DelayUs2x(25);
  270. }

  271. /*------------------------------------------------
  272.                     讀取溫度
  273. ------------------------------------------------*/
  274. unsigned int ReadTemperature(void)
  275. {
  276.         unsigned char a=0;
  277.         unsigned int b=0;
  278.         unsigned int t=0;
  279.         Init_DS18B20();
  280.         WriteOneChar(0xCC); // 跳過讀序號列號的操作
  281.         WriteOneChar(0x44); // 啟動溫度轉(zhuǎn)換
  282.         DelayMs(10);
  283.         Init_DS18B20();
  284.         WriteOneChar(0xCC); //跳過讀序號列號的操作
  285.         WriteOneChar(0xBE); //讀取溫度寄存器等(共可讀9個寄存器) 前兩個就是溫度
  286.         a=ReadOneChar();   //低位
  287.         b=ReadOneChar();   //高位
  288.         
  289.         b<<=8;
  290.         t=a+b;
  291.         
  292.         return(t);
  293. }
  294. /*------------------------------------------------
  295.                     主函數(shù)
  296. ------------------------------------------------*/
  297. void main (void)
  298. {                  
  299.         unsigned int temp;
  300. //        float temperature;
  301.         long tempM;
  302.         unsigned char TempH,TempL;
  303.         bit negative;//負數(shù)標志
  304. //        unsigned char displaytemp[16];//定義顯示區(qū)域臨時存儲數(shù)組
  305.         LCD_Init();           //初始化液晶
  306.         DelayMs(20);          //延時有助于穩(wěn)定
  307.         LCD_Clear();          //清屏
  308.         Init_Timer0();
  309.         Lcd_User_Chr();       //寫入自定義字符
  310.         
  311. //        LCD_Write_Char(13,0,0x01);//寫入溫度右上角點
  312. //        LCD_Write_Char(14,0,'C'); //寫入字符C
  313.         
  314.         while (1)         //主循環(huán)
  315.         {
  316.                 if(ReadTempFlag==1)
  317.                 {
  318.                         ReadTempFlag=0;
  319.                         temp=ReadTemperature();

  320.                         if(temp&0x8000)
  321.                         {
  322.                                 negative=1;                //負號標志
  323.                                 temp=~temp;                //取反加1
  324.                                 temp +=1;
  325.                         }
  326.                         else negative=0;        //正數(shù)
  327. //                        temperature=(float)temp*0.0625;
  328.                         tempM=temp*0.0625*100;        //換算為10進制溫度值再放大100倍
  329.                         TempH=tempM/100;                                //分解出整數(shù)值        
  330.                         TempL=tempM%100;                                //分解出小數(shù)值
  331.                         if(negative==1)
  332.                                 TempData[0]='-';//顯示負號
  333.                         else if(TempH/100==0)//小于100
  334.                                 TempData[0]=' ';                                                        //百位消隱
  335.                         else
  336.                                 TempData[0]=TempH/100+'0';                         //顯示百位溫度
  337.         
  338.                         if((TempH/100==0)&&((TempH%100)/10==0))
  339.                                 TempData[1]=' ';                                                        //十位消隱
  340.                         else
  341.                                 TempData[1]=(TempH%100)/10+'0';                //顯示十位溫度
  342.                         TempData[2]=(TempH%100)%10+'0';                        //顯示個位溫度
  343. //                        TempData[3]='.';                                                                //顯示小數(shù)點
  344.                         TempData[4]=TempL/10+'0';                                        //顯示溫度小數(shù)1位
  345.                         TempData[5]=TempL%10+'0';                                        //顯示溫度小數(shù)2位        
  346. //                        TempData[6]=0x01;
  347. //                        TempData[7]='C';                                                                //顯示C

  348.                         LCD_Write_String(0,0,Temp);        //寫一個字節(jié)數(shù)據(jù)               
  349.                         LCD_Write_String(6,0,TempData);        //寫一個字節(jié)數(shù)據(jù)               

  350. //                        sprintf(displaytemp,"Temp  % 7.3f",temperature);//打印溫度值
  351. //                        LCD_Write_String(0,0,displaytemp);//顯示第二行
  352.                 }        
  353.         }
  354. }
復制代碼



回復

使用道具 舉報

ID:481409 發(fā)表于 2019-3-27 15:29 | 顯示全部樓層
wulin 發(fā)表于 2019-3-27 10:55
判忙函數(shù)有點不兼容,屏蔽掉即可正常仿真。或按如下修也可以正常仿真。/*-------------------------------- ...

您好,我試了下好像不行。
回復

使用道具 舉報

ID:213173 發(fā)表于 2019-3-27 17:14 | 顯示全部樓層
愛學習的佩奇 發(fā)表于 2019-3-27 15:29
您好,我試了下好像不行。

看上面代碼
回復

使用道具 舉報

ID:481409 發(fā)表于 2019-3-29 10:24 | 顯示全部樓層
wulin 發(fā)表于 2019-3-27 14:29
也可以這樣改成-55~128度測溫

好的,謝謝大神方法,已解決。!
回復

使用道具 舉報

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

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復 返回頂部 返回列表