一乐电子

一乐电子百科

 找回密码
 请使用微信账号登录和注册会员

QQ登录

只需一步,快速开始

快捷登录

手机号码,快捷登录

搜索
查看: 4403|回复: 6
收起左侧

[pic] 用单片机做一个简单的开关延时电路

[复制链接]
发表于 2015-1-27 12:48 | 显示全部楼层 |阅读模式
这是一个 用 PIC12F629 单片机做的一个简单的延时电路, 程序已经在 XC8 编译环境下调试通过, 本程序没有使用 时钟,
中断等资源, 尽量降低对单片机内部知识的了解, 方便使用者根据自身的需求修改程序.
======================================================================
#include <xc.h>   /* XC8 General Include File */
#pragma config  BOREN = OFF, MCLRE = OFF, WDTE = OFF, PWRTE = ON, FOSC = INTRCIO
#define LED1  GPIO5   //定义LED灯所在的管脚
#define KEY1  GPIO4   //定义按键管脚

unsigned char KEY_press_mk;
unsigned int  KEY_press_num;

void interrupt isr(void)
{ unsigned int  k;
   k=0;
}
void  Delay_1000ms(void)
{ unsigned int  k;
   k=42940;   while (--k) ;
   k=42940;   while (--k) ;
   // 整数 k,  42940=5000ms, 1718---20ms
}
void  Delay_20ms(void)
{ unsigned int  k;
   k=1718;  while (--k) ;
}
void  Delay_1ms(void)
{ unsigned char  t1, t2;
   // 字符变量t1=171+171 ---> 1ms
   t1=171;  while (--t1) ;
   t1=171;  while (--t1) ;
}
void  MCU_Init(void)  //单片机初始化程序
{ unsigned char  c1, c2;
     CMCON=0x07;   //关闭模拟比较器,使GP<2:0>为数字IO
     c1=OPTION_REG;
     OPTION_REG=c1&0x7f; //GPPU_bit=0, 允许弱电上拉(全局)
     WPU=0x37;     //GP5,GP4,  GP2,GP1,GP0 弱电上拉,
     GIE=0;        //关闭中断
     PEIE=0;
}

void   main(void)
{ unsigned int  k;
     MCU_Init(); //单片机初始化程序

//********* 下面程序, 使用者根据自身的需要, 进行适当的修改 ***********
     //定义GP5为输出, 没定义的管脚, 缺省值为输入
     TRISIO=0b11011111;

     //初始化一些变量
     KEY_press_num=0;
     KEY_press_mk=0;
     LED1=0;

next_1:
     //KEY_press_num 的值, 根据测试的参数, 进行适当的修改
     if (KEY1==0) KEY_press_num++;  else KEY_press_num=0;
     if (KEY_press_num>15000) { KEY_press_mk=1; KEY_press_num=0; }

     //下面是按键之后, 需要做的事情, 按一下按键, 亮3秒
     if (KEY_press_mk) {
         KEY_press_mk=0;
         LED1=1; //LED灯亮
         Delay_1000ms();
         Delay_1000ms();
         Delay_1000ms();
         LED1=0; //LED灯熄
     }
     goto next_1; //循环
}
====================================================================== PIC12F629简单延时开关电路图.png

PIC12F629管脚.png






发表于 2015-1-28 10:15 | 显示全部楼层
挺复杂的
发表于 2016-2-12 02:21 | 显示全部楼层
写个延时子程序,几句话就搞定了,有需要这么复杂吗?
发表于 2016-2-20 22:28 | 显示全部楼层
我和楼上的观点一样,这么简单的功能,程序应该不需要那么长吧
 楼主| 发表于 2016-2-21 12:01 | 显示全部楼层
    既然有网友觉得上述程序太复杂了,在此对程序做个简单的说明
-------------------------------------------
  这二句可以不要, 直接使用 GPIO4,GPIO5, 不过这样程序改动不方便了
  #define LED1  GPIO5   //定义LED灯所在的管脚
  #define KEY1  GPIO4   //定义按键管脚
-------------------------------------------
  这是中断子程序,可以不要, 为方便用户改动程序功能而设立
  void interrupt isr(void)...
{ unsigned int  k;
    k=0;
}
下面是 单片机硬件初始化程序,必不可少
void  MCU_Init(void)
-------------------------------------------
三个延时子程序,理论上可以只要一个, 但实际上如果调用100次 Delay_1ms(),
可能只有95ms或105ms,
void  Delay_1000ms(void)
void  Delay_20ms(void)
void  Delay_1ms(void)
-------------------------------------------
这二句为按键可靠性而设置, 通常做法是按键按下一定时间后, 才确认按键<按下>了
if (KEY1==0) KEY_press_num++;  else KEY_press_num=0;
if (KEY_press_num>15000) { KEY_press_mk=1; KEY_press_num=0; }
-------------------------------------------

    其他的程序部分, 确实不能再少了, 单片机编程, 比单纯的C语言编程,  多出了单片机硬件初始化的过程(必不可少). 麻雀虽小, 五脏俱全。为了点亮一盏灯
(语句:LED=1), 为了把程序烧录进单片机并正确运行, 连头带尾, 还真是有一堆"多余"的语句。不过,当你下次写程序时, 在原有的(成功的)的程序基础上改动,就很方便了。
   我们写程序,是给别人看的,所以非常强调可读性; 把不同的功能部分区分开,方便使用者增加/减少功能; 同时要尽量确保程序是可靠的。

发表于 2016-2-22 16:06 | 显示全部楼层
谢谢分享,学习了。
发表于 2017-9-16 15:30 | 显示全部楼层
谢谢楼主,楼主是个用心做事的人

本版积分规则

QQ|一淘宝店|手机版|商店|电子DIY套件|一乐电子 ( 粤ICP备09076165号 ) 公安备案粤公网安备 44522102000183号

GMT+8, 2024-3-29 20:35 , Processed in 0.051065 second(s), 35 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表