找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3336|回复: 1
收起左侧

基于使用PIC16F87X单片机ADC制作的照度计 附源码

[复制链接]
ID:275894 发表于 2018-9-19 20:12 | 显示全部楼层 |阅读模式
首先声明,本人是一名PIC单片机的初学者,知道论坛上有很多大佬,也有很多和我一样的初学者,所以在此我只说一遍,本人能力有限,使用的代码,也是在开发板作者的基础上改的。高手发现BUG,只当是个笑话,小白,只当作为一个参考。别做键盘侠,勿喷即可(本人心里承受能力不强)!

制作初衷,基于PIC单片机的AD功能,使用ST公司的TEPT5600光敏传感器,将采集的光学信号,作为模拟量传输到AD端口;
再使用USART将才采集的数据,通过MAX232传输到电脑,使用LabView对数据实时显示和存储,不说了,附上代码

数码管部分,只是作为调试时显示用的,可以理解为学C语言时,用Printf(“”)实时显示相关变量;

本人希望有单片机方面的爱好者,一起讨论话题(初学者也不排斥,但 不要偏离讨论话题太远);
其次,PIC单片机方面的制作和人气,相比其它MCU(比如ST AVR)真的太少了,希望有PIC的同行,一起多多讨论。
本人始终坚持一点,原创与实战才是自己的,抄袭最没意思。

单片机程序源码如下:
  1. #include <pic.h>//调用PIC16F87XA单片机的头文件
  2. __CONFIG(HS&WDTDIS&LVPDIS);
  3. #define U5A  RB0         
  4. #define U5B  RB1         
  5. #define U5C  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. unsigned int  ADbuf;
  40. unsigned int adcbuf[16];

  41. void main(void)            
  42. {
  43. unsigned char buf;   
  44. unsigned char USARTbuf;
  45.     unsigned char c=0;  
  46.     unsigned char e=0;   
  47. unsigned char i;
  48. unsigned char b;
  49. unsigned char d=0;   
  50.     TRISA=0B11111111;   
  51.    TRISB=0B11111000;   
  52. TRISD=0B00000000;   
  53.     PORTA=0B00000000;   
  54.     PORTB=0B00000000;     
  55.     PORTD=0B00000000;   
  56.      ADCON1=0B10001111;   

  57.     ADIE=0;                //禁止A/D中断
  58.     SPBRG=25;              //设置波特率为9600,误差0.16%
  59.     BRGH=1;                //设置高速波特率
  60.     SYNC=0;                //SYNC=0为异步模式,SYNC=1为同步模式
  61.     SPEN=1;                //允许串口操作
  62.     CREN=1;                //CREN=0禁止连续接收,CREN=1允许连续接收
  63.     TXIE=0;                //禁止发送中断
  64.     RCIE=0;                //禁止接收中断
  65.     TX9=0;                 //TX9=0为8位发送,TX9=1为9位发送
  66.     RX9=0;                 //RX9=0为8位接收,RX9=1为9位接收
  67.     TXEN=1;                //TXEN=0为禁止发送,TXEN=1为允许发送
  68.    
  69.     while(1)               //死循环,单片机初始化后,将一直运行这1个死循环
  70.     {
  71.   for(i=0;i<16;i++)  //连续采样16次,然后取平均数
  72.   {
  73.    
  74.          asm("NOP");            //略做延时
  75.          asm("NOP");            //略做延时
  76.          asm("NOP");            //略做延时
  77.          asm("NOP");            //略做延时
  78.          ADGO=1;                //开始进行A/D转换
  79.          while(ADGO) continue;  //等待A/D转换结束

  80.          adcbuf[i]=ADRESH*256+ADRESL;  
  81.            
  82.     //*********************   
  83.   }
  84.   ADbuf=0;
  85.   for(i=0;i<16;i++)            
  86.   {
  87.    ADbuf+=adcbuf[i];         
  88.   }
  89.   ADbuf=ADbuf/16;               
  90.         
  91.   ADbuf=(int)(((float)ADbuf/1023)*1000);
  92.             temp1=ADbuf/100;
  93.             temp2=ADbuf%100;
  94.       if(ADbuf<999)
  95. {  
  96.          PORTD=0;         
  97.         if(++d>3) d=0;  
  98.         if(d==0)      
  99.         {
  100.            U5A=0;      
  101.            U5B=0;     
  102.            U5C=0;      
  103.            PORTD=LED[(ADbuf%10000)/1000];     
  104.         }
  105.         else if(d==1)   
  106.         {
  107.            U5A=1;      
  108.            U5B=0;      
  109.            U5C=0;      
  110.            PORTD=LED[(ADbuf%1000)/100];
  111.         }
  112.         else if(d==2)   
  113.         {
  114.            U5A=0;        
  115.            U5B=1;   
  116.            U5C=0;      
  117.            PORTD=LED[(ADbuf%100)/10];
  118.         }
  119.         else if(d==3)
  120.         {
  121.            U5A=1;      
  122.            U5B=1;         
  123.            U5C=0;      
  124.            PORTD=LED[ADbuf%10];      
  125.         }
  126.   }   


  127. if(ADbuf>999)
  128. {
  129.          PORTD=0;        
  130.         if(++d>3) d=0;  
  131.         if(d==0)         
  132.         {
  133.            U5A=0;   
  134.            U5B=0;     
  135.            U5C=0;   
  136.            PORTD=LED[15];   
  137.         }
  138.         else if(d==1)  
  139.         {
  140.            U5A=1;   
  141.            U5B=0;         
  142.            U5C=0;         
  143.            PORTD=LED[15];
  144.         }
  145.         else if(d==2)  
  146.         {
  147.            U5A=0;      
  148.            U5B=1;      
  149.            U5C=0;      
  150.            PORTD=LED[0];   
  151.         }
  152.         else if(d==3)      
  153.         {
  154.            U5A=1;        
  155.            U5B=1;         
  156.            U5C=0;        
  157.            PORTD=LED[10];      
  158.         }
  159. }

  160. if(RCIF==1)            
  161.         {                       
  162.             USARTbuf=RCREG;     
  163.             if(OERR==1);      
  164.             {
  165.                 CREN=0;         
  166.                 CREN=1;        
  167.             }
  168.    if(USARTbuf==0x89)
  169.    {
  170.              TXREG=0X90;   
  171.              while(TRMT==0);   
  172.     TXREG=temp1;   
  173.              while(TRMT==0);   
  174.     TXREG=temp2;  
  175.              while(TRMT==0);   
  176.    }
  177.   }

  178.     }
  179. }
复制代码

评分

参与人数 1黑币 +100 收起 理由
admin + 100 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:468294 发表于 2019-9-9 20:37 | 显示全部楼层
学习了,谢楼主分享,支持楼主,顶一下!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表