技术热线: 4007-888-234

基于QL200数字电压表的源程序

更新时间: 2019-03-23
阅读量:2135

十年专注单片机方案开发的方案公司英锐恩,分享基于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;
   }

 

(文源网络,侵删)