历史上的今天
返回首页

历史上的今天

今天是:2024年09月07日(星期六)

2020年09月07日 | PIC12F629单片机定时器1控制3个LED循环源程序,且时间可调

2020-09-07 来源:51hei

PIC12F629不用外振即可正常运行,低成本首选,原理如下:按键按一次LED1低亮,按两次LED2亮,按三次LED3亮,一直循环, 按键长按3秒松开则可以计入自动循环模式,再次长按3秒则退出,进入待机模式;2脚接轻触开关到地,可以做为设置键(原理图来自网上故VDD接﹢5V,漏画,SET设置键没有画,有时间修正下原理图),用来设置每个LED亮的时间,互不影响!源码已经编译通过,洞洞板做了一个PCB, 正常运行,新手贴勿喷。


单片机源程序如下:

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

设计要求:按一次按键是打开第一个摄像头,按两次开第二个摄像头,按三次打开第三个摄像头,

长按3秒则开启循环模式,每次开启时间30秒,一直循环,直到按下按键为止.

* IC: PIC12F629        OSC: 片内4MHz

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

#include


#define uchar unsigned char

#define uint unsigned int


#define LED1  GPIO0

#define LED2  GPIO1

#define LED3  GPIO2

#define KEY    GPIO4

#define SET    GPIO5


           


__CONFIG(FOSC_INTRCIO & WDTE_ON & PWRTE_ON & MCLRE_OFF &  BOREN_ON);


/*********  配置字 ************/



void interrupt ISR( void) ;

void delay(uint x);

void IOinit (void) ;

void TMR1init(void) ;


uint  time = 0;

uint  t =0;

uchar cnt =0;

uchar  cnt1 = 0;

uchar  cnt2 = 0;

uchar  i , k = 0;



void IOinit (void)

{

       PCON = 0X00;                  // 电源控制全关

       CMCON = 0X07;               //关模拟器

         TRISIO = 0X38;                // 00111000 GP<5:3>输入 GP<2:0>输出

         GPIO = 0X3F;                   // 00111111 GP<2:0>输出高电平

         WPU = 0X30;                   // GP<5:4>内部弱上拉开启

         IOC = 0X30;                     //GP<5:4>端口电平变化中断使能

  }



void TMR1init (void)

{

       OPTION_REG = 0X0F;     //  PSA =1, PS2:PS0 =111  开看门狗  预分频128 其余的关

         INTCON = 0XC0 ;              // GIE = 1 , PEIE = 1    开全局中断  开外设中断  其余的关

         PIE1 = 0X01;                    // 外设中断使能

         PIR1 = 0X00;                    // TMR1IF = 1   开TIMR1 外设中断标志位,需要软件清零

         TMR1H = 0X3C;               //TIMER1初值 溢出时间是50000(50ms)

         TMR1L = 0XB0;               // 65536- 50000 = 15536 (0x3CB0)

         T1CON = 0X01;                 // 开TIMR1

}







void main ( )

{   

      IOinit () ;

      TMR1init() ;


//主循环

    while(1)

    {      

           if(i==0 )

              {

                 if(SET==0)

                    {

                    delay(10);

                    if(SET==0)

                        {

                        

                        while(!SET);

                        k=!k;

                        cnt=0;

                        cnt1=0;

                        LED3=!LED3;

                         }

                      }

           

               }

            if(KEY == 0)        //如果按键按下

              {   

                     delay(20);

                     if(KEY == 0)

                       {  

                        time = 0;        //延时标志位清零

                        while(!KEY);    //等待按键被松开,由中断函数计数


                        if(time<40)     //按下时间不足50ms*40=2000毫秒(2秒)

                           {

                               if (k==0)

                                  {

                                     cnt1++;      //按键次数加1,改变工作状态

                                     if(cnt1>3)  cnt1 = 0;

                                    }

                               else if( k==1)  

                                     {

                                     cnt++;

                                     if (cnt>10) cnt=0;

                                     t=cnt*100;

                                     LED1 =0;

                                     delay(20);

                                     LED1 =1;

                                      }

                               }

                         if(time >= 40 && time < 100)   //按住时间2秒到5秒之间

                             {

                                                i = !i;

                                                time =0;

                                                cnt2 =0;

                                                cnt1=0;

                                        }

                         else if (time >=100)

                              {

                               break;

                              }

                          }

                      

                                            

                  }

             if (k==0 )  

                 {

                           if (i == 1)

                         { switch (cnt2)

                           { case 0:

                          

                            GPIO  =0X3E;  //00111110  开1号继电器

                            break;

推荐阅读

史海拾趣

Hind Rectifiers Ltd公司的发展小趣事

故事一:Hind Rectifiers Ltd.的起源与早期发展

Hind Rectifiers Ltd.成立于1958年,自那时起,它便与Westinghouse、Brake & Signal(英国)等知名企业建立了深厚的合作关系。这家公司在电力半导体、电力电子设备和铁路运输设备的开发、设计、制造与销售方面,迅速积累了丰富的经验和技术实力。早期,Hind Rectifiers通过不断的技术引进与自主研发,逐步确立了其在印度电力电子行业中的领先地位。其产品线逐渐丰富,包括但不限于整流器、逆变器等关键电力电子元件,为印度乃至全球的工业发展提供了重要支持。

故事二:市场拓展与国际化战略

随着印度经济的快速增长和工业化进程的加速,Hind Rectifiers Ltd.积极实施市场拓展战略。公司不仅巩固了在国内市场的地位,还逐步将目光投向了国际市场。通过参加国际展会、建立海外销售网络等方式,Hind Rectifiers的产品远销至多个国家和地区。同时,公司还加强了与国际知名企业的合作,共同研发新技术、新产品,进一步提升了其国际竞争力。

故事三:技术创新与产品升级

技术创新是Hind Rectifiers Ltd.持续发展的核心动力。公司不断加大研发投入,引进先进生产设备和技术人才,致力于电力电子产品的更新换代和技术升级。近年来,Hind Rectifiers成功推出了多款高性能、高效率的电力电子产品,如高效能整流器、智能逆变器等,这些产品不仅满足了市场对高品质电力电子产品的需求,还为公司带来了显著的经济效益和社会效益。

故事四:应对市场波动与供应链管理

面对全球经济的波动和供应链的不确定性,Hind Rectifiers Ltd.展现了其强大的应对能力。公司通过建立多元化的供应链体系、加强与供应商的合作与沟通、优化库存管理等方式,有效降低了市场风险。同时,公司还注重提升内部管理水平,加强成本控制和质量管理,确保了在复杂多变的市场环境中保持稳健发展。

故事五:社会责任与可持续发展

作为一家具有社会责任感的企业,Hind Rectifiers Ltd.始终将可持续发展视为其发展的重要方向。公司积极参与社会公益事业,关注环境保护和能源节约。通过推广绿色制造、节能减排等措施,Hind Rectifiers为印度乃至全球的可持续发展贡献了自己的力量。同时,公司还注重员工培训和职业发展,为员工提供了良好的工作环境和发展平台,促进了企业与员工的共同成长。

长工微电子公司的发展小趣事

长工微电子的发展得到了行业内外的高度认可。自成立以来,公司荣获了多项荣誉,包括广东省科技型中小企业、松山湖集成电路设计企业、国家高新技术企业、最具潜力中国模拟IC设计公司、中国集成电路创新创业大赛总决赛第二名等。这些荣誉不仅彰显了公司的实力,也为公司的发展注入了强大的动力。

ABI Electronics公司的发展小趣事

ABI Electronics公司的起点可以追溯到其对电路板测试技术的深入研究。在创立初期,ABI便以开发出高精度、高效率的电路板故障检测仪为目标。通过对电路板测试技术的不断钻研和创新,ABI成功推出了一系列性能卓越的测试设备,这些设备不仅提高了电路板测试的准确性和效率,也极大地降低了测试成本,赢得了市场的广泛认可。

超霸(GP)公司的发展小趣事

绿索超容在追求经济效益的同时,始终不忘履行社会责任。公司积极响应国家绿色发展的号召,致力于环保事业和可持续发展。在产品研发和生产过程中,绿索超容始终坚持绿色、低碳、环保的理念,采用环保材料和工艺,减少对环境的影响。此外,公司还积极参与社会公益活动,为社会贡献自己的力量。这些举措不仅提升了绿索超容的企业形象,也为其在电子行业中树立了良好的口碑。

Advanced Electronic Packaging公司的发展小趣事

随着公司技术的不断进步,Advanced Electronic Packaging公司开始寻求与行业内知名厂商的合作机会。通过与一家全球领先的电子产品制造商达成战略合作,公司成功将其先进的封装技术应用于对方的高端产品线中。这一合作不仅提升了合作双方的产品竞争力,还为Advanced Electronic Packaging公司带来了可观的利润回报。此后,公司陆续与多家知名企业建立了合作关系,进一步巩固了其在电子封装领域的市场地位。

HELUKABEL公司的发展小趣事

面对电子行业的快速发展和不断变化的市场需求,Advanced Electronic Packaging公司始终保持敏锐的洞察力和强烈的创新意识。公司不断加大研发投入,推动封装技术的持续创新。从最初的单一材料封装,到后来的多功能复合封装,再到如今的智能化封装技术,公司的每一次创新都引领着电子封装行业的发展潮流。这些创新成果不仅提升了产品的附加值,还推动了整个电子产业的升级换代。

问答坊 | AI 解惑

关于低能耗嵌入系统内存功耗请教

最近小弟在构思一个系统遇到了一些麻烦的问题,忘知者赐教。 系统有能耗要求,整个mcu处理单元(包括mcu外围)平均电流要限制在50ma以内。mcu目前占时还没有定下来,选择对象是stm32系列,atmel的xmega系列和avr32系列。系统需要大量的高速缓存, ...…

查看全部问答>

6410 NK运行与USB下载问题?

我现在自己做了块6410的板子,现在的情况是这样的:在三星提供的BSP中,NK有三种速度,第一种是532MHz,133MHz,66.5MHz,第二种是600MHz,150MHz,75MHz,第三种是666MHz,133MHz,66.5MHz。我用第1和第3种运行NK运行都有问题,刚开始就会出再好多报错, ...…

查看全部问答>

关于头文件中寄存器的宏定义,请教!

在看2410的头文件,发现其中有些寄存器用*(volatile unsigned char *) 来定义,而有一些用*(volatile unsigned  *) 来定义,这是为什么呢?这两个有什么区别呢?…

查看全部问答>

手机电池待机时间短已成消费者最大诟病

本帖最后由 jameswangsynnex 于 2015-3-3 19:59 编辑 屏幕越大待机时间越短 已成消费者最大诟病 手机电池标准统一咋就这么难 中国消费者协会日前发布2009年全国手机消费者满意指数测评情况显示,消费者对手机电池待机时间短最为不满。 如果说待 ...…

查看全部问答>

STM32&JavaVM

STM32性能足够跑简单的JAVA应用…

查看全部问答>

[求教]关于DS18B20的问题

小弟做项目时用到DS18B20,随盘资料的例程有一处我总觉得有问题,大家帮我看看是不是。 unsigned char ID[5][8]; //ID[5][8]为检索到的地址 unsigned char TEMP_NUMBER; //温度传感器数量 unsigned int TEMP[5]; //温 ...…

查看全部问答>

MSP430实现语音提示功能

在银行自动提款时,都有语音提示,前几天农行的帅哥还把提示音换成了TOM猫的搞笑声音,我想问一下怎样将人声转换成c代码,然后利用DA输出至喇叭,实现语音提示。可是在网上没有找到转换软件。网上有蜂鸣器的代码转换软件,(http://download3.pudn. ...…

查看全部问答>

在430里,这个怎么就是错的呢??求解释

uint welcome[ ][16]= { 最多能有多少个元素 };…

查看全部问答>

传感器与变送器的不同之处

传感器是能够受规定的被测量并按照一定的规律转换成可用输出信号的器件或装置的总称,通常由敏感元件和转换元件组成。当传感器的输出为规定的标准信号时,则称为变送器。    变送器的概念是将非标准电信号转换为标准电信号的仪器,传感器则是 ...…

查看全部问答>

Autium Design 中 如何一次性把PCB中的所有线都删除??

Autium Design 中  如何一次性把PCB中的所有线都删除?? …

查看全部问答>