|
基于PIC16F873A的照度測(cè)量C語(yǔ)言代碼。
可以使用Labview以RS232接口和PC通信,并獲取實(shí)時(shí)數(shù)據(jù)
單片機(jī)源程序如下:
- #include <pic.h> //調(diào)用PIC16F87XA單片機(jī)的頭文件
- __CONFIG(HS&WDTDIS&LVPDIS);
- #define U5A RC0 //4位數(shù)碼管單元的U5(74HC138)的A腳接在RB0口上
- #define U5B RC1 //4位數(shù)碼管單元的U5(74HC138)的B腳接在RB1口上
- #define U5C RC2 //4位數(shù)碼管單元的U5(74HC138)的C腳接在RB2口上
- unsigned char temp1;
- unsigned char temp2;
- const unsigned char LED[28]=
- {
- 0x3F,/*0*/
- 0x06,/*1*/
- 0x5B,/*2*/
- 0x4F,/*3*/
- 0x66,/*4*/
- 0x6D,/*5*/
- 0x7D,/*6*/
- 0x07,/*7*/
- 0x7F,/*8*/
- 0x6F,/*9*/
- 0x77,/*A*/
- 0x7C,/*b*/
- 0x39,/*C*/
- 0x58,/*c*/
- 0x5E,/*d*/
- 0x79,/*E*/
- 0x71,/*F*/
- 0x76,/*H*/
- 0x74,/*h*/
- 0x38,/*L*/
- 0x54,/*n*/
- 0x37,/*N*/
- 0x5C,/*o*/
- 0x73,/*P*/
- 0x50,/*r*/
- 0x78,/*t*/
- 0x3E,/*U*/
- 0x40,/*-*/
- };
- //---------------------------------------
- //A/D轉(zhuǎn)換用寄存器設(shè)置
- unsigned int ADbuf; //設(shè)置16位的unsigend int型寄存器用來(lái)暫存轉(zhuǎn)換結(jié)果
- unsigned int adcbuf[16];
- void main(void) //主函數(shù),單片機(jī)開(kāi)機(jī)后就是從這個(gè)函數(shù)開(kāi)始運(yùn)行
- {
- unsigned char buf;
- unsigned char USARTbuf;
- unsigned char c=0; //定義一個(gè)char型變量,做延時(shí)用
- unsigned char e=0; //定義一個(gè)char型變量,做延時(shí)用
- unsigned char i;
- unsigned char b;
- unsigned char d=0; //定義一個(gè)char型變量,控制顯示位置
- TRISA=0B11111111; //初始化RA5-RA0的輸出方向
- TRISC=0B11111000; //RB0-3設(shè)置為輸出
- TRISB=0B00000000; //RD設(shè)置為輸出
- PORTA=0B00000000; //初始化RA5-RA0數(shù)值
- PORTB=0B00000000; //初始化RB7-RB0的數(shù)值
- PORTB=0B00000000; //初始化RD7-RD0的數(shù)值
- //****A/D模塊初始化****
- //ADCON1=0B10001110; //RA0為A/D輸入口;ADFM=1,轉(zhuǎn)換后數(shù)據(jù)右移,ADRESL為低8位數(shù)據(jù)
- ADCON1=0B10001111; //RA0為A/D輸入口;ADFM=1,轉(zhuǎn)換后數(shù)據(jù)右移,ADRESL為低8位數(shù)據(jù)
- //設(shè)置RA2=Vref-(GND),RA3=Vref+
- /*
- 詳細(xì)分析該設(shè)置:
- ADFM=1,結(jié)果右移,ADRESH寄存器的高六位讀作“0”
- bit6~4未用,以0設(shè)置
- bit3~0 RA0作為模擬信號(hào)輸入端,其余引腳(RA1~7)都是數(shù)字信號(hào)輸入端
- */
- ADIE=0; //禁止A/D中斷
- //*********************
- //*****USART串口初始化*****
- SPBRG=25; //設(shè)置波特率為9600,誤差0.16%
- BRGH=1; //設(shè)置高速波特率
- SYNC=0; //SYNC=0為異步模式,SYNC=1為同步模式
- SPEN=1; //允許串口操作
- CREN=1; //CREN=0禁止連續(xù)接收,CREN=1允許連續(xù)接收
- TXIE=0; //禁止發(fā)送中斷
- RCIE=0; //禁止接收中斷
- TX9=0; //TX9=0為8位發(fā)送,TX9=1為9位發(fā)送
- RX9=0; //RX9=0為8位接收,RX9=1為9位接收
- TXEN=1; //TXEN=0為禁止發(fā)送,TXEN=1為允許發(fā)送
-
- while(1) //死循環(huán),單片機(jī)初始化后,將一直運(yùn)行這1個(gè)死循環(huán)
- {
- for(i=0;i<16;i++) //連續(xù)采樣16次,然后取平均數(shù)
- {
- //***啟動(dòng)一次A/D轉(zhuǎn)換***
- ADCON0=0B00000001; //選擇AN0通道準(zhǔn)備進(jìn)行A/D轉(zhuǎn)換,啟動(dòng)A/D模塊
- /*
- 詳細(xì)分析該設(shè)置:
- ADCS1:ADCS0=00,fosc/2;4MHz/2=2MHz?
- CHS2:CHS0=000,選擇模擬通道RA0
- GO/DONE=0,未進(jìn)行A/D轉(zhuǎn)換,A/D轉(zhuǎn)換完成后該位自動(dòng)清零
- bit1=0,該位未用
- ADON=1,打開(kāi)A/D轉(zhuǎn)換器的工作狀態(tài)
- */
- asm("NOP"); //略做延時(shí)
- asm("NOP"); //略做延時(shí)
- asm("NOP"); //略做延時(shí)
- asm("NOP"); //略做延時(shí)
- ADGO=1; //開(kāi)始進(jìn)行A/D轉(zhuǎn)換
- while(ADGO) continue; //等待A/D轉(zhuǎn)換結(jié)束
- adcbuf[i]=ADRESH*256+ADRESL;
-
- //*********************
- }
- ADbuf=0;
- for(i=0;i<16;i++)
- {
- ADbuf+=adcbuf[i]; //把連續(xù)轉(zhuǎn)換了16次的AD值加在一起
- }
- ADbuf=ADbuf/16; //除以16,算16次采樣的平均值
-
- ADbuf=(int)(((float)ADbuf/1023)*1000); //將0-1023換算成電壓值000-1000
- temp1=ADbuf/100;
- temp2=ADbuf%100;
- if(ADbuf<999)
- {
- PORTB=0; //關(guān)一次顯示,以免顯示出鬼影
- if(++d>3) d=0; //先將d加1,然后判斷是否大于3,大于3歸零
- if(d==0) //如果d=0,顯示千位
- {
- U5A=0; //U5A=0,U5B=0,U5C=0,選通數(shù)碼管的千位進(jìn)行顯示
- U5B=0; //U5A=0,U5B=0,U5C=0,選通數(shù)碼管的千位進(jìn)行顯示
- U5C=0; //U5A=0,U5B=0,U5C=0,選通數(shù)碼管的千位進(jìn)行顯示
- PORTB=LED[(ADbuf%10000)/1000]; //將要顯示的f的千位提取出來(lái)查表后送顯示
- }
- else if(d==1) //如果d=1,顯示百位
- {
- U5A=1; //U5A=1,U5B=0,U5C=0,選通數(shù)碼管的百位進(jìn)行顯示
- U5B=0; //U5A=1,U5B=0,U5C=0,選通數(shù)碼管的百位進(jìn)行顯示
- U5C=0; //U5A=1,U5B=0,U5C=0,選通數(shù)碼管的百位進(jìn)行顯示
- PORTB=LED[(ADbuf%1000)/100]; //將要顯示的f的百位提取出來(lái)查表后送顯示
- }
- else if(d==2) //如果d=2,顯示十位
- {
- U5A=0; //U5A=0,U5B=1,U5C=0,選通數(shù)碼管的十位進(jìn)行顯示
- U5B=1; //U5A=0,U5B=1,U5C=0,選通數(shù)碼管的十位進(jìn)行顯示
- U5C=0; //U5A=0,U5B=1,U5C=0,選通數(shù)碼管的十位進(jìn)行顯示
- PORTB=LED[(ADbuf%100)/10]; //將要顯示的f的十位提取出來(lái)查表后送顯示
- }
- else if(d==3) //如果d=3,顯示個(gè)位
- {
- U5A=1; //U5A=1,U5B=1,U5C=0,選通數(shù)碼管的個(gè)位進(jìn)行顯示
- U5B=1; //U5A=1,U5B=1,U5C=0,選通數(shù)碼管的個(gè)位進(jìn)行顯示
- U5C=0; //U5A=1,U5B=1,U5C=0,選通數(shù)碼管的個(gè)位進(jìn)行顯示
- PORTB=LED[ADbuf%10]; //將要顯示的f的個(gè)位提取出來(lái)查表后送顯示
- }
- }
- if(ADbuf>999)
- {
- PORTB=0; //關(guān)一次顯示,以免顯示出鬼影
- if(++d>3) d=0; //先將d加1,然后判斷是否大于3,大于3歸零
- if(d==0) //如果d=0,顯示千位
- {
- U5A=0; //U5A=0,U5B=0,U5C=0,選通數(shù)碼管的千位進(jìn)行顯示
- U5B=0; //U5A=0,U5B=0,U5C=0,選通數(shù)碼管的千位進(jìn)行顯示
- U5C=0; //U5A=0,U5B=0,U5C=0,選通數(shù)碼管的千位進(jìn)行顯示
- PORTB=LED[15]; //將要顯示的f的千位提取出來(lái)查表后送顯示
- }
- else if(d==1) //如果d=1,顯示百位
- {
- U5A=1; //U5A=1,U5B=0,U5C=0,選通數(shù)碼管的百位進(jìn)行顯示
- U5B=0; //U5A=1,U5B=0,U5C=0,選通數(shù)碼管的百位進(jìn)行顯示
- U5C=0; //U5A=1,U5B=0,U5C=0,選通數(shù)碼管的百位進(jìn)行顯示
- PORTB=LED[15]; //將要顯示的f的百位提取出來(lái)查表后送顯示
- }
- else if(d==2) //如果d=2,顯示十位
- {
- U5A=0; //U5A=0,U5B=1,U5C=0,選通數(shù)碼管的十位進(jìn)行顯示
- U5B=1; //U5A=0,U5B=1,U5C=0,選通數(shù)碼管的十位進(jìn)行顯示
- U5C=0; //U5A=0,U5B=1,U5C=0,選通數(shù)碼管的十位進(jìn)行顯示
- PORTB=LED[0]; //將要顯示的f的十位提取出來(lái)查表后送顯示
- }
- else if(d==3) //如果d=3,顯示個(gè)位
- {
- U5A=1; //U5A=1,U5B=1,U5C=0,選通數(shù)碼管的個(gè)位進(jìn)行顯示
- U5B=1; //U5A=1,U5B=1,U5C=0,選通數(shù)碼管的個(gè)位進(jìn)行顯示
- U5C=0; //U5A=1,U5B=1,U5C=0,選通數(shù)碼管的個(gè)位進(jìn)行顯示
- PORTB=LED[10]; //將要顯示的f的個(gè)位提取出來(lái)查表后送顯示
- ……………………
- …………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………
復(fù)制代碼
所有資料51hei提供下載:
illuminometer.rar
(176.22 KB, 下載次數(shù): 48)
2018-1-14 17:00 上傳
點(diǎn)擊文件名下載附件
源代碼
|
|