微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 关于串行口打印在调试程序中的应用的问题

关于串行口打印在调试程序中的应用的问题

时间:10-02 整理:3721RD 点击:

  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旁的电位器结果都一样不变(如图),换了其他人的开发板结果也是这样,求解



修改了128行代码为“ad_vo=(float)ad_val*5.0/256.0;”后有数值返回(如图),但调节电位器依然没反应

上一篇:stm32f1与外部中断
下一篇:(1)开箱贴

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top