📄 ad.c
字号:
/*流程:
1. 配置A/D 模块:
? 配置模拟/ 数字I/O (通过ANSEL 寄存器)
? 配置参考电压(通过ADCON0 寄存器)
? 选择A/D 输入通道(通过ADCON0 寄存器)
? 选择A/D 转换时钟(通过ADCON1 寄存器)
? 使能A/D 模块(通过ADCON0 寄存器)
2. 需要时,配置A/D 中断:
3. 等待所需的采集时间。
4. 启动转换: 将GO/DONE 位(ADCON0<1>)置1
5. 等待A/D 转换完成 查询GO/DONE 位是否被清零(禁止中断);
6. 读取一对A/D结果寄存器(ADRESH:ADRESL),
7. 如需再次进行A/D 转换,根据需要返回步骤1 或
步骤2。将每位的A/D 转换时间定义为TAD,在
下一次采集开始前至少需要等待2 个TAD。
*/
#include <pic.h>
union adres
{
int y1;
unsigned char adre[2];
}adresult; //定义一个共用体,用于存放A/D转换的结果
unsigned char AD_Flag=0;
unsigned char AD_Delay_count=0;
int sampletime;
int idlenop;
int flag;
#define ad_finish ADCON0&&0b00000010
//系统各I/O口初始化子程序
void initial()
{
TRISB=0x00;
PORTB=0X00;
}
//A/D转化初始化子程序
void ad_init()
{
TRISA0=1; //设置RA0为输入方式
ANS0=1; //RCS
ADCON0 = 0x01; //OPEN AD CHANGE 左对齐,参考电压Vcc 使能 Ad
ADCON1=0b01100000; //转换结果右移,及ADRESH寄存器的高6位为"0" 最高采样频率 fosc/64
ADIE=0; //inhabit A/D转换中断允许
ADIF=0;
}
void Deal_AD()
{
adresult.adre[0]=ADRESL;
adresult.adre[1]=ADRESH; //读取并存储A/D转换结果,A/D转换的结果通过共
//用体的形式放入了变量y1中
// if(adresult.y1>0x90)
PORTB=ADRESL;
}
void main()
{
di();
ad_init();
ei();
for(sampletime=0;sampletime<=100;sampletime++)
{
idlenop=0;
}
while(1)
{
ADCON0=ADCON0|0X02; //start AD conversion
while(GODONE==1);
Deal_AD();
for(sampletime=0;sampletime<=1000;sampletime++)
{
idlenop=0;
}
ADCON0=ADCON0|0X02;//间隔一定时间启动AD采样,间隔时间是不使AD采样过于频繁
}
CMCON0=0x07; //关闭比较器
ANSEL=0x0; //选择porta为数字IO口
TRISA0=0;
RA0=0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -