專注差異化嵌入式產(chǎn)品解決方案 給智能產(chǎn)品定制注入靈魂給予生命
提供開(kāi)發(fā)工具、應(yīng)用測(cè)試 完善的開(kāi)發(fā)代碼案例庫(kù)分享
從全面的產(chǎn)品導(dǎo)入到強(qiáng)大技術(shù)支援服務(wù) 全程貼心伴隨服務(wù),創(chuàng)造無(wú)限潛能!
提供新的芯片及解決方案,提升客戶產(chǎn)品競(jìng)爭(zhēng)力
提供最新的單片機(jī)資訊,行業(yè)消息以及公司新聞動(dòng)態(tài)
十年專注單片機(jī)方案開(kāi)發(fā)的方案公司英銳恩,分享基于QL200數(shù)字電壓表的源程序。
英銳恩現(xiàn)提供服務(wù)產(chǎn)品涉及主控芯片:8位單片機(jī)、16位單片機(jī)、32位單片機(jī)及各類運(yùn)算放大器等。
//////////////////////////////////////////////////
// Author : Toby
// Date : 2008/09/18
// Function : 用QL200來(lái)做數(shù)字電壓表,用4個(gè)數(shù)碼管來(lái)顯示RA0的輸入電壓
// MCU : PIC16F877A
// C Compiler : PICC 8.05
// IDE : MPLAB IDE v8.10
/////////////////////////////////////////////////
#include
__CONFIG (0x3f3a); //燒寫(xiě)配置位
union adres //定義一個(gè)共用體,用于存放10位A/D轉(zhuǎn)換的結(jié)果
{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}; //定義常數(shù)0-9的數(shù)據(jù)表格
void initial(); //系統(tǒng)各I/O口初始化
void interrupt adint(void); //AD中斷函數(shù)
void adinitial(); //AD初始化函數(shù)
void display(); //顯示函數(shù)
void delay(); //延遲函數(shù)
main() //主程序
{
unsigned char a;
initial(); //調(diào)用I/O初始化函數(shù)
while(1)
{
adinitial(); //調(diào)用AD初始化函數(shù)
if(QC%5==0)
for(a=100;--a;) //連續(xù)顯示一陣,使看來(lái)的數(shù)據(jù)不閃
{
display();
}
}
}
//系統(tǒng)各I/O口初始化子程序
void initial()
{
TRISA=0B00000001; //只有RA0為輸入,其它都為輸出
TRISD=0; //C口為輸出
PORTD=0xff; //關(guān)閉所有顯示
}
//A/D轉(zhuǎn)化初始化子程序
void adinitial()
{
ADCS0=1; //使A/D轉(zhuǎn)換時(shí)鐘為8tosc
ADCS1=0;
CHS0=0; //選擇RA0為AD的輸入
CHS1=0;
CHS2=0;
ADGO=0; //不進(jìn)行AD轉(zhuǎn)換
ADON=1; //打開(kāi)AD轉(zhuǎn)換模塊
ADFM=1; //轉(zhuǎn)換結(jié)果右移,及ADRESH寄存器的高6位為"0"
PCFG3=1; //讓RA0為AD的輸入
PCFG2=1;
PCFG1=1;
PCFG0=0;
ADIE=1; //A/D轉(zhuǎn)換中斷允許
PEIE=1; //外圍中斷允許
GIE=1; //總中斷允許
ADGO=1; //啟動(dòng)A/D轉(zhuǎn)換
}
//中斷服務(wù)程序
void interrupt adint(void)
{
QC++;
ADIF=0; //清除中斷標(biāo)志
}
//延時(shí)子程序
void delay() //延時(shí)程序
{
int i; //定義整形變量
for(i=100;i--;); //延時(shí)
}
void display()
{
int bai,shi,ge,qian,temp; //定義4個(gè)臨時(shí)變量
adresult.adre[0]=ADRESL;
adresult.adre[1]=ADRESH; //讀取并存儲(chǔ)A/D轉(zhuǎn)換結(jié)果,A/D轉(zhuǎn)換的結(jié)果通過(guò)共
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; //求顯示的個(gè)位
PORTD=TABLE[qian]; //分鐘十位顯示
PORTA=0B1111011; //RA2輸出低電平,點(diǎn)亮千位顯示
delay();
PORTD=TABLE[bai]; //查表得百位顯示的代碼
PORTA=0x37; //RA3輸出低電平,點(diǎn)亮百位顯示
delay(); //延時(shí)一定時(shí)間,保證顯示亮度
PORTD=TABLE[shi]; //查表得十位顯示的代碼
PORTA=0x2F; //RA4輸出低電平,點(diǎn)亮十位顯示
delay(); //延時(shí)一定時(shí)間,保證亮度
PORTD=TABLE[ge]; //求個(gè)位顯示的代碼
PORTA=0x1F; //RA5輸出低電平,點(diǎn)亮個(gè)位顯示
delay(); //延時(shí)一定時(shí)間,保證亮度
PORTD=0xff;
}
(文源網(wǎng)絡(luò),侵刪)