十年专注单片机方案开发的方案公司英锐恩,分享基于QL200数字电压表的源程序。
英锐恩现提供服务产品涉及主控芯片:8位单片机、16位单片机、32位单片机及各类运算放大器等。
//////////////////////////////////////////////////
// Author : Toby
// Date : 2008/09/18
// Function : 用QL200来做数字电压表,用4个数码管来显示RA0的输入电压
// MCU : PIC16F877A
// C Compiler : PICC 8.05
// IDE : MPLAB IDE v8.10
/////////////////////////////////////////////////
#include
__CONFIG (0x3f3a); //烧写配置位
union adres //定义一个共用体,用于存放10位A/D转换的结果
{int y1;
unsigned char adre[2];
}adresult;
float ADSL=0;
unsigned char QC=0;
const char TABLE[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0X82,0XF8,0X80,0X90}; //定义常数0-9的数据表格
void initial(); //系统各I/O口初始化
void interrupt adint(void); //AD中断函数
void adinitial(); //AD初始化函数
void display(); //显示函数
void delay(); //延迟函数
main() //主程序
{
unsigned char a;
initial(); //调用I/O初始化函数
while(1)
{
adinitial(); //调用AD初始化函数
if(QC%5==0)
for(a=100;--a;) //连续显示一阵,使看来的数据不闪
{
display();
}
}
}
//系统各I/O口初始化子程序
void initial()
{
TRISA=0B00000001; //只有RA0为输入,其它都为输出
TRISD=0; //C口为输出
PORTD=0xff; //关闭所有显示
}
//A/D转化初始化子程序
void adinitial()
{
ADCS0=1; //使A/D转换时钟为8tosc
ADCS1=0;
CHS0=0; //选择RA0为AD的输入
CHS1=0;
CHS2=0;
ADGO=0; //不进行AD转换
ADON=1; //打开AD转换模块
ADFM=1; //转换结果右移,及ADRESH寄存器的高6位为"0"
PCFG3=1; //让RA0为AD的输入
PCFG2=1;
PCFG1=1;
PCFG0=0;
ADIE=1; //A/D转换中断允许
PEIE=1; //外围中断允许
GIE=1; //总中断允许
ADGO=1; //启动A/D转换
}
//中断服务程序
void interrupt adint(void)
{
QC++;
ADIF=0; //清除中断标志
}
//延时子程序
void delay() //延时程序
{
int i; //定义整形变量
for(i=100;i--;); //延时
}
void display()
{
int bai,shi,ge,qian,temp; //定义4个临时变量
adresult.adre[0]=ADRESL;
adresult.adre[1]=ADRESH; //读取并存储A/D转换结果,A/D转换的结果通过共
ADSL=adresult.y1; //用体的形式放入了变量y1中
temp=ADSL/209*1000; //10位AD=1024,我的电源电压为4.9V,所心1024/4.9=208.9=209
qian=temp/1000;
bai=temp%1000/100; //求显示的百位
shi=(temp%100)/10; //求显示的十位
ge=temp%10; //求显示的个位
PORTD=TABLE[qian]; //分钟十位显示
PORTA=0B1111011; //RA2输出低电平,点亮千位显示
delay();
PORTD=TABLE[bai]; //查表得百位显示的代码
PORTA=0x37; //RA3输出低电平,点亮百位显示
delay(); //延时一定时间,保证显示亮度
PORTD=TABLE[shi]; //查表得十位显示的代码
PORTA=0x2F; //RA4输出低电平,点亮十位显示
delay(); //延时一定时间,保证亮度
PORTD=TABLE[ge]; //求个位显示的代码
PORTA=0x1F; //RA5输出低电平,点亮个位显示
delay(); //延时一定时间,保证亮度
PORTD=0xff;
}
(文源网络,侵删)