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

发布者:Dingsir1902最新更新时间:2019-10-24 来源: 51hei关键字:PIC16F87X  单片机  ADC  照度计 手机看文章 扫描二维码
随时随地手机看文章

单片机程序源码如下:

#include //调用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);    

   }

  }


    }

}



关键字:PIC16F87X  单片机  ADC  照度计 引用地址:基于使用PIC16F87X单片机ADC制作的照度计

上一篇:MPLAB编译后不显示错误信息
下一篇:PIC18F45K80 CAN通信实例,可通过模拟调试

推荐阅读最新更新时间:2024-11-05 01:00

德州仪器在 C2000™ Piccolo™ 实时浮点微控制器上集成 USB,可实现移动现场诊断与通信
2013 年 2 月 18 日,北京讯 日前,德州仪器 (TI) 宣布推出集成 USB 连接功能的最新 32 位实时 C2000™ Piccolo™ F2806xU 微控制器 (MCU),为客户开发需要现场连接的终端产品助一臂之力。 在消费类及工业电机控制系统、工业电源系统、电信及数据系统、风力与太阳能发电、普通电力电子应用等众多应用中,能够进行存取诊断并进行现场动态修改非常重要。有了 Piccolo F2806xU MCU,TI 客户可便捷地为其应用整合 USB 连接功能。 Piccolo F2806xU MCU 的特性与优势: • 集成型 USB 2.0 及 CAN 外设可充分满足现场移动通信需求; • 支持同步双通道采样
[单片机]
单片机复位电路详解
单片机复位电路就好比电脑的重启部分,当电脑在使用中出现死机,按下重启按钮电脑内部的程序从头开始执行。单片机也一样,当单片机系统在运行中,受到环境干扰出现程序跑飞的时候,按下复位按钮内部的程序自动从头开始执行。本文介绍的就是单片机按键复位电路原理和电路图解析。 复位电路 在单片机系统中,系统上电启动的时候复位一次,当按键按下的时候系统再次复位,如果释放后再按下,系统还会复位。所以可以通过按键的断开和闭合在运行的系统中控制其复位。 当这个电路处于稳态时,电容起到隔离直流的作用,隔离了+5V,而左侧的复位按键是弹起状态,下边部分电路就没有电压差的产生,所以按键和电容 C11以下部分的电位都是和GND相等的,也就是0V电压。我们这
[单片机]
<font color='red'>单片机</font>复位电路详解
单片机接收命令发送脉冲
//=========================================================== // step motor 串口通信G代码 // #include REG51.H #include string.h #define uchar unsigned char #define uint unsigned int #define Gcode_LEN 10 //数据长度G01X12345$ (10char) sbit Xpul = P0^0; //axis X clk sbit Xdir = P0^1; //axis X CCW uint Xmove; /
[单片机]
<font color='red'>单片机</font>接收命令发送脉冲
STM32单片机的三种启动模式解析
STM32三种启动模式对应的存储介质均是芯片内置的,它们是: 1)用户闪存 = 芯片内置的Flash。 2)SRAM = 芯片内置的RAM区,就是内存啦。 3)系统存储器 = 芯片内部一块特定的区域,芯片出厂时在这个区域预置了一段Bootloader,就是通常说的ISP程序。这个区域的内容在芯片出厂后没有人能够修改或擦除,即它是一个ROM区。 在每个STM32的芯片上都有两个管脚BOOT0和BOOT1,这两个管脚在芯片复位时的电平状态决定了芯片复位后从哪个区域开始执行程序。 BOOT1=x BOOT0=0 从用户闪存启动,这是正常的工作模式。 BOOT1=0 BOOT0=1 从系统存储器启动,这种模式启动的程序功能由厂家设置。
[单片机]
单片机好学还是plc好学?想转行选plc还是单片机
很凑巧,单片机和PLC我都学过。 我在学校的时候读的是电气工程专业,学校的知识覆盖面很广,基本每个东西都有学到一点。 什么画一定比例的结构图,电机绕线、强电弱电、机柜接线、PLC这些基本都有接触过。 但是学的都比较肤浅,也不是很实用,导致毕业以后,手握高级证却感觉前途一片渺茫。 这也是很多应届生即将面临的问题。 学校更多是给你提供一个行业的知识,作为过来人,我的建议是从一个大行业里找一个细分的领域深造。 什么意思呢? 就拿我们今天这个话题来说,电气工程专业一般都会接触到PLC和单片机。 我记得在学校的时候也有 plc 和单片机的课程,只不过老师只教你的比较浅,或许是教深了学生学不会。 Plc我们学的是三菱的,后面西门子带过(很多同
[单片机]
基于MCU的室外移动机器人组合导航定位系统
对于在室外环境工作的移动机器人通常使用惯导/卫星组合导航方式。惯性导航系统 具有完全自主、抗干扰强、隐蔽能力好和输出参数全面等优点,但它的鲁棒性极低,误差会不断随时间累积发散。卫星导航系统具有精度高、定位范围广和误差不随时间累积等优点,但其自主性差、易受外界遮挡和干扰、接收机数据更新频率低等缺点。因此工程上常常将两者互补结合使用,组成卫星/惯性组合导航系统。 本文以低功耗MSP430F149为核心,设计了能够同时实现卫星导航(GNSS)接收机、惯性测量单元(IMU)、气压高度等导航信息的高速采集与高速合路传输,并进行初步导航定位信息融合的导航系统,即可为室外移动机器人提供直接的导航服务,也可作为高精度组合导航系统的原始测量信息高速
[单片机]
基于<font color='red'>MCU</font>的室外移动机器人组合导航定位系统
基于AVR单片机的三相晶闸管触发电路的设计
简介:本系统采用单片机来控制可控硅的触发,是可控硅应用的发展趋势。本系统在实际应用中也已显示出触发精度高、可靠性高、易于调试、操作方便等优点。该触发电路在实际应用中已成功触发过100 A~400 A的晶闸管。 引 言 用于晶闸管三相全控桥整流装置的触发电路,若仅从触发信号的相位控制方式来看,只有多通道相位控制和单通道相位控制两种。前者的典型电路为锯齿波移相触发电路,它用于三相全控桥式主电路时,移相通道多达6个,由于各个通道中同步电路本身特性的差异,发出的触发脉冲相位对称度很差。另外,传统的晶闸管整流或逆变系统需要3个同步变压器来得到触发脉冲的同步信号,不仅增加了系统的成本,同时给安装调试带来不便。随着新型器件的发展,数字移相技
[单片机]
基于AVR<font color='red'>单片机</font>的三相晶闸管触发电路的设计
STM32单片机内存管理器实用代码解析与工程应用指南
本代码适用于无操作系统的STM32单片机开发,功能强大。 可申请到地址空间连续的不同大小的内存空间,且用户接口简单,使用方便。 直接复制粘贴如下代码即可: memory.h: #ifndef __MEMORY_H__ #define __MEMORY_H__ #include stdio.h #include string.h #include includes.h //用户使用 typedef struct { void *addr;//申请到的内存的起始地址 uint32_t size;//申请到的内存的大小,按照块大小分配,大于等于申请大小 uint16_t tb; //申请表序号,申
[单片机]
小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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