找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
跳转到指定楼层
楼主
  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, 下载次数: 90)

实验结果_失败

实验结果_失败

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

1.jpg

uartassist.zip

482.5 KB, 下载次数: 6

串口调试助手

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

使用道具 举报

沙发
ID:140371 发表于 2016-11-19 17:00 | 只看该作者
我覺得這裡:ad_vo=(float)ad*5.0/256.0; 可能是 ad_vo=(float)ad_val*5.0/256.0;
回复

使用道具 举报

板凳
ID:147531 发表于 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;

这里的确写错了,我改了,有数值返回了,但是调节电位器数值没有变化。。。
回复

使用道具 举报

地板
ID:147531 发表于 2016-11-19 17:26 | 只看该作者
回复

使用道具 举报

5#
ID:140371 发表于 2016-11-19 18:54 | 只看该作者
uchar get_ad() 函數 中..或許 rd之前需要加適當的延時 ....(需等待ADC轉換完成...在讀取DATA )

评分

参与人数 1黑币 +10 收起 理由
黑橙orangerx + 10 赞一个!

查看全部评分

回复

使用道具 举报

6#
ID:147531 发表于 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时的值
回复

使用道具 举报

7#
ID:147531 发表于 2016-11-20 14:39 | 只看该作者
回复

使用道具 举报

8#
ID:147531 发表于 2016-11-20 14:53 | 只看该作者
找到问题的所在了,127行的代码应为“ad_vo=get_ad();”

电子档上这行代码印错了
回复

使用道具 举报

9#
ID:292934 发表于 2018-3-16 21:31 | 只看该作者
问一下,他这个电位器是哪一个?
不知道为什么我的程序是对的,可是调节单片机上的所有电位器都不改变数值!
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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