查看:9261|回复:3
求助,新手入场,我用C语言编了个用12F675单片机模数转换的程
[复制链接]
void adinitial( )
{
TRISIO = 0x01; //设定GP0为输入,GP1/GP2/GP3为输出脚
ADCON0 = 0x83; //选择A/D通道为AN0,打开A/D转换器,在工作状态,且使AD转换时钟为专用CR
ANSEL = 0x31; //转换结果右移,及ADRESH寄存器的高6位为"0",且把AN0口设置为模拟量输入方式
ADIE = 1; //A/D转换中断允许
PEIE = 1; //外围中断允许
ADIE = 1; //打开AD中断
ADIF = 0; //清除A/D中断标志
}
# include< pic.h>
union adres//定义一个共用体,用于存放A/D转换的结果
{
int y1;
unsigned char adre[2];
}adresult;
unsigned char i;
unsigned int j;
unsigned char m;
//延时子程序
void delay()
{
for(j=5535;--j;) continue;
}
//过载子程序
void overload()
{
PORT5=m;
PORT3=adresult.y1;
}
//亮红灯子程序
void red()
{
i=i^0xFF; //通过异或方式每次把i的各位值取反
PORT4=i; //D口输出i的值
}
//亮绿灯子程序
void green()
{
i=i^0xFF; //通过异或方式每次把i的各位值取反
PORT6=i; //D口输出i的值
}
//数据传输子程序
void ad_data()
{
m=m^0xFFFF;
PORT5=m;
PORT3=adresult.y1;
}
//中断服务程序
void interrupt adint(void)
{
ADIF=0; //清除中断标志
adresult.adre[0]=ADRESL;
adresult.adre[1]=ADRESH; //读取并存储A/D转换结果,A/D转换的结果通过共
if(adresult.y1>1.9v)
{
overload(); //如果输入的模拟量大于1.9V(对应数字量???),则调用《过载overload》子程序
delay(); //调用延时子程序,使电压检测不要过于频繁
}
else if(1v<adresult.y1<=1.9v)
{
red(); //如果输入的模拟量大于1.0V小于等于1.9(对应数字量???),则调用《红灯亮red light》子程序
delay();
ad_data();
}
else if(0.2v<adresult.y1<=1.0v)
{
red();
green(); //如果输入的模拟量大于0.2V小于等于1.0(对应数字量???),则调用《红灯亮red light》《绿灯亮green》子程序
delay();
ad_data();
}
else
{
green(); //如果输入的模拟量小于0.2V,则调用《绿灯亮green》子程序
delay();
ad_data() ;
ADGO=1; //启动下一次A/D转换
}
main() //主程序
{
adinitial(); //A/D转换初始化
ei(); //总中断允许
while(1)
{
;
} //等待中断,在中断中循环检测外部电压
}
1、PIC12F675的供电电压为3.0V,并以此为ADC基准。
2、ADC信号为外部测量入口,最高电压1.999V。
3、读ADC信号电压,驱动HT1621再驱动LCD显示出当前电压值,ADC检测周期为100-500ms可调,后续根据需要再更改。
4、当电压超过1.999V时,LCD最前面一位显示“1”,表示溢出量程。
5、LED驱动: 当ADC值在0.2V以下时,亮绿灯
当ADC值在0.2V-1V时,亮绿灯和红灯
当ADC值在1.0V以上时,亮红灯
以上LED的这三个值,后续会随时更改,需要在源码中易查易改的。
6、LCD显示屏中其它部分笔划目前不需要,但是HT1621的驱动中需要增加上去。
{
TRISIO = 0x01; //设定GP0为输入,GP1/GP2/GP3为输出脚
ADCON0 = 0x83; //选择A/D通道为AN0,打开A/D转换器,在工作状态,且使AD转换时钟为专用CR
ANSEL = 0x31; //转换结果右移,及ADRESH寄存器的高6位为"0",且把AN0口设置为模拟量输入方式
ADIE = 1; //A/D转换中断允许
PEIE = 1; //外围中断允许
ADIE = 1; //打开AD中断
ADIF = 0; //清除A/D中断标志
}
# include< pic.h>
union adres//定义一个共用体,用于存放A/D转换的结果
{
int y1;
unsigned char adre[2];
}adresult;
unsigned char i;
unsigned int j;
unsigned char m;
//延时子程序
void delay()
{
for(j=5535;--j;) continue;
}
//过载子程序
void overload()
{
PORT5=m;
PORT3=adresult.y1;
}
//亮红灯子程序
void red()
{
i=i^0xFF; //通过异或方式每次把i的各位值取反
PORT4=i; //D口输出i的值
}
//亮绿灯子程序
void green()
{
i=i^0xFF; //通过异或方式每次把i的各位值取反
PORT6=i; //D口输出i的值
}
//数据传输子程序
void ad_data()
{
m=m^0xFFFF;
PORT5=m;
PORT3=adresult.y1;
}
//中断服务程序
void interrupt adint(void)
{
ADIF=0; //清除中断标志
adresult.adre[0]=ADRESL;
adresult.adre[1]=ADRESH; //读取并存储A/D转换结果,A/D转换的结果通过共
if(adresult.y1>1.9v)
{
overload(); //如果输入的模拟量大于1.9V(对应数字量???),则调用《过载overload》子程序
delay(); //调用延时子程序,使电压检测不要过于频繁
}
else if(1v<adresult.y1<=1.9v)
{
red(); //如果输入的模拟量大于1.0V小于等于1.9(对应数字量???),则调用《红灯亮red light》子程序
delay();
ad_data();
}
else if(0.2v<adresult.y1<=1.0v)
{
red();
green(); //如果输入的模拟量大于0.2V小于等于1.0(对应数字量???),则调用《红灯亮red light》《绿灯亮green》子程序
delay();
ad_data();
}
else
{
green(); //如果输入的模拟量小于0.2V,则调用《绿灯亮green》子程序
delay();
ad_data() ;
ADGO=1; //启动下一次A/D转换
}
main() //主程序
{
adinitial(); //A/D转换初始化
ei(); //总中断允许
while(1)
{
;
} //等待中断,在中断中循环检测外部电压
}
1、PIC12F675的供电电压为3.0V,并以此为ADC基准。
2、ADC信号为外部测量入口,最高电压1.999V。
3、读ADC信号电压,驱动HT1621再驱动LCD显示出当前电压值,ADC检测周期为100-500ms可调,后续根据需要再更改。
4、当电压超过1.999V时,LCD最前面一位显示“1”,表示溢出量程。
5、LED驱动: 当ADC值在0.2V以下时,亮绿灯
当ADC值在0.2V-1V时,亮绿灯和红灯
当ADC值在1.0V以上时,亮红灯
以上LED的这三个值,后续会随时更改,需要在源码中易查易改的。
6、LCD显示屏中其它部分笔划目前不需要,但是HT1621的驱动中需要增加上去。
评分
手机版|家电维修技术论坛( 鄂ICP备09003585号-2)
GMT+8, 2024-6-17 22:08, Processed in 0.061234 second(s), 8 queries , Gzip On, MemCache On.