标题:
基于使用PIC16F87X单片机ADC制作的照度计 附源码
[打印本页]
作者:
mackintoshi
时间:
2018-9-19 20:12
标题:
基于使用PIC16F87X单片机ADC制作的照度计 附源码
首先声明,本人是一名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);
}
}
}
}
复制代码
作者:
seataozhang
时间:
2019-9-9 20:37
学习了,谢楼主分享,支持楼主,顶一下!
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1