完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
求指导:昨天写了一个STC15W408AS 片内ADC的应用,但是检测出来的电压一直是0V,检测电压是来自于单片机的供电电源 前面加了L7805CV 模块,电源很稳定。请各位帮忙看看是不是程序出了问题!谢谢
#include #include #define uint unsigned int #define uchar unsigned char uint adc_datah,adc_datal; uint adc_data; uchar aa,bb,cc; uchar code dsp_duan[]={0xfc,0x60,0xda,0xf2,0x66,0xb6,0x3e,0xe0,0xfe,0xf6}; uchar code dsp_dian[]={0xfd,0x61,0xde,0xf3,0x67,0xb7,0xbf,0xe1,0xff,0xfd}; ***it du=P1^1; ***it we=P1^0; void delay1ms() //@11.0592MHz { unsigned char i, j; _nop_(); _nop_(); _nop_(); i = 11; j = 190; do { while (--j); } while (--i); } //_____________________________________ void display() { du=1; P3=dsp_dian[aa]; du=0; P3=0xff; we=1; P3=0X7f; //For table[8]; we=0; delay1ms(); du=1; P3=dsp_duan[bb]; du=0; P3=0xff; we=1; P3=0XBF; we=0; delay1ms(); du=1; P3=dsp_duan[cc]; du=0; P3=0xff; we=1; P3=0X1F; we=0; delay1ms(); delay1ms(); } void main() { uint i; // uchar status; P1ASF=0X80; ADC_CONTR=0X80; for(i=0;i<10000;i++); CLK_DIV|=0X20; ADC_CONTR=0X88; EADC=1; EA=1; while(1) { aa=adc_data/1000; bb=adc_data/100%10; cc=adc_data%100/10; display(); } } void adc_int() interrupt 5 { ADC_CONTR=0X80; adc_datah=ADC_RES&0X03; adc_datal=ADC_RESL; adc_data=adc_datah<<8+adc_datal; adc_data=adc_data*5/1023; ADC_CONTR=0x8f; } |
|
相关推荐
8个回答
|
|
uint i;
// uchar status; P1ASF=0X80;这里你使用P1.7作为ADC输入 ADC_CONTR=0X80; for(i=0;i<10000;i++); CLK_DIV|=0X20; ADC_CONTR=0X88;这里你开启的通道是通道0,即P1.0 你使用P1.7作ADC输入,但是开启ADC的时候没有启用通道7 |
|
|
|
谢谢你指导,但是还是不行,出来还是没有检测到电压
我修改成是ADC_CONTR=0X8F;这样通道就是P1.7了, 我想问下兄弟你,这个开始转换的时候 在配置ADC_CONTR寄存器的时候,是不是先要配置通道,然后再配置一次ADC_CONTR寄存器,开始转换呢? 如果一次写ADC_CONTR=0X8F相当于是 打开通道,然后又开始转换,这个应该没有关系吧 |
|
|
|
没关系,你可以每次转换结束之后都把ADC电源关掉。你是数码管显示一直是0还是ADC寄存器的值是0。建议你把ADC寄存器的值读取出来通过串口输到电脑显示以判断究竟是ADC问题还是自己在数据处理的时候出现问题
|
|
|
|
是数码管一直显示的是0,数码管程序是没有问题的,因为我一直用这个数码管做其他用,数码管的编码也是自己写的,没有问题,你看程序其他地方还有问题吗?
还想请教你一下adc_data=adc_data*5/1023; 假如这个Aadc_data 的值是1111111111 二级制那么十进制就是1023 假如1023*5/1023=5 这个时候是5,但是上面 aa=adc_data/1000; bb=adc_data/100%10; cc=adc_data%100/10; 这个地方有做了计算,aa=adc_data/1000 =5/1000=0.005 最终结果显示是0.005V吗 |
|
|
|
adc_data是整形,adc_data/1000表示adc_data对1000取整,结果是0.所以最好用float表示
|
|
|
|
这样你应该把adc_data乘1000
|
|
|
|
乘以1000也没有用吧。如果给定义data的变量是一个uint型的话,好像在换算的时候只会取整吧,这样就没有后面的数了,只能显示一位!
但是如果采用的是float 型变量的时候,程序编译会出错! |
|
|
|
float 变量,用 “/”编译没问题,是求商。用“%”才会报错
|
|
|
|
只有小组成员才能发言,加入小组>>
2998 浏览 9 评论
2712 浏览 16 评论
3230 浏览 1 评论
8488 浏览 16 评论
3795 浏览 18 评论
9396浏览 3评论
641浏览 3评论
10597浏览 2评论
335浏览 2评论
const uint16_t Tab[10]={0}; const uint16_t *p; p = Tab;//报错是怎么回事?
336浏览 2评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-5-13 18:41 , Processed in 1.013984 second(s), Total 94, Slave 75 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号