首先聲明,本人是一名PIC單片機的初學者,知道論壇上有很多大佬,也有很多和我一樣的初學者,所以在此我只說一遍,本人能力有限,使用的代碼,也是在開發板作者的基礎上改的。高手發現BUG,只當是個笑話,小白,只當作為一個參考。別做鍵盤俠,勿噴即可(本人心里承受能力不強)!
制作初衷,基于PIC單片機的AD功能,使用ST公司的TEPT5600光敏傳感器,將采集的光學信號,作為模擬量傳輸到AD端口;
再使用USART將才采集的數據,通過MAX232傳輸到電腦,使用LabView對數據實時顯示和存儲,不說了,附上代碼
數碼管部分,只是作為調試時顯示用的,可以理解為學C語言時,用Printf(“”)實時顯示相關變量;
本人希望有單片機方面的愛好者,一起討論話題(初學者也不排斥,但 不要偏離討論話題太遠);
其次,PIC單片機方面的制作和人氣,相比其它MCU(比如ST AVR)真的太少了,希望有PIC的同行,一起多多討論。
本人始終堅持一點,原創與實戰才是自己的,抄襲最沒意思。
單片機程序源碼如下:
- #include <pic.h>//調用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; //設置波特率為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次,然后取平均數
- {
-
- 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];
- }
- 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);
- }
- }
- }
- }
復制代碼 |