標(biāo)題:
基于使用PIC16F87X單片機ADC制作的照度計 附源碼
[打印本頁]
作者:
mackintoshi
時間:
2018-9-19 20:12
標(biāo)題:
基于使用PIC16F87X單片機ADC制作的照度計 附源碼
首先聲明,本人是一名PIC單片機的初學(xué)者,知道論壇上有很多大佬,也有很多和我一樣的初學(xué)者,所以在此我只說一遍,本人能力有限,使用的代碼,也是在開發(fā)板作者的基礎(chǔ)上改的。高手發(fā)現(xiàn)BUG,只當(dāng)是個笑話,小白,只當(dāng)作為一個參考。別做鍵盤俠,勿噴即可(本人心里承受能力不強)!
制作初衷,基于PIC單片機的AD功能,使用ST公司的TEPT5600光敏傳感器,將采集的光學(xué)信號,作為模擬量傳輸?shù)紸D端口;
再使用USART將才采集的數(shù)據(jù),通過MAX232傳輸?shù)诫娔X,使用LabView對數(shù)據(jù)實時顯示和存儲,不說了,附上代碼
數(shù)碼管部分,只是作為調(diào)試時顯示用的,可以理解為學(xué)C語言時,用Printf(“”)實時顯示相關(guān)變量;
本人希望有單片機方面的愛好者,一起討論話題(初學(xué)者也不排斥,但 不要偏離討論話題太遠(yuǎn));
其次,PIC單片機方面的制作和人氣,相比其它MCU(比如ST AVR)真的太少了,希望有PIC的同行,一起多多討論。
本人始終堅持一點,原創(chuàng)與實戰(zhàn)才是自己的,抄襲最沒意思。
單片機程序源碼如下:
#include <pic.h>//調(diào)用PIC16F87XA單片機的頭文件
__CONFIG(HS&WDTDIS&LVPDIS);
#define U5A RB0
#define U5B RB1
#define U5C 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,/*-*/
};
unsigned int ADbuf;
unsigned int adcbuf[16];
void main(void)
{
unsigned char buf;
unsigned char USARTbuf;
unsigned char c=0;
unsigned char e=0;
unsigned char i;
unsigned char b;
unsigned char d=0;
TRISA=0B11111111;
TRISB=0B11111000;
TRISD=0B00000000;
PORTA=0B00000000;
PORTB=0B00000000;
PORTD=0B00000000;
ADCON1=0B10001111;
ADIE=0; //禁止A/D中斷
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),單片機初始化后,將一直運行這1個死循環(huán)
{
for(i=0;i<16;i++) //連續(xù)采樣16次,然后取平均數(shù)
{
asm("NOP"); //略做延時
asm("NOP"); //略做延時
asm("NOP"); //略做延時
asm("NOP"); //略做延時
ADGO=1; //開始進(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];
}
ADbuf=ADbuf/16;
ADbuf=(int)(((float)ADbuf/1023)*1000);
temp1=ADbuf/100;
temp2=ADbuf%100;
if(ADbuf<999)
{
PORTD=0;
if(++d>3) d=0;
if(d==0)
{
U5A=0;
U5B=0;
U5C=0;
PORTD=LED[(ADbuf%10000)/1000];
}
else if(d==1)
{
U5A=1;
U5B=0;
U5C=0;
PORTD=LED[(ADbuf%1000)/100];
}
else if(d==2)
{
U5A=0;
U5B=1;
U5C=0;
PORTD=LED[(ADbuf%100)/10];
}
else if(d==3)
{
U5A=1;
U5B=1;
U5C=0;
PORTD=LED[ADbuf%10];
}
}
if(ADbuf>999)
{
PORTD=0;
if(++d>3) d=0;
if(d==0)
{
U5A=0;
U5B=0;
U5C=0;
PORTD=LED[15];
}
else if(d==1)
{
U5A=1;
U5B=0;
U5C=0;
PORTD=LED[15];
}
else if(d==2)
{
U5A=0;
U5B=1;
U5C=0;
PORTD=LED[0];
}
else if(d==3)
{
U5A=1;
U5B=1;
U5C=0;
PORTD=LED[10];
}
}
if(RCIF==1)
{
USARTbuf=RCREG;
if(OERR==1);
{
CREN=0;
CREN=1;
}
if(USARTbuf==0x89)
{
TXREG=0X90;
while(TRMT==0);
TXREG=temp1;
while(TRMT==0);
TXREG=temp2;
while(TRMT==0);
}
}
}
}
復(fù)制代碼
作者:
seataozhang
時間:
2019-9-9 20:37
學(xué)習(xí)了,謝樓主分享,支持樓主,頂一下!
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1