打印

PIC16F877单片机AD取值程序请指教

[复制链接]
3248|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
冰封的眼泪|  楼主 | 2011-5-23 22:11 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 冰封的眼泪 于 2011-5-23 22:14 编辑

这是我写的AD取值的程序,但是取值不正确。并且在执行 b=a/1023.0*5.0;这条语句时特别的慢。请教各位这是怎么回事?谢谢帮忙。

#include<pic.h>
#define uint unsigned int
void init();
uint AD_get();
void main()
{
  uint AD;
  init();
  AD=AD_get();
}
void init()
{
    ADCON0=0x41;//01000001
  ADCON1=0x8e;//10001110
  }
uint AD_get()
{
  uint a;
float b;
  ADGO=1;
while(ADGO);
a=ADRESH;
a<<=8;
a|=ADRESL;
b=a/1023.0*5.0;
return b;
}
沙发
梅开二度| | 2011-5-23 23:42 | 只看该作者
1、b=a/1023.0*5.0;不建议这样写;
建议分两步:b=5*a;b=b/1023
2、b=a/1023不如替换为a/1024,效率会高很多;

使用特权

评论回复
板凳
梅开二度| | 2011-5-23 23:46 | 只看该作者
程序问题太多,定义的AD是unsigned int,函数返回值是float;
没有看到你的模拟输入口得配置;
建议参考microchip的example程序查找原因;

使用特权

评论回复
地板
冰封的眼泪|  楼主 | 2011-5-24 09:55 | 只看该作者
谢谢您,你看我还有别的错误吗?谢谢。

使用特权

评论回复
5
yewuyi| | 2011-5-24 11:10 | 只看该作者
你应该先去把C语言的基础知识和芯片的DATASHEET看懂再动手,否则一团糟糕。

#include<pic.h>
#define uint unsigned int
void init();
uint AD_get();
void main()
{
  uint AD;//uint定义过了吗?
  init();
  AD=AD_get();
}
void init()//AD的转换频率等都是有限制的,你确定把该型号这部分的DATASHEET看懂了吗?
{
    ADCON0=0x41;//01000001
  ADCON1=0x8e;//10001110
  }
uint AD_get()//uint无定义!!!
{
  uint a;
float b;//为什么要用浮点?
  ADGO=1;
while(ADGO);
a=ADRESH;
a<<=8;
a|=ADRESL;
b=a/1023.0*5.0;//1023.0就是一个整数1023,为什么要用浮点,而且你应该先算乘法,再算除法
return b;//返回不当
}
//在main中,AD的转换如果不断执行初始化,初始化延迟一段时间再转换才比较稳当,修改循环结构,初始化执行一次即可

使用特权

评论回复
6
冰封的眼泪|  楼主 | 2011-5-24 16:43 | 只看该作者
哦,知道了。谢谢您。我修改一下试一下。看能得到我想要的结果吗?谢谢您

使用特权

评论回复
7
冰封的眼泪|  楼主 | 2011-5-24 17:26 | 只看该作者
我现在碰到一个极端的问题,就是进行AD数值转换时,这两条语句:b=a*5; b=b/1024;   在进行仿真时根本运行不过去。希望高手指点一二。

使用特权

评论回复
8
Light_David| | 2011-5-25 01:29 | 只看该作者
妈呀,用AD还没用过浮点呢,LZ太强了,。

使用特权

评论回复
9
冰封的眼泪|  楼主 | 2011-5-25 11:02 | 只看该作者
因为我对硬件进行了设置后,我们采取的电压在1V左右,采到1V是准确的,但肯定会有误差。所以需要用浮点型。但是这两条语句:b=a*5; b=b/1024;   在进行仿真时根本运行不过去。我不明白是怎么回事》希望有人真的可以帮到我。谢谢!

使用特权

评论回复
10
yewuyi| | 2011-5-25 11:18 | 只看该作者
因为我对硬件进行了设置后,我们采取的电压在1V左右,采到1V是准确的,但肯定会有误差。所以需要用浮点型。但是这两条语句:b=a*5; b=b/1024;   在进行仿真时根本运行不过去。我不明白是怎么回事》希望有人真的可以 ...
冰封的眼泪 发表于 2011-5-25 11:02



什么叫有人真的可以帮到你?
不会吃饭等别人喂饭就叫真的帮到你!?

无语。。。

这个世界没有救世主,最终还是要靠自己才能救自己。。。

请确保a,b等的类型定义是符合运算规则的!
你现在的问题是基础的C语言都没学好,你首先需要的是去多买几本C语言的书好好学习去。
如果你是做毕业设计,你就多问问你的老师。
如果你是在企业做项目,那最好先停下来,先去弄清楚基本知识吧

使用特权

评论回复
11
joeyfanDT| | 2016-5-2 21:43 | 只看该作者
你好 我正在学PIC 这个AD转换 这个程序的 b=a/1023.0*5.0 是什么意思呀 我不懂

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

5

帖子

1

粉丝