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