📄 ad.c
字号:
/**********************AD转换的实验**************************/
/*说明:用RA3脚来采样室内温度对应的端口,当室内温度对应 */
/* 的电阻值大于5.1K(分得的电压高于2.5V)的时候进入中断*/
/* 并报警,低于2.5V时退出中断服务程序并正常进行A/D采样,*/
/* 正常采样时亮首尾两盏等,报警时亮三盏灯。 */
/************************************************************/
#include "pic1687x.h"
#include "pic.h"
union adres
{
int y1;
unsigned char adre[2];
}adresult; //定义一个共用体,用于存放A/D转换的结果
unsigned char i,j;
/*系统各I/O初始化子程序*/
void initial()
{
//TRISD=0X00; //E端口为输出
TRISB=0X00;
i=0X00;
}
/*A/D转换初始化子程序*/
void adinitial()
{
ADCON0=0X59; //选择A/D通道为RA3,打开A/D转换器
//在工作状态,且使A/D转换时钟为8Tosc
ADCON1=0X80; //转换结果右移,即ADRESH寄存器的高六位为零
//且把RA3口设置为模拟量输入方式
PIE1=0X00;
PIE2=0X00;
ADIE=1; //A/D转换中断允许
PEIE=1; //外围中断允许
TRISA3=1; //设置R3为输入方式
//PORTD=0X00; //置4051的S0,S1,S2脚,选择室内温度作为采样对象
}
/*延时子程序*/
void delay()
{
for (j=255;--j;)
continue;
}
/*报警子程序*/
void alarm()
{
i=i^0X00; //取反,用于显示LED
PORTB=i; //E口输出i的值
}
/*中断服务程序*/
void interrupt adint(void)
{ asm("clrwdt"); //清除看门狗
ADIF=0; //清除中断标志
adresult.adre[0]=ADRESL;
adresult.adre[1]=ADRESH; //读取并存储A/D转换的结果,A/D转换的结果
//用共用体的形式放入了变量y1中
if(adresult.y1>0X200)
{
alarm(); //如果输入量大于2.5V(对应的数子量为0X200,则
//调用报警子程序
delay(); //延时程序,使电压检测不要过于频繁
}
else
PORTB=0X01; //如果输入的模拟量小于2.5V,则四盏灯亮,表示
//系统正常
ADGO=1; //启动下一次A/D转换
}
/*主程序*/
main()
{
adinitial(); //A/D初始化
initial(); //系统各I/O口初始化
ei(); //总中断允许
ADGO=1; //启动A/D转换
while(1)
{
; //等待中断,在中断中循环检测外部电压
}
}
/******************************END*******************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -