十年專注單片機方案開發的方案公司英銳恩,分享基于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;
}
(文源網絡,侵刪)