标题: 关于串行口打印在调试程序中的应用的问题 [打印本页]

作者: 黑橙orangerx    时间: 2016-11-18 20:16
标题: 关于串行口打印在调试程序中的应用的问题
  1. #include <reg52.h>                //52单片机头文件
  2. #include <intrins.h>
  3. #include<stdio.h>
  4. #define uchar unsigned char                //宏定义
  5. #define uint unsigned int
  6. sbit dula=P2^6;
  7. sbit wela=P2^7;
  8. sbit wr=P3^6;
  9. sbit rd=P3^7;
  10. uchar flag,ad;
  11. uchar flag_uart,flag_time,flag_on,a,i,t0_num,ad_val;
  12. float ad_vo;
  13. uchar code tab[]={
  14. 0x3f,0x06,0x5b,0x4f,
  15. 0x66,0x6d,0x7d,0x07,
  16. 0x7f,0x6f,0x77,0x7c,
  17. 0x39,0x5e,0x79,0x71};
  18. void delay (uint z)                                //延时函数,x的值为延时的时间(ms)
  19. {
  20.                 uint c, d;
  21.                 for(c = z; c>0;c--)
  22.                         for(d=113;d>0;d--);
  23. }
  24.        
  25. void init()
  26. {
  27.         TMOD=0x21;
  28.         TH0=(65536-45872)/256;
  29.         TL0=(65536-45872)%256;
  30.         TH1=0xfd;
  31.         TL1=0xfd;
  32.         TR1=1;
  33.         ET0=1;
  34.         SM0=0;
  35.         SM1=1;
  36.         REN=1;
  37.         EA=1;
  38.         ES=1;
  39. }

  40. void display(uchar val)
  41. {
  42.         uchar b,s,g;
  43.         b=val/100;
  44.         s=val%100/10;
  45.         g=val%10;
  46.         dula=1;
  47.         P0=tab[b];
  48.         dula=0;
  49.         P0=0xff;
  50.         wela=1;
  51.         P0=0x7e;
  52.         wela=0;
  53.         delay(5);
  54.         dula=1;
  55.         P0=tab[s];
  56.         dula=0;
  57.         P0=0xff;
  58.         wela=1;
  59.         P0=0x7d;
  60.         wela=0;
  61.         delay(5);
  62.         dula=1;
  63.         P0=tab[g];
  64.         dula=0;
  65.         P0=0xff;
  66.         wela=1;
  67.         P0=0x7b;
  68.         wela=0;
  69.         delay(5);
  70. }

  71. uchar get_ad()
  72. {
  73.         uchar adval;
  74.         wr=1;
  75.         _nop_();
  76.         wr=0;
  77.         _nop_();
  78.         wr=1;
  79.         P1=0xff;
  80.         rd=1;
  81.         _nop_();
  82.         rd=0;
  83.         _nop_();
  84.         adval=P1;
  85.         rd=1;
  86.         return adval;
  87. }

  88. void main(void)
  89. {
  90.         init();
  91.         wela=1;
  92.         P0=0x7f;
  93.         _nop_();
  94.         wela=0;
  95.         while(1)
  96.         {
  97.                 if(flag_uart==1)
  98.                 {
  99.                         flag_uart=0;
  100.                         ES=0;
  101.                         TI=1;
  102.                         switch(flag_on)
  103.                         {
  104.                                 case 0:
  105.                                 puts("Turn on ad!\n");
  106.                                 TR0=1;
  107.                                 break;
  108.                                 case 1:
  109.                                 printf("Turn off ad!\n");
  110.                                 TR0=0;
  111.                                 break;
  112.                                 case 2:
  113.                                 puts("ERROR!\n");
  114.                                 break;
  115.                                 default:break;
  116.                         }
  117.                         while(!TI);
  118.                         TI=0;
  119.                         ES=1;
  120.                 }
  121.                 if(flag_time==1)
  122.                 {
  123.                         flag_time=0;
  124.                         ad_val=get_ad;
  125.                         ad_vo=(float)ad*5.0/256.0;
  126.                         ES=0;
  127.                         TI=1;
  128.                         printf("The voltage is %f V\n",ad_vo);
  129.                         while(!TI);
  130.                         TI=0;
  131.                         ES=1;
  132.                 }
  133.                 display(ad_val);       
  134.         }
  135. }

  136. void timer_0() interrupt 1
  137. {
  138.         TH0 = (65536 -45872)/256;        //重装初值
  139.         TL0 = (65536 - 45872)%256;
  140.     t0_num++;
  141.         if(t0_num==20)
  142.         {
  143.                 t0_num=0;
  144.                 flag_time=1;
  145.         }
  146. }

  147. void ser() interrupt 4
  148. {
  149.         RI=0;
  150.         a=SBUF;
  151.         flag_uart=1;
  152.         if(a==1)
  153.         flag_on=0;
  154.         else if(a==2)
  155.                 flag_on=1;
  156.                 else
  157.                 flag_on=2;
  158. }
复制代码
代码如上,为郭天祥的书《51单片机C语言教程》上6.6的代码,结果如图,无论如何调节ADC0804旁的电位器都一样,求解

0.jpg (60.4 KB, 下载次数: 116)

实验结果_失败

实验结果_失败

1.jpg (480.64 KB, 下载次数: 98)

1.jpg

uartassist.zip

482.5 KB, 下载次数: 6

串口调试助手


作者: a0931727149    时间: 2016-11-19 17:00
我覺得這裡:ad_vo=(float)ad*5.0/256.0; 可能是 ad_vo=(float)ad_val*5.0/256.0;
作者: 黑橙orangerx    时间: 2016-11-19 17:26
a0931727149 发表于 2016-11-19 17:00
我覺得這裡:ad_vo=(float)ad*5.0/256.0; 可能是 ad_vo=(float)ad_val*5.0/256.0;

这里的确写错了,我改了,有数值返回了,但是调节电位器数值没有变化。。。
作者: 黑橙orangerx    时间: 2016-11-19 17:26

作者: a0931727149    时间: 2016-11-19 18:54
uchar get_ad() 函數 中..或許 rd之前需要加適當的延時 ....(需等待ADC轉換完成...在讀取DATA )
作者: 黑橙orangerx    时间: 2016-11-20 14:39
a0931727149 发表于 2016-11-19 18:54
uchar get_ad() 函數 中..或許 rd之前需要加適當的延時 ....(需等待ADC轉換完成...在讀取DATA )
  1. uchar get_ad()
  2. {
  3.         uchar adval;
  4.         wr=1;
  5.         _nop_();
  6.         wr=0;
  7.         _nop_();
  8.         wr=1;
  9.         P1=0xff;
  10.         delay(10);
  11.         rd=1;
  12.         _nop_();
  13.         delay(10);
  14.         rd=0;
  15.         _nop_();
  16.         adval=P1;
  17.         delay(10);
  18.         rd=1;
  19.         delay(10);
  20.         return adval;
  21. }
复制代码


加了延时之后,改变延时的值,数码管显示的值变化了,返回的电压值也变化了,但调节电位器还是没用。。。。楼下第一张是延时为5ms返回的值,第二张是延时为10ms时的值
作者: 黑橙orangerx    时间: 2016-11-20 14:39

作者: 黑橙orangerx    时间: 2016-11-20 14:53
找到问题的所在了,127行的代码应为“ad_vo=get_ad();”

电子档上这行代码印错了
作者: 不忘的回忆    时间: 2018-3-16 21:31
问一下,他这个电位器是哪一个?
不知道为什么我的程序是对的,可是调节单片机上的所有电位器都不改变数值!




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1