历史上的今天
返回首页

历史上的今天

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

正在发生

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

2019-11-12 来源:51hei

基于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,选通数码管的千位进行显示

推荐阅读

史海拾趣

艾吉芯(Agertech)公司的发展小趣事

随着公司业务的不断扩展,艾吉芯公司积极寻求与行业内其他企业的战略合作。通过与国内外知名电子企业的合作,艾吉芯成功将其产品应用于更广泛的领域,进一步拓宽了市场渠道。这些合作不仅提升了艾吉芯的品牌影响力,还为其带来了更多的商业机会和发展空间。

Antelec公司的发展小趣事

Antelec公司创立于XXXX年,由一群富有远见和热情的电子工程师组成。创立初期,公司专注于研发先进的电子测量与分析技术,成功开发出一种具有高精度和稳定性的测量仪器,填补了市场上的空白。这一技术突破不仅赢得了客户的青睐,也为公司的后续发展奠定了坚实的基础。

Electro Technik Industries公司的发展小趣事

ETI公司成立于20世纪初,当时电子产业正处于起步阶段。创始人张三看准了电子技术的巨大潜力,决定投身其中。然而,初创时期资金短缺、技术落后、市场竞争激烈等问题让ETI步履维艰。张三凭借着对电子技术的热情和不懈的努力,带领团队不断研发新产品,拓展市场,最终使ETI在电子行业中崭露头角。

FTDI [Future Technology Devices International Ltd.]公司的发展小趣事

FTDI的创立可以追溯到1992年3月13日,由弗雷德·达特(Fred Dart)领导创建。初期,公司专注于为个人电脑市场提供服务,特别是针对主板芯片组的解决方案。FTDI的首发产品就得到了IBM等知名企业的青睐,这些芯片被成功应用于AMBRA和PS/2系列个人电脑中,为当时快速发展的计算机技术贡献了重要力量。这一早期成功奠定了FTDI在电子行业中稳固的基础。

Excelsys公司的发展小趣事

Excelsys公司自创立之初,就致力于电源管理技术的研发。在电子行业中,电源管理一直是影响产品性能和可靠性的关键因素。公司团队通过不断的技术创新,推出了一系列高性能、高效率的电源管理产品,赢得了市场的广泛认可。特别是在智能设备日益普及的背景下,Excelsys的电源管理解决方案为各种智能设备提供了稳定可靠的电力支持,助力了行业的发展。

DBM Optix公司的发展小趣事

随着全球对环保和可持续发展的重视,DBM Optix也积极响应这一趋势。公司在生产过程中注重节能减排、降低废弃物排放等措施,同时积极开发环保型产品,以满足客户对绿色环保的需求。此外,DBM Optix还积极参与各种环保活动和社会公益事业,为推动电子行业的可持续发展贡献自己的力量。这些举措不仅提升了公司的社会形象,也为公司的长远发展奠定了坚实的基础。

问答坊 | AI 解惑

机器人 转一个国外的机器人项目

http://66.249.89.132/translate_c?hl=zh-CN&sl=en&u=http://www.robotroom.com/Jet.html&prev=/search%3Fq%3DC51%2Bcompiler%26hl%3Dzh-CN%26client%3Daff-cs-360se%26hs%3Dbtg%26sa%3DN%26start%3D50%26newwindow%3D1&usg=ALkJrhhLTO9Bj7aM9-ySHE ...…

查看全部问答>

PCB设计注意事项

  一.焊盘重叠 焊盘(除表面贴装焊盘外)的重叠,也就是孔的重叠放置,在钻孔时会因为在一处多钻孔导致断钻头、导线损伤。 二.图形层的滥用 1. 违反常规设计,如元件面设计在BOTTOM层,焊接面设计在TOP,造成文件编辑时正反面错误。 2. PCB ...…

查看全部问答>

版主,能发给我一份,28015可以用的 chip support package(csp)吗?

版主,能发给我一份,28015可以用的  chip support package(csp)吗?网上一直找不到这个东东,可以麻烦版主,或者哪位朋友有发给我一份吗? z_s_rong@126.com 谢谢。…

查看全部问答>

【求助】各位大侠帮帮忙,我快郁闷死了!!

faceb4: 我在做msp430驱动sed1335来显示320*240的液晶显示屏,程序怎么都不行,希望那位大侠能够给一些程序(包括初始化),谢谢了!!! …

查看全部问答>

HA12002 有关问题

喇叭保护IC HA12002 的过载保护(第六脚)如何接入(需多少电压),第5脚(交流检测)参数如何设定,可否直接短路?谢谢大侠们细心指导!!!(从报废的功放中得到了一块喇叭保护板,想用在自己DIY的功放中)…

查看全部问答>

友善之臂mini2440转手

卖掉...友善之臂mini2440开发板3.5寸LCD触摸屏S3C24...有木有人想要... [img]file:///C:/Users/吴斌/Documents/Tencent%20Files/874901774/Image/d[$%7B6@z@6duwe33y%25l9~%250z.jpg[/img] file:///C:/Users/吴斌/Documents/Tencent%20Files/8749 ...…

查看全部问答>

悲剧的Nios 12.0

最近一直想给EE_FPGA做个集成化的测试程序,思来想去还是nios开发简单点,尼玛,悲剧的事情发生了。。 我做了一遍一遍,就是不对,怎么都下载不到sdram里面去。真的是黔驴技穷了啊。。 我开始怀疑编译器了,我换成了nios 11.0 ;NND,就神奇的好 ...…

查看全部问答>

launch pad USB串口驱动在win8 64bit 跑串口不稳定

环境1. 硬件 430 launchpad with touch board2. 下载了touch board的软件包slac490,安装里面的usb驱动LaunchPad_Driver3. CCS5.5.0 4. win8 64bit现象1. CCS可以连接并debug2. 硬件管理器里面可以看到USB映射com3. 将launch pad 串口收发短接(去 ...…

查看全部问答>

【高薪诚聘】硬件工程师、嵌入式开发【成都】

成都成我科技有限公司高薪诚聘硬件工程师、嵌入式开发, 良好的福利和发展前景邀您加盟~ 工作地点:成都天府软件园 联系方式:11093753@qq.com(请将简历发送至此邮箱或加QQ详谈) 嵌入式工程师 岗位职责: 1. 根据需求裁剪Linux 2. 调试摄 ...…

查看全部问答>