历史上的今天
今天是:2025年02月06日(星期四)
2020年02月06日 | PIC单片机的内部A/D转换
2020-02-06 来源:eefocus
//需求,将板子上电位器接RA0,设置PIC的AD相关寄存器,显示电压
#include __CONFIG(0x3831);//配置位18323831 #define uint unsigned int #define uchar unsigned char //共阴数码管(板子上用了达林顿管ULN2003,反向器) const unsigned char table[]={0x3f,0x6,0x5b,0x4f,0x66,0x6d,0x7d,0x7,0x7f,0x6f}; //加小数点的共阴数码管显示,非常不错 const uchar table1[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd, 0x87,0xff,0xef}; void init();//数码管,和AD相关寄存器设置 uint get_ad();//获取电压值,其中包括AD读取,及AD值转电压值的处理,返回值为uint型,精度保留小数点后3位 void delay_ms(int z); void disp(uchar num1,uchar num2,uchar num3,uchar num4);//数码管动态扫描 void main() { uint lednum;// uchar num1,num2,num3,num4;//高两位接RA1和RA0用不到了 init(); while(1) { lednum=get_ad(); num1=lednum/1000;//求模即取整 num2=lednum/100%10; num3=lednum/10%10; num4=lednum%10; disp(num1,num2,num3,num4); } } void init()//数码管,和AD相关寄存器设置 { TRISA=0x01;//RA0设置为输入,用于AD模拟信号输入 TRISD=0;//接数码管段选IO设置为输出 PORTA=0; PORTD=0; ADCON0=0x41;//选择8分频(4M/8=0.5MHz)时钟频率即8倍时钟周期,开AD ADCON1=0x8E;//选择结果右对齐,ADRESH高6位读作0,选择A通道以电源VDD VSS作参考电压 delay_ms(10);//延时等待AD稳定 } //获取电位器电压,PIC内部AD uint get_ad()//一般做工程的时候带个通道参数,读取几通道直接带通道数就可以 { //实际中要进行数字滤波(如20个数取平均值,然后将其返回去,滤波算法有很多,平均值是一种而已) uint adval;//存放AD的值 float advalf;//存放AD值转换为的电压值 ADGO=1;//开始转换,ADGO与GODONE宏定义一致 while(ADGO);//AD转换完,硬件自动清零ADGO adval=ADRESH;//先读AD高8位寄存器的低二位 adval=adval<<8|ADRESL; advalf=adval/1023.0*5.0;//1023为电位器显示的最大值,假设板子电压为5v时 adval=advalf*1000;//精度取小数点后三位,如4.2356,则读为4.235 return(adval); } void disp(uchar num1,uchar num2,uchar num3,uchar num4)//数码管动态显示 { PORTD=table1[num1]; PORTA=0x20;//0010 0000 delay_ms(2); PORTD=table[num2]; PORTA=0x10;//0001 0000 delay_ms(2); PORTD=table[num3]; PORTA=0x08;//0000 1000 delay_ms(2); PORTD=table[num4]; PORTA=0x04;//0000 0100 delay_ms(2); } void delay_ms(int z) { int x,y; for(x=z;x>0;x--) for(y=110;y>0;y--); }
下一篇:PIC单片机的应用技巧介绍
史海拾趣
|
我用的是nboot+eboot启动,下面是输信息。请高手指点一下。 \\par Mini(4k) NandBoot V2.0. [2007-09-28] \\par \\par \\par NAND Boot Start \\par NAND Boot End \\par Boot time=nTCNT*82uS. nTCNT=0x052f. \\par I/O Strength Max \ ...… 查看全部问答> |
|
在CE上Bluetooth设置PIN问题 我用的SDK是STANDARDSDK_500,可是这SDK里没有Btdrt.lib,因此找了个Btdrt.lib 但是在使用BthGetPINRequest()、BthSetPIN()函数还是不能用 可能是手动加入的Btdrt.lib关连到其它的LIB,这要如何解决? 或者谁做的,你 ...… 查看全部问答> |
|
wince6.0 是否支持SHLoadImageResource? 请各位帮帮忙看看! 我在windows moible 5.0 上使用SHLoadImageResource是可以的 而在wince6.0上 却找不到SHLoadImageResource 是不是wince6.0 不支持 SHLoadImageResource? … 查看全部问答> |
|
#include <stdio.h> void main() { int x=3,y; y=––x+––x+x++; printf(\"x=%d y=%d\\n\",x,y); } x=2,y=3 不懂 ??????? &n ...… 查看全部问答> |
|
我在Altera的FPGA里用了一个PLL,希望产生一个相位差为180度的时钟,就是和原来的时钟反向,但发现出来的时钟和原时钟相位不是我期望的180度。那位知道该怎么办呢 ?谢谢… 查看全部问答> |
|
BIN优点,下载时二进制传输效率高,一个起始地址和长度(均可事先知道)搞定.因起始地址和长度在 下载一开始就可以知道,所以只需要擦除实际代码大小的FLASH,避免大FLASH空间小代码时擦除FLASH的时间和FLASH损耗. 缺点:当代码分段在不同地址时,如 ...… 查看全部问答> |




