欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

標題: 5.00v電壓表,全速仿真可以通過,為啥單步就顯示不正常? [打印本頁]

作者: jifengjianwu    時間: 2018-12-23 08:55
標題: 5.00v電壓表,全速仿真可以通過,為啥單步就顯示不正常?


單片機源程序:
  1. /*********************************包含頭文件********************************/
  2. #include <reg51.h>
  3. #include <intrins.h>
  4. /*********************************端口定義  **********************************/
  5. sbit CS  = P3^2;
  6. sbit Clk = P3^0;
  7. sbit DATI = P3^1;
  8. sbit DATO = P3^1;
  9. sbit P20 = P2^0 ;
  10. /*******************************定義全局變量    ********************************/
  11. unsigned char dat = 0x00;                                   //AD  值
  12. unsigned char count = 0x00;                                 //定時器計數
  13. unsigned char CH;                                           //通道變量
  14. unsigned char dis[] = {0x00, 0x00, 0x00};                   //顯示數值
  15. /*******************************共陽   LED  段碼表  *******************************/
  16. unsigned char code tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
  17. char code tablewe[]={0xfd,0xfb,0xf7,0xef,0xdf,0xfe};
  18. /****************************************************************************
  19. 函數功能   :AD  轉換子程序
  20. 入口參數   :CH
  21. 出口參數   :dat
  22. ****************************************************************************/
  23. unsigned char adc0832(unsigned char CH)
  24. {
  25. unsigned char i,test,adval;
  26. adval = 0x00;
  27. test = 0x00;
  28. Clk = 0;                                                       //初始化
  29. DATI = 1;
  30. _nop_();
  31. CS = 0;
  32. _nop_();
  33. Clk = 1;
  34. _nop_();
  35. if ( CH == 0x00 )                                            //通道選擇
  36. {
  37. Clk = 0;
  38. DATI = 1;                                                    //通道   0 的第一位
  39. _nop_();
  40. Clk = 1;
  41. _nop_();
  42. Clk = 0;
  43. DATI = 0;                                                    //通道  0 的第二位
  44. _nop_();
  45. Clk = 1;
  46. _nop_();
  47. }
  48. else
  49. {
  50. Clk = 0;
  51. DATI = 1;             //通道  1 的第一位
  52. _nop_();
  53. Clk = 1;
  54. _nop_();
  55. Clk = 0;
  56. DATI = 1;             //通道  1 的第二位
  57. _nop_();
  58. Clk = 1;
  59. _nop_();
  60. }
  61. Clk = 0;
  62. DATI = 1;
  63. for( i = 0;i < 8;i++ )               //讀取前   8 位的值
  64. {
  65. _nop_();
  66. adval <<= 1;
  67. Clk = 1;
  68. _nop_();
  69. Clk = 0;
  70. if (DATO)
  71. adval |= 0x01;
  72. else
  73. adval |= 0x00;
  74. }
  75. for (i = 0; i < 8; i++)               //讀取后    8 位的值
  76. {
  77. test >>= 1;
  78. if (DATO)
  79. test |= 0x80;
  80. else
  81. test |= 0x00;
  82. _nop_();
  83. Clk = 1;
  84. _nop_();
  85. Clk = 0;
  86. }
  87. dat=test;
  88. _nop_();
  89. CS = 1;                                 //釋放   ADC0832
  90. DATO = 1;
  91. Clk = 1;
  92. return dat;
  93. }
  94. /****************************************************************************
  95. 函數功能   :延時子程序
  96. 入口參數   :
  97. 出口參數   :
  98. ****************************************************************************/
  99. void delay(void)
  100. {
  101. int k;
  102. for(k=100;k<500;k++);
  103. }
  104. /****************************************************************************
  105. 函數功能   :將  0-255 級換算成    0.00-5.00  的電壓數值
  106. 入口參數   :i
  107. 出口參數   :
  108. ****************************************************************************/
  109. void convdata(unsigned char i)
  110. {
  111. dis[0] = i/51;                                   //個位
  112. dis[1] = (i%51)*10/51;                         //小數點后第一位
  113. dis[2] = ((i%51)*10%51)*10/51;                 //小數點后第二位
  114. }
  115. /****************************************************************************
  116. 函數功能   :數碼管顯示子程序
  117. 入口參數   :
  118. 出口參數   :
  119. ****************************************************************************/
  120. void display(void)
  121. {
  122. P2=0xff;                                                         
  123. P0=tab[dis[0]] & 0x7f;               //顯示個位和小數點
  124. delay();
  125. P2=0xfd;
  126. P2=0xff;                                                         
  127. P0=tab[dis[1]];                    //顯示小數點后第一位
  128. delay();
  129. P2=0xfb;
  130. P2=0xff;
  131. P0=tab[dis[2]];                    //顯示小數點后第二位
  132. delay();
  133. P2=0xf7;
  134. P2=0xff;
  135. P0=0xff;                          
  136. }
  137. /****************************************************************************
  138. 函數功能   :主程序
  139. 入口參數   :
  140. 出口參數   :
  141. ****************************************************************************/
  142. void main(void)
  143. {
  144. P2=0xff;                               //端口初始化
  145. P0=0xff;
  146. delay();
  147. CH = 0x00;                             //在這里選擇通道 0x00 或 0x01
  148. TMOD = 0x01;                           //設置中斷
  149. TH0=(65536-50000)/256;                 //定時器1初值定時 50ms
  150. TL0=(65536-50000)%256;
  151. IE = 0x82;
  152. TR0 = 1;
  153. while(1)                                //主循環
  154.   {
  155.   dat = adc0832(CH);
  156.    convdata(dat);                        //數據轉換
  157.    display();                            //顯示數值
  158.   }
  159. }
  160. /****************************************************************************
  161. 函數功能   :定時器中斷延時程序 這一段的作用時隔一段時間抽樣一次 否側顯示的最后一位
  162. 會不穩定
  163. 入口參數   :
  164. 出口參數   :
  165. ****************************************************************************/
  166. void timer0(void) interrupt 1
  167. {
  168. TMOD = 0x01;
  169. TH0=(65536-50000)/256;              //  定時器1初值定時50ms
  170. TL0=(65536-50000)%256;
  171. IE = 0x82;
  172. TR0 = 1;
  173. count++;
  174. if (count == 0x01)
  175.   {
  176.    count = 0x00;
  177.    dat = adc0832(CH);
  178.   }
  179. }

復制代碼



作者: yaoji123    時間: 2018-12-23 10:55
仿真器與實際硬件有差別,一般仿真器上做全速,硬件調試可做單步與全速,斷點等調試。
作者: jifengjianwu    時間: 2018-12-23 11:28
yaoji123 發表于 2018-12-23 10:55
仿真器與實際硬件有差別,一般仿真器上做全速,硬件調試可做單步與全速,斷點等調試。

是不是圖二的程序有問題?
作者: jifengjianwu    時間: 2018-12-23 11:31
問題是:單步運行時4個“2.”都亮了,如圖二。全速運行就正常了如圖三。
作者: jifengjianwu    時間: 2018-12-23 18:44
有明白的嗎?希望能指教,謝謝
作者: robinsonlin    時間: 2018-12-24 13:52
中斷里面做太多事情了,竟然還有除法運算,你自己有沒有測算一下這個中斷要多長時間去處理? 很有可能是程序跑飛了。 建議你,中斷里面就設置標志位,在主程序里面判斷標志位,然后執行相應程序。
作者: mike6    時間: 2018-12-24 15:13
很有可能是程序跑飛了。 建議你,中斷里面就設置標志位,在主程序里面判斷標志位,然后執行相應程序。




歡迎光臨 (http://m.raoushi.com/bbs/) Powered by Discuz! X3.1