找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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. }

复制代码


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

使用道具 举报

沙发
ID:432823 发表于 2018-12-23 10:55 | 只看该作者
仿真器与实际硬件有差别,一般仿真器上做全速,硬件调试可做单步与全速,断点等调试。
回复

使用道具 举报

板凳
ID:412814 发表于 2018-12-23 11:28 | 只看该作者
yaoji123 发表于 2018-12-23 10:55
仿真器与实际硬件有差别,一般仿真器上做全速,硬件调试可做单步与全速,断点等调试。

是不是图二的程序有问题?
回复

使用道具 举报

地板
ID:412814 发表于 2018-12-23 11:31 | 只看该作者
问题是:单步运行时4个“2.”都亮了,如图二。全速运行就正常了如图三。
回复

使用道具 举报

5#
ID:412814 发表于 2018-12-23 18:44 | 只看该作者
有明白的吗?希望能指教,谢谢
回复

使用道具 举报

6#
ID:451718 发表于 2018-12-24 13:52 | 只看该作者
中断里面做太多事情了,竟然还有除法运算,你自己有没有测算一下这个中断要多长时间去处理? 很有可能是程序跑飞了。 建议你,中断里面就设置标志位,在主程序里面判断标志位,然后执行相应程序。
回复

使用道具 举报

7#
ID:347152 发表于 2018-12-24 15:13 来自手机 | 只看该作者
很有可能是程序跑飞了。 建议你,中断里面就设置标志位,在主程序里面判断标志位,然后执行相应程序。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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