历史上的今天

今天是:2024年11月12日(星期二)

2019年11月12日 | PIC16F873A单片机的照度测量项目原理图与源代码

发布者:xinyi9008 来源: 51hei关键字:PIC16F873A  单片机  照度测量 手机看文章 扫描二维码
随时随地手机看文章

基于PIC16F873A的照度测量C语言代码。
可以使用Labview以RS232接口和PC通信,并获取实时数据
 

单片机源程序如下:

#include           //调用PIC16F87XA单片机的头文件



__CONFIG(HS&WDTDIS&LVPDIS);


#define U5A  RC0           //4位数码管单元的U5(74HC138)的A脚接在RB0口上

#define U5B  RC1           //4位数码管单元的U5(74HC138)的B脚接在RB1口上

#define U5C  RC2           //4位数码管单元的U5(74HC138)的C脚接在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,/*-*/

};

//---------------------------------------

//A/D转换用寄存器设置

unsigned int  ADbuf;   //设置16位的unsigend int型寄存器用来暂存转换结果

unsigned int adcbuf[16];



void main(void)            //主函数,单片机开机后就是从这个函数开始运行

{

        unsigned char buf;    

        unsigned char USARTbuf;


    unsigned char c=0;     //定义一个char型变量,做延时用

    unsigned char e=0;     //定义一个char型变量,做延时用


        unsigned char i;

        unsigned char b;

        unsigned char d=0;     //定义一个char型变量,控制显示位置

    TRISA=0B11111111;      //初始化RA5-RA0的输出方向

   TRISC=0B11111000;           //RB0-3设置为输出

        TRISB=0B00000000;           //RD设置为输出

    PORTA=0B00000000;      //初始化RA5-RA0数值

    PORTB=0B00000000;      //初始化RB7-RB0的数值

    PORTB=0B00000000;      //初始化RD7-RD0的数值



    //****A/D模块初始化****

    //ADCON1=0B10001110;     //RA0为A/D输入口;ADFM=1,转换后数据右移,ADRESL为低8位数据

     ADCON1=0B10001111;     //RA0为A/D输入口;ADFM=1,转换后数据右移,ADRESL为低8位数据

//设置RA2=Vref-(GND),RA3=Vref+

/*

详细分析该设置:

ADFM=1,结果右移,ADRESH寄存器的高六位读作“0”

bit6~4未用,以0设置

bit3~0 RA0作为模拟信号输入端,其余引脚(RA1~7)都是数字信号输入端


*/


    ADIE=0;                //禁止A/D中断

    //*********************


        //*****USART串口初始化*****

    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次,然后取平均数

                {

    //***启动一次A/D转换***

                ADCON0=0B00000001;     //选择AN0通道准备进行A/D转换,启动A/D模块

/*

详细分析该设置:

ADCS1:ADCS0=00,fosc/2;4MHz/2=2MHz?

CHS2:CHS0=000,选择模拟通道RA0

GO/DONE=0,未进行A/D转换,A/D转换完成后该位自动清零

bit1=0,该位未用

ADON=1,打开A/D转换器的工作状态

*/

                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];           //把连续转换了16次的AD值加在一起

                }

                ADbuf=ADbuf/16;                 //除以16,算16次采样的平均值

        

                ADbuf=(int)(((float)ADbuf/1023)*1000);            //将0-1023换算成电压值000-1000


            temp1=ADbuf/100;

            temp2=ADbuf%100;


      if(ADbuf<999)

{  


         PORTB=0;           //关一次显示,以免显示出鬼影

               if(++d>3) d=0;     //先将d加1,然后判断是否大于3,大于3归零

               if(d==0)           //如果d=0,显示千位

               {

           U5A=0;         //U5A=0,U5B=0,U5C=0,选通数码管的千位进行显示

           U5B=0;         //U5A=0,U5B=0,U5C=0,选通数码管的千位进行显示

           U5C=0;         //U5A=0,U5B=0,U5C=0,选通数码管的千位进行显示

           PORTB=LED[(ADbuf%10000)/1000];       //将要显示的f的千位提取出来查表后送显示 

               }

               else if(d==1)      //如果d=1,显示百位

               {

           U5A=1;         //U5A=1,U5B=0,U5C=0,选通数码管的百位进行显示

           U5B=0;         //U5A=1,U5B=0,U5C=0,选通数码管的百位进行显示

           U5C=0;         //U5A=1,U5B=0,U5C=0,选通数码管的百位进行显示

           PORTB=LED[(ADbuf%1000)/100]; //将要显示的f的百位提取出来查表后送显示

               }

               else if(d==2)      //如果d=2,显示十位

               {

           U5A=0;         //U5A=0,U5B=1,U5C=0,选通数码管的十位进行显示

           U5B=1;         //U5A=0,U5B=1,U5C=0,选通数码管的十位进行显示

           U5C=0;         //U5A=0,U5B=1,U5C=0,选通数码管的十位进行显示

           PORTB=LED[(ADbuf%100)/10];   //将要显示的f的十位提取出来查表后送显示

               }

               else if(d==3)      //如果d=3,显示个位

               {

           U5A=1;         //U5A=1,U5B=1,U5C=0,选通数码管的个位进行显示

           U5B=1;         //U5A=1,U5B=1,U5C=0,选通数码管的个位进行显示

           U5C=0;         //U5A=1,U5B=1,U5C=0,选通数码管的个位进行显示

           PORTB=LED[ADbuf%10];         //将要显示的f的个位提取出来查表后送显示

               }

  }    


if(ADbuf>999)

{

         PORTB=0;           //关一次显示,以免显示出鬼影

               if(++d>3) d=0;     //先将d加1,然后判断是否大于3,大于3归零

               if(d==0)           //如果d=0,显示千位

               {

           U5A=0;         //U5A=0,U5B=0,U5C=0,选通数码管的千位进行显示

           U5B=0;         //U5A=0,U5B=0,U5C=0,选通数码管的千位进行显示

           U5C=0;         //U5A=0,U5B=0,U5C=0,选通数码管的千位进行显示

[1] [2]
关键字:PIC16F873A  单片机  照度测量 引用地址:PIC16F873A单片机的照度测量项目原理图与源代码

上一篇:PIC18读取SD卡示例PIC18 SD BMP Reader源码
下一篇:PIC12F675两通道的AD转换的汇编程序

推荐阅读

        据外媒gsmarena报道,三星即将在近期内推出Galaxy A和M系列新机,其最大的特征是使用LCD面板而不是AMOLED。  近期,两款型号为SM-M205F和SM-M305F的 Galaxy M智能手机现身,据知情人士称是Galaxy M20和M30,其中Galaxy M20提供32或64GB的存储,而后者提供64和128GB存储。  据说这两款手机都支持双卡功能。  从配置上来看, Galaxy M应该是一款中档机型。
概览无线设备的数量、通信标准的多样性,以及调制方案的复杂度,每一年都在不断增加。而随着每一代新技术的诞生,由于使用传统技术测试无线设备,需要大量更复杂的测试设备,其成本也在不断提高。使用虚拟(软件)仪器与模块化I/O相结合是一种最小化硬件成本并减少测试时间的方法。软件设计仪器的新方法使得射频测试工程师无需凭借自定义或特殊标准的仪器,...
苹果发布了他们全新的MacBook系列产品。这不是一个普通的发布版本,如果说有什么不同的话,苹果今天所做的这一举动是15年来从未发生过的:开始了整个消费类Mac系列的CPU架构转型。这个巨大的改变多亏了该公司在硬件和软件上的垂直整合,除了苹果公司,没有人能够如此迅速地引入。上一次苹果公司在2006年进行这样的尝试时,放弃了IBM的PowerPC ISA和处理器...
广告摘要声明广告撰文 | 张浩程随着进入厂家的增多,移动机器人赛道愈发拥挤。如果说未来几年之内移动机器人厂商的取胜之道在哪里,优艾智合给出的答案是:基于自研的移动机器人产品,面向客户场景打造针对性的一体化智能升级解决方案。创建于2017年的优艾智合是一家技术驱动型企业,自创立之初就确定了自身的目标,基于自身在SLAM算法上的深厚积累,致...

史海拾趣

问答坊 | AI 解惑

HT1380串行时钟芯片

HT1380串行时钟芯片一般来说,HT系列的芯片在串行口的应用一直以来就是很好的在单片机 这个领域,串行时钟一直占着很重要的位置…

查看全部问答∨

Introduction to NI VeriStand

Introduction to NI VeriStand…

查看全部问答∨

奇怪了,请大家看下做标记的那几行代码

请大家看下下面打问号几行代码,抛开其功能不说,真的是奇怪了,我都看了又看,头都大了,就是不知道为什么,请朋友们指点下 #include<reg52.h>                     &nbs ...…

查看全部问答∨

evc托盘编程

使用evc4.0编写一个系统托盘,就是我的程序起来之后,不显示对话框,自动出现一个图标到右下角,通过双机图标,可以弹出对话框。 右键单击右下角图标,可以弹出一个菜单。 不知道如何实现这些功能,请兄弟姐妹们帮个忙!…

查看全部问答∨

请高手帮忙~~~在EVC下的2个函数没定义.

error C2065: \'GetRunningObjectTable\' : undeclared identifier error C2065: \'CreateItemMoniker\' : undeclared identifier 我用的是EVC 4.0+SP4…

查看全部问答∨

si4010有没有人用过,求探讨

si4010有没有人用过,求探讨,开发软件,调试软件,烧录工具等等…

查看全部问答∨

STM32的驱动库好用吗?效率高吗?优化的吗?准备上STM32

    N多年没买过开发板了,也没用过仿真器了。都是用软件编译调试好,直接ISP,然后通过串口命令开启调试信息的输出。    昨天买了块STM32F103全功能型开发板,他们的办事效率真低(深圳到广州通常当 ...…

查看全部问答∨

求IAR Embedded Workbench for MCS-51 完整版

各位高手,小弟求IAR Embedded Workbench for MCS-51完整版,有哪位高人有,能否分享一下。我的邮箱jinghongchen@126.com…

查看全部问答∨

猎头招聘

世界500强招聘压力传感器SAE,如有兴趣可发简历至:aerie.song@seek-jobs.com.cn 要求:至少五年以上相关工作经验,英文流利。…

查看全部问答∨

批评英蓓特,一个细节反映出的不认真

还是说说今天参加安富利的“ARM研讨会”,参观展台时,逛到了英蓓特(EMBEST)那里。大家可能知道,这家公司就是专门围绕ARM生存的,有很多ARM开发板。我在看到英蓓特展台的易拉宝时,楞了一下,原来上面罗列的产品线时,赫然有“Luminary系列”。 ...…

查看全部问答∨
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

更多往期活动

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved