久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 6075|回復(fù): 1
收起左側(cè)

PIC16F873A單片機(jī)的照度測(cè)量項(xiàng)目原理圖與源代碼

[復(fù)制鏈接]
ID:275894 發(fā)表于 2018-1-14 17:05 | 顯示全部樓層 |閱讀模式
基于PIC16F873A的照度測(cè)量C語(yǔ)言代碼。
可以使用Labview以RS232接口和PC通信,并獲取實(shí)時(shí)數(shù)據(jù)
1.png
2.png 0.png

單片機(jī)源程序如下:

  1. #include <pic.h>           //調(diào)用PIC16F87XA單片機(jī)的頭文件


  2. __CONFIG(HS&WDTDIS&LVPDIS);

  3. #define U5A  RC0           //4位數(shù)碼管單元的U5(74HC138)的A腳接在RB0口上
  4. #define U5B  RC1           //4位數(shù)碼管單元的U5(74HC138)的B腳接在RB1口上
  5. #define U5C  RC2           //4位數(shù)碼管單元的U5(74HC138)的C腳接在RB2口上

  6. unsigned char temp1;
  7. unsigned char temp2;

  8. const unsigned char LED[28]=
  9. {
  10. 0x3F,/*0*/        
  11. 0x06,/*1*/        
  12. 0x5B,/*2*/        
  13. 0x4F,/*3*/        
  14. 0x66,/*4*/        
  15. 0x6D,/*5*/        
  16. 0x7D,/*6*/        
  17. 0x07,/*7*/        
  18. 0x7F,/*8*/        
  19. 0x6F,/*9*/        
  20. 0x77,/*A*/        
  21. 0x7C,/*b*/        
  22. 0x39,/*C*/        
  23. 0x58,/*c*/        
  24. 0x5E,/*d*/        
  25. 0x79,/*E*/        
  26. 0x71,/*F*/        
  27. 0x76,/*H*/        
  28. 0x74,/*h*/        
  29. 0x38,/*L*/        
  30. 0x54,/*n*/        
  31. 0x37,/*N*/        
  32. 0x5C,/*o*/        
  33. 0x73,/*P*/        
  34. 0x50,/*r*/        
  35. 0x78,/*t*/        
  36. 0x3E,/*U*/        
  37. 0x40,/*-*/
  38. };
  39. //---------------------------------------
  40. //A/D轉(zhuǎn)換用寄存器設(shè)置
  41. unsigned int  ADbuf;   //設(shè)置16位的unsigend int型寄存器用來(lái)暫存轉(zhuǎn)換結(jié)果
  42. unsigned int adcbuf[16];


  43. void main(void)            //主函數(shù),單片機(jī)開(kāi)機(jī)后就是從這個(gè)函數(shù)開(kāi)始運(yùn)行
  44. {
  45.         unsigned char buf;   
  46.         unsigned char USARTbuf;

  47.     unsigned char c=0;     //定義一個(gè)char型變量,做延時(shí)用
  48.     unsigned char e=0;     //定義一個(gè)char型變量,做延時(shí)用

  49.         unsigned char i;
  50.         unsigned char b;
  51.         unsigned char d=0;     //定義一個(gè)char型變量,控制顯示位置
  52.     TRISA=0B11111111;      //初始化RA5-RA0的輸出方向
  53.    TRISC=0B11111000;           //RB0-3設(shè)置為輸出
  54.         TRISB=0B00000000;           //RD設(shè)置為輸出
  55.     PORTA=0B00000000;      //初始化RA5-RA0數(shù)值
  56.     PORTB=0B00000000;      //初始化RB7-RB0的數(shù)值
  57.     PORTB=0B00000000;      //初始化RD7-RD0的數(shù)值


  58.     //****A/D模塊初始化****
  59.     //ADCON1=0B10001110;     //RA0為A/D輸入口;ADFM=1,轉(zhuǎn)換后數(shù)據(jù)右移,ADRESL為低8位數(shù)據(jù)
  60.      ADCON1=0B10001111;     //RA0為A/D輸入口;ADFM=1,轉(zhuǎn)換后數(shù)據(jù)右移,ADRESL為低8位數(shù)據(jù)
  61. //設(shè)置RA2=Vref-(GND),RA3=Vref+
  62. /*
  63. 詳細(xì)分析該設(shè)置:
  64. ADFM=1,結(jié)果右移,ADRESH寄存器的高六位讀作“0”
  65. bit6~4未用,以0設(shè)置
  66. bit3~0 RA0作為模擬信號(hào)輸入端,其余引腳(RA1~7)都是數(shù)字信號(hào)輸入端

  67. */

  68.     ADIE=0;                //禁止A/D中斷
  69.     //*********************

  70.         //*****USART串口初始化*****
  71.     SPBRG=25;              //設(shè)置波特率為9600,誤差0.16%
  72.     BRGH=1;                //設(shè)置高速波特率
  73.     SYNC=0;                //SYNC=0為異步模式,SYNC=1為同步模式
  74.     SPEN=1;                //允許串口操作
  75.     CREN=1;                //CREN=0禁止連續(xù)接收,CREN=1允許連續(xù)接收
  76.     TXIE=0;                //禁止發(fā)送中斷
  77.     RCIE=0;                //禁止接收中斷
  78.     TX9=0;                 //TX9=0為8位發(fā)送,TX9=1為9位發(fā)送
  79.     RX9=0;                 //RX9=0為8位接收,RX9=1為9位接收
  80.     TXEN=1;                //TXEN=0為禁止發(fā)送,TXEN=1為允許發(fā)送
  81.    

  82.     while(1)               //死循環(huán),單片機(jī)初始化后,將一直運(yùn)行這1個(gè)死循環(huán)
  83.     {
  84.                 for(i=0;i<16;i++)  //連續(xù)采樣16次,然后取平均數(shù)
  85.                 {
  86.     //***啟動(dòng)一次A/D轉(zhuǎn)換***
  87.                 ADCON0=0B00000001;     //選擇AN0通道準(zhǔn)備進(jìn)行A/D轉(zhuǎn)換,啟動(dòng)A/D模塊
  88. /*
  89. 詳細(xì)分析該設(shè)置:
  90. ADCS1:ADCS0=00,fosc/2;4MHz/2=2MHz?
  91. CHS2:CHS0=000,選擇模擬通道RA0
  92. GO/DONE=0,未進(jìn)行A/D轉(zhuǎn)換,A/D轉(zhuǎn)換完成后該位自動(dòng)清零
  93. bit1=0,該位未用
  94. ADON=1,打開(kāi)A/D轉(zhuǎn)換器的工作狀態(tài)
  95. */
  96.                 asm("NOP");            //略做延時(shí)
  97.                 asm("NOP");            //略做延時(shí)
  98.                 asm("NOP");            //略做延時(shí)
  99.                 asm("NOP");            //略做延時(shí)
  100.                 ADGO=1;                //開(kāi)始進(jìn)行A/D轉(zhuǎn)換
  101.                 while(ADGO) continue;  //等待A/D轉(zhuǎn)換結(jié)束
  102.                 adcbuf[i]=ADRESH*256+ADRESL;  
  103.            
  104.     //*********************   
  105.                 }
  106.                 ADbuf=0;
  107.                 for(i=0;i<16;i++)            
  108.                 {
  109.                         ADbuf+=adcbuf[i];           //把連續(xù)轉(zhuǎn)換了16次的AD值加在一起
  110.                 }
  111.                 ADbuf=ADbuf/16;                 //除以16,算16次采樣的平均值
  112.         
  113.                 ADbuf=(int)(((float)ADbuf/1023)*1000);            //將0-1023換算成電壓值000-1000

  114.             temp1=ADbuf/100;
  115.             temp2=ADbuf%100;

  116.       if(ADbuf<999)
  117. {  

  118.          PORTB=0;           //關(guān)一次顯示,以免顯示出鬼影
  119.                if(++d>3) d=0;     //先將d加1,然后判斷是否大于3,大于3歸零
  120.                if(d==0)           //如果d=0,顯示千位
  121.                {
  122.            U5A=0;         //U5A=0,U5B=0,U5C=0,選通數(shù)碼管的千位進(jìn)行顯示
  123.            U5B=0;         //U5A=0,U5B=0,U5C=0,選通數(shù)碼管的千位進(jìn)行顯示
  124.            U5C=0;         //U5A=0,U5B=0,U5C=0,選通數(shù)碼管的千位進(jìn)行顯示
  125.            PORTB=LED[(ADbuf%10000)/1000];       //將要顯示的f的千位提取出來(lái)查表后送顯示
  126.                }
  127.                else if(d==1)      //如果d=1,顯示百位
  128.                {
  129.            U5A=1;         //U5A=1,U5B=0,U5C=0,選通數(shù)碼管的百位進(jìn)行顯示
  130.            U5B=0;         //U5A=1,U5B=0,U5C=0,選通數(shù)碼管的百位進(jìn)行顯示
  131.            U5C=0;         //U5A=1,U5B=0,U5C=0,選通數(shù)碼管的百位進(jìn)行顯示
  132.            PORTB=LED[(ADbuf%1000)/100]; //將要顯示的f的百位提取出來(lái)查表后送顯示
  133.                }
  134.                else if(d==2)      //如果d=2,顯示十位
  135.                {
  136.            U5A=0;         //U5A=0,U5B=1,U5C=0,選通數(shù)碼管的十位進(jìn)行顯示
  137.            U5B=1;         //U5A=0,U5B=1,U5C=0,選通數(shù)碼管的十位進(jìn)行顯示
  138.            U5C=0;         //U5A=0,U5B=1,U5C=0,選通數(shù)碼管的十位進(jìn)行顯示
  139.            PORTB=LED[(ADbuf%100)/10];   //將要顯示的f的十位提取出來(lái)查表后送顯示
  140.                }
  141.                else if(d==3)      //如果d=3,顯示個(gè)位
  142.                {
  143.            U5A=1;         //U5A=1,U5B=1,U5C=0,選通數(shù)碼管的個(gè)位進(jìn)行顯示
  144.            U5B=1;         //U5A=1,U5B=1,U5C=0,選通數(shù)碼管的個(gè)位進(jìn)行顯示
  145.            U5C=0;         //U5A=1,U5B=1,U5C=0,選通數(shù)碼管的個(gè)位進(jìn)行顯示
  146.            PORTB=LED[ADbuf%10];         //將要顯示的f的個(gè)位提取出來(lái)查表后送顯示
  147.                }
  148.   }   

  149. if(ADbuf>999)
  150. {
  151.          PORTB=0;           //關(guān)一次顯示,以免顯示出鬼影
  152.                if(++d>3) d=0;     //先將d加1,然后判斷是否大于3,大于3歸零
  153.                if(d==0)           //如果d=0,顯示千位
  154.                {
  155.            U5A=0;         //U5A=0,U5B=0,U5C=0,選通數(shù)碼管的千位進(jìn)行顯示
  156.            U5B=0;         //U5A=0,U5B=0,U5C=0,選通數(shù)碼管的千位進(jìn)行顯示
  157.            U5C=0;         //U5A=0,U5B=0,U5C=0,選通數(shù)碼管的千位進(jìn)行顯示
  158.            PORTB=LED[15];       //將要顯示的f的千位提取出來(lái)查表后送顯示
  159.                }
  160.                else if(d==1)      //如果d=1,顯示百位
  161.                {
  162.            U5A=1;         //U5A=1,U5B=0,U5C=0,選通數(shù)碼管的百位進(jìn)行顯示
  163.            U5B=0;         //U5A=1,U5B=0,U5C=0,選通數(shù)碼管的百位進(jìn)行顯示
  164.            U5C=0;         //U5A=1,U5B=0,U5C=0,選通數(shù)碼管的百位進(jìn)行顯示
  165.            PORTB=LED[15]; //將要顯示的f的百位提取出來(lái)查表后送顯示
  166.                }
  167.                else if(d==2)      //如果d=2,顯示十位
  168.                {
  169.            U5A=0;         //U5A=0,U5B=1,U5C=0,選通數(shù)碼管的十位進(jìn)行顯示
  170.            U5B=1;         //U5A=0,U5B=1,U5C=0,選通數(shù)碼管的十位進(jìn)行顯示
  171.            U5C=0;         //U5A=0,U5B=1,U5C=0,選通數(shù)碼管的十位進(jìn)行顯示
  172.            PORTB=LED[0];   //將要顯示的f的十位提取出來(lái)查表后送顯示
  173.                }
  174.                else if(d==3)      //如果d=3,顯示個(gè)位
  175.                {
  176.            U5A=1;         //U5A=1,U5B=1,U5C=0,選通數(shù)碼管的個(gè)位進(jìn)行顯示
  177.            U5B=1;         //U5A=1,U5B=1,U5C=0,選通數(shù)碼管的個(gè)位進(jìn)行顯示
  178.            U5C=0;         //U5A=1,U5B=1,U5C=0,選通數(shù)碼管的個(gè)位進(jìn)行顯示
  179.            PORTB=LED[10];         //將要顯示的f的個(gè)位提取出來(lái)查表后送顯示
  180. ……………………

  181. …………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………
復(fù)制代碼

所有資料51hei提供下載:
illuminometer.rar (176.22 KB, 下載次數(shù): 48)
回復(fù)

使用道具 舉報(bào)

ID:606233 發(fā)表于 2020-5-25 07:09 | 顯示全部樓層
謝謝分享
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 激情五月婷婷丁香 | 成人在线视频观看 | 天天色天天色 | 中文二区 | 久久精品国产亚洲 | 玖玖国产精品视频 | 永久av| av中文字幕在线观看 | 久草电影网 | 国产精品久久久久久久久久久久久 | 精品一区二区免费视频 | 中文字幕 欧美 日韩 | 男女又爽又黄视频 | 国产精品2 | 在线a视频网站 | 久久久久无码国产精品一区 | 久草网站 | 成人免费大片黄在线播放 | 国产一级视频免费播放 | 天天射夜夜操 | 久久在视频 | 免费三级黄 | 国产精品久久久久久久久污网站 | 亚洲a在线观看 | 亚洲五码在线 | 国产精品免费一区二区三区四区 | 国产目拍亚洲精品99久久精品 | 夜夜爽99久久国产综合精品女不卡 | 天天综合天天 | 狠狠干天天干 | 国产精品成人国产乱一区 | 视频一区二区在线 | 成人在线| 亚洲成人av | 国产亚洲精品精品国产亚洲综合 | 一区二区三区国产精品 | 国产精品自产av一区二区三区 | 欧美日韩精品久久久免费观看 | 国产福利91精品一区二区三区 | av在线天堂 | 免费一区二区三区 |