找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

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

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

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

1111111.png
2222222222222222.jpg

仿真.zip

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

程序和仿真

回復(fù)

使用道具 舉報(bào)

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

使用道具 舉報(bào)

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

使用道具 舉報(bào)

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

使用道具 舉報(bào)

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

判忙函數(shù)有點(diǎn)不兼容,屏蔽掉即可正常仿真;虬慈缦滦抟部梢哉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;
}



回復(fù)

使用道具 舉報(bào)

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

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

使用道具 舉報(bào)

ID:213173 發(fā)表于 2019-3-27 13:53 | 顯示全部樓層
愛學(xué)習(xí)的佩奇 發(fā)表于 2019-3-27 11:29
您好,我把判忙函數(shù)屏蔽了,結(jié)果可以顯示,但是仿真時(shí)一直提示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;
}
回復(fù)

使用道具 舉報(bào)

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

也可以這樣改成-55~128度測(cè)溫
無標(biāo)題.jpg

  1. /*-----------------------------------------------
  2.   名稱:DS18b20 溫度檢測(cè)液晶顯示
  3.   編寫:shifang
  4.   日期:2009.5
  5.   修改:無
  6.   內(nèi)容:
  7. ------------------------------------------------*/
  8. #include<reg52.h> //包含頭文件,一般情況不需要改動(dòng),頭文件包含特殊功能寄存器的定義
  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'}; //存儲(chǔ)顯示值的全局變量
  24. bit ReadTempFlag;//定義讀時(shí)間標(biāo)志
  25. /*------------------------------------------------
  26.                     定時(shí)器初始化子程序
  27. ------------------------------------------------*/
  28. void Init_Timer0(void)
  29. {
  30.         TMOD= 0x01;          //使用模式1,16位定時(shí)器,使用"|"符號(hào)可以在使用多個(gè)定時(shí)器時(shí)不受影響                     
  31.         TH0=(65536-2000)/256;        //賦值 2ms
  32.         TL0=(65536-2000)%256;
  33.         EA=1;            //總中斷打開
  34.         ET0=1;           //定時(shí)器中斷打開
  35.         TR0=1;           //定時(shí)器開關(guān)打開
  36. }
  37. /*------------------------------------------------
  38.                  定時(shí)器中斷子程序
  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; //讀標(biāo)志位置1
  50.         }
  51. }
  52. /*------------------------------------------------
  53. uS延時(shí)函數(shù),含有輸入?yún)?shù) unsigned char t,無返回值
  54. unsigned char 是定義無符號(hào)字符變量,其值的范圍是
  55. 0~255 這里使用晶振12M,精確延時(shí)請(qǐng)使用匯編,大致延時(shí)
  56. 長(zhǎng)度如下 T=tx2+5 uS
  57. ------------------------------------------------*/
  58. void DelayUs2x(unsigned char t)
  59. {   
  60.         while(--t);
  61. }
  62. /*------------------------------------------------
  63. mS延時(shí)函數(shù),含有輸入?yún)?shù) unsigned char t,無返回值
  64. unsigned char 是定義無符號(hào)字符變量,其值的范圍是
  65. 0~255 這里使用晶振12M,精確延時(shí)請(qǐng)使用匯編
  66. ------------------------------------------------*/
  67. void DelayMs(unsigned char t)
  68. {     
  69.         while(t--)
  70.         {
  71.                  //大致延時(shí)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);    /*顯示光標(biāo)移動(dòng)設(shè)置*/
  175.         DelayMs(5);
  176.         LCD_Write_Com(0x0C);    /*顯示開及光標(biāo)設(shè)置*/
  177. }
  178. /*------------------------------------------------   
  179. 設(shè)定二個(gè)自定義字符,LCD1602中自定義字符的地址為0x00--0x07,
  180. 即可定義8個(gè)字符
  181. 這里我們?cè)O(shè)定把一個(gè)自定義字符放在0x00位置(000),
  182. 另一個(gè)放在0x01位子(001)
  183. ------------------------------------------------*/

  184. void Lcd_User_Chr(void)
  185. { //第一個(gè)自定義字符
  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-點(diǎn)亮,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. //第二個(gè)自定義字符

  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復(fù)位
  227.          DelayUs2x(5);   //稍做延時(shí)
  228.          DQ = 0;         //單片機(jī)將DQ拉低
  229.          DelayUs2x(200); //精確延時(shí) 大于 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); //稍作延時(shí)返回
  235.          return dat;
  236. }

  237. /*------------------------------------------------
  238.                     讀取一個(gè)字節(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; // 給脈沖信號(hào)
  247.                 dat>>=1;
  248.                 DQ = 1; // 給脈沖信號(hào)
  249.                 if(DQ)
  250.                 dat|=0x80;
  251.                 DelayUs2x(25);
  252.         }
  253.         return(dat);
  254. }
  255. /*------------------------------------------------
  256.                     寫入一個(gè)字節(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); // 跳過讀序號(hào)列號(hào)的操作
  281.         WriteOneChar(0x44); // 啟動(dòng)溫度轉(zhuǎn)換
  282.         DelayMs(10);
  283.         Init_DS18B20();
  284.         WriteOneChar(0xCC); //跳過讀序號(hào)列號(hào)的操作
  285.         WriteOneChar(0xBE); //讀取溫度寄存器等(共可讀9個(gè)寄存器) 前兩個(gè)就是溫度
  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;//負(fù)數(shù)標(biāo)志
  304. //        unsigned char displaytemp[16];//定義顯示區(qū)域臨時(shí)存儲(chǔ)數(shù)組
  305.         LCD_Init();           //初始化液晶
  306.         DelayMs(20);          //延時(shí)有助于穩(wěn)定
  307.         LCD_Clear();          //清屏
  308.         Init_Timer0();
  309.         Lcd_User_Chr();       //寫入自定義字符
  310.         
  311. //        LCD_Write_Char(13,0,0x01);//寫入溫度右上角點(diǎn)
  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;                //負(fù)號(hào)標(biāo)志
  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進(jìn)制溫度值再放大100倍
  329.                         TempH=tempM/100;                                //分解出整數(shù)值        
  330.                         TempL=tempM%100;                                //分解出小數(shù)值
  331.                         if(negative==1)
  332.                                 TempData[0]='-';//顯示負(fù)號(hào)
  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';                        //顯示個(gè)位溫度
  343. //                        TempData[3]='.';                                                                //顯示小數(shù)點(diǎn)
  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);        //寫一個(gè)字節(jié)數(shù)據(jù)               
  349.                         LCD_Write_String(6,0,TempData);        //寫一個(gè)字節(jié)數(shù)據(jù)               

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



回復(fù)

使用道具 舉報(bào)

ID:481409 發(fā)表于 2019-3-27 15:29 | 顯示全部樓層
wulin 發(fā)表于 2019-3-27 10:55
判忙函數(shù)有點(diǎn)不兼容,屏蔽掉即可正常仿真;虬慈缦滦抟部梢哉7抡。/*-------------------------------- ...

您好,我試了下好像不行。
回復(fù)

使用道具 舉報(bào)

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

看上面代碼
回復(fù)

使用道具 舉報(bào)

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

好的,謝謝大神方法,已解決!!
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表