PIC16F873A单片机的照度测量项目原理图与源代码

发布者:xinyi9008最新更新时间:2019-11-12 来源: 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转换的汇编程序

推荐阅读最新更新时间:2024-11-10 16:28

PIC单片机(PIC16F877A)外部中断程序
正常运行为流水灯,发生中断则灯全亮。 #include pic.h __CONFIG(0x3B31); //4M #define uchar unsigned char #define uint unsigned int #define DELAY 500 uint j=50000; void delay(uint x) //1ms { uint y,z; for(y=x;y 0;y--) for(z=25;z 0;z--); } void init(void) { TRISB0=0; RB0=1; //为下降沿创造高电平的初始条件 TRISB0=1; //输入
[单片机]
PIC<font color='red'>单片机</font>(PIC16F877A)外部中断程序
基于单片机的智能充电器设计
0 引言 电子技术的快速发展使得各种各样的电子产品都朝着便携式和小型轻量化的方向发展,也使得更多的电气化产品采用基于电池的供电系统。目前,较多使用的电池有镍镉、镍氢、铅蓄电池和锂电池。它们的各自特点决定了它们将在相当长的时期内共存发展。由于不同类型电池的充电特性不同,通常对不同类型,甚至不同电压、容量等级的电池使用不同的充电器,但这在实际使用中有诸多不便。 本文介绍一种基于单片机的智能充电器的设计方法。该充电器可以实时采集电池的电压和电流,并对充电过程进行智能控制。它可以自动计算电池的已充电量和剩余的充电时间,也可以改变参数来适应各种不同电池的充电。系统中的管理电路还具有保护功能,可防止电池的过充和过放对电池造成。 1 智能
[单片机]
基于<font color='red'>单片机</font>的智能充电器设计
PIC单片机的大数组RAM分配错误解决
在编译程序时出现 Error - section '.udata_main.o' can not fit the section. Section '.udata_main.o' length=0x00000606 Errors : 1 询问高人得知该错误为RAM分配超过256B。 解决方法为: 1、打开18f452.lkr 即所选MCU的lkr文件 lkr文件所在位置为:C:\Program Files\Microchip\mplabc18\v3.40\bin\LKR,用记事本打开。 其关于RAM分配的为 ACCESSBANK NAME=accessram
[单片机]
AVR单片机C语言入门知识
1、基本语法介绍 一个简单的AVR程序 #include iom16v.h #include macros.h void main() { PORTA = 0x0F; //给PA口赋值,让PA口低四位为1,高四位为0 while(1) ; }本程序的作用是把PA口的值设为0x0F。 1、程序中以井号开头的语句#include iom16v.h 是包含特定的头文件,叫预处理指令,i0m16v表示使用的是mega16,macros.h包含了必须的avr操作命令。 2、C语言的程序是由函数构成的,如上面的那个void main(),前面的void表明函数没有返回值。每一个c程序里面里有且只有一个main()函数,系
[单片机]
MCS-51单片机有几个工作寄存器?
工作寄存器有4组,每组都是8个工作寄存器R0~R7,通过PSW中的RS1、RS0两位来选择使用哪一组,如果不选,默认是选择第0组。 RS1RS0组合为00时,选中第0组工作寄存器,R0~R7地址为00H~07H; RS1RS0组合为01时,选中第1组工作寄存器,R0~R7地址为08H~0FH; RS1RS0组合为10时,选中第2组工作寄存器,R0~R7地址为10H~17H; RS1RS0组合为11时,选中第3组工作寄存器,R0~R7地址为18H~1FH。 类似arm的usr模式svc模式irq模式fiq模式, psw.4 psw.3 0 0
[单片机]
第8课 单片机中断
中断是为单片机实时处理外部和内部随机机事情而设置的一项基本功能,中断功能的存在,极大的提高了单片机处理外部和内部事件的能力,目前几乎所有单片机都会配置的这一项基本功能,而中断功能的强弱也成为衡量一种单片机功能是否强大的重要指标之一。作为单片机的学习者,中断的概念及编程能力必须要灵活的掌握并学会应用。 单片机中断功能的强弱因单片机的种类不同而不同,51单片机的中断功能相对简单,内部有5个中断源,像一些高级的单片如飞思卡尔有上百个中断源。但知识都是相通的,51单片机中断的概念弄懂白了,其它单片机的也就是一个了解和熟悉的过程。 51单片机内部总共有5个中断源,分别外部中断0、定时器中断0、外部中断0、定时器中断1、串行中断。后面的章节我
[单片机]
第8课 <font color='red'>单片机</font>中断
基于51单片机1602库+显示函数
LCD1602.c #include reg52.h #include LCD1602.h unsigned char TempBuffer ; ///////////////////////////////////////////////////// //////////////////五位数字显示转换/////////////////// ///////////////////////////////////////////////////// void IntToStr(unsigned int t, unsigned char *str, unsigned char n) { unsigned char
[单片机]
基于51<font color='red'>单片机</font>1602库+显示函数
基于μC/0S一Ⅱ和LPC2129微控制器实现智能机器人控制系统的设计
1 引言 轮式移动机器人是机器人研究领域的一项重要内容,它集机械、、检测技术与智能控制于一体,是一个典型的智能控制系统。智能机器人比赛集高科技、娱乐、竞技于一体,已成为国际上广泛开展的高技术对抗活动。现以7处理器为控制核心,采用无线通信技术,并移植嵌入式实时操作系统μC/0S一Ⅱ设计了一套智能机器人控制系统。 2 设计 根据竞技机器人的功能要求进行总体设计,将各个功能进行,其控制系统硬件框图如图1所示。中央处理器采用微控制器结构,用以控制外围设备协调运行。舵机控制机器人的运动方向;驱动采用输出轴配有光电编码器的小型直流电机驱动车轮旋转。作为机械手夹紧的执行元件。设置了两路超声波、8路光电检测输入和8路量检测。整个机
[机器人]
小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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