历史上的今天
返回首页

历史上的今天

今天是:2024年10月24日(星期四)

正在发生

2019年10月24日 | 基于使用PIC16F87X单片机ADC制作的照度计

2019-10-24 来源:51hei

单片机程序源码如下:

#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);    

   }

  }


    }

}



推荐阅读

史海拾趣

问答坊 | AI 解惑

IP防护等级含义

第一个数字: 0 无防护。 1 防护大于50mm的固体物质。 2 防护大于12mm的固体物质 3 防护大于2.5mm的固体物质 4 防护大于1mm的固体物质 5 防护粉尘(有限侵入) 6 防护粉尘(完全) 第二个数字 0 无防护 1 防护水垂直喷洒 2 防 ...…

查看全部问答>

乘公交刷手机 深圳昨跨入“刷手机时代”

300名市民首日换卡尝鲜 换张RFID-SIM卡几秒就能搞定   本报讯 (记者蒋偲 通讯员周玉兰)刷手机坐公车、刷手机用餐、刷手机看电影、刷手机超市结账……昨日是手机深圳通正式推出的第一天,第一位体验的市民张晓东向记者表示,11路是自己每日上 ...…

查看全部问答>

WaitForSingleObject在驱动中定时的问题?

写了一个驱动,要在收到协议的第一个字节后,开始启动超时定时器,如果超时就复位接受缓存。 不懂在驱动中该如何使用定时器,就学着用WaitForSingleObject()实现,但是在使用中如何能实现“收到第一个字节启动,收到最后一个停止”??? 实现过 ...…

查看全部问答>

嵌入式TCP/IP技术交流

欢迎大家讨论嵌入式TCP/IP技术 RTL8019 ENC28J60 CP2200 cs8900 DM9000... uIP LwIP ZlIP TinyTcp   。。。 qq 群:28221007…

查看全部问答>

ucos iar软件

我最近正在使用IAR 编写atmega128的ucos系统  不过在isr.r90文件中,有一句汇编语句 小弟不太懂  希望高人指教。 RSEG    CODE:CODE:NOROOT(0) 这条语句中的0代表什么意思?    在写中断汇编的时候, ...…

查看全部问答>

求助:怎样保留因WINCC非正常关闭而丢失的数据

各位工控朋友你们好 我现在遇到一个很棘手的问题,恳求高手指点!我所在的公司是一家啤酒酿造企业,前一段时间酿造车间引进一套发酵自动温控系统,用的是西门子的S7 412-2的PLC ,上位机组态软件是WINCC5.0。因生产工艺的要求,每个发酵罐要用几个 ...…

查看全部问答>

F5529捕获

想用F5529的4个捕获做声音定位,分别对应P1.2--P1.5,可为什么没有P1.2-P1.5C:\\Users\\king\\Desktop的引脚…

查看全部问答>

本人刚开始接触zigbee,请问有什么比较好的入门级资料?

如题,本人刚开始接触zigbee,找了一点资料看的云里雾里的,希望各位指导一下…

查看全部问答>

告诉你一些MSP430字节对齐的问题

最近在调试过程中,一直发现结构体中数据错位现象,但是仿真器查看,又都正确..无意中数了数缓存前面的变量,是奇数字节.改称偶数字节后,一切正常.. 例如: 奇数字节unsigned char Flag = 0;unsigned char U0RxBuf[512+32];//--------------------- ...…

查看全部问答>

[MsgOS]hello world!

本帖最后由 科技猎人 于 2016-6-16 18:17 编辑 [MsgOS]发个自己写的cortex-m单片机专用的操作系统 https://bbs.eeworld.com.cn/forum ... 2496&fromuid=703533 (出处: 电子工程世界-论坛) [MsgOS]让系统跑起来 https://bbs.eeworld.com.c ...…

查看全部问答>