找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 9054|回复: 3
打印 上一主题 下一主题
收起左侧

单片机按键点动与自锁的proteus仿真及源程序

[复制链接]
跳转到指定楼层
楼主
单片机按键点动与自锁,按下后三秒自锁,再按一下断开,下面是原理图:



仿真工程文件及所有完整程序等资料下载地址(压缩包一共有45个单片机仿真,全部下载后找到这个项目即可):
http://www.51hei.com/bbs/dpj-56298-1.html


单片机源码:
  1. /********************************************************************
  2.                             天马电子
  3. *********************************************************************/

  4. #include<reg52.h>   
  5. /*****************************************************************
  6.                  宏定义字符型和整型
  7. *****************************************************************/
  8. #define uchar unsigned char
  9. #define uint  unsigned int
  10. /*****************************************************************
  11.                 键值定义
  12. *****************************************************************/
  13. sbit IN0=P2^0;         //         按键输入0
  14. sbit OUT0=P1^0;         //         按键输出0

  15. sbit IN1=P2^1;         //         按键输入1
  16. sbit OUT1=P1^1;         //         按键输出1

  17. uchar sec; //定义计数值,每过1/10 秒,sec 加一
  18. uchar keycnt=2;//按下次数值
  19. uint tcnt; //键值判断
  20. uchar t=0;
  21. //uchar s=0;
  22. //uchar s1=0;
  23. /********************************************************************
  24.                             延时消抖函数
  25. *********************************************************************/
  26. void delay(uchar t)
  27. {
  28.   uchar i,j;
  29.    for(i=0;i<t;i++)
  30.    {
  31.             for(j=13;j>0;j--);
  32.          { ;
  33.          }
  34.    }
  35. }
  36. /********************************************************************
  37.                             按键扫描函数
  38. *********************************************************************/
  39. void KEY() //按键扫描程序
  40. {

  41. if(IN0==0)           //当按键按下执行
  42.         {
  43.         delay(20); //消抖
  44.         keycnt=0;  //解锁
  45.         if(IN0==0) //确定按键按下
  46.                 {
  47.                 TR0=1; //开始定时
  48.                 OUT0=0;//指示灯亮
  49.                 while(!IN0);//等待输入0置位
  50.                 OUT0=1;//指示灯灭
  51.                 if(t==1) //如果定时时间到
  52.                 {
  53.                 keycnt=1;
  54.             t=0;
  55.                 TR0=0; //定时结束
  56.                 tcnt=0;
  57.                 sec=0;
  58.                 }
  59.                 TR0=0; //定时结束
  60.                 tcnt=0;
  61.                 sec=0;
  62.                 }
  63.         }
  64. if(IN1==0)
  65.         {
  66.         delay(20);
  67.         keycnt=2;  //解锁
  68.         if(IN1==0)
  69.                 {
  70.                 TR0=1; //开始定时
  71.                 OUT1=0;
  72.                 while(!IN1);
  73.                 OUT1=1;
  74.                 if(t==1)
  75.                 {
  76.                 keycnt=3;
  77.             t=0;
  78.                 TR0=0; //定时结束
  79.                 tcnt=0;
  80.                 sec=0;
  81.                 }
  82.                 TR0=0; //开始定时
  83.                 tcnt=0;
  84.                 sec=0;
  85.                 }
  86.         }

  87. }        
  88. /********************************************************************
  89.                             按下次数判断函数
  90. *********************************************************************/
  91. void jianzhi()
  92. {
  93. switch(keycnt) //按下次数判断
  94.                         {
  95.                         case 0: OUT0=1;break; //输出解锁
  96.                         case 1: OUT0=0;break; //输出自锁
  97.                         case 2: OUT1=1;break; //输出解锁
  98.                         case 3: OUT1=0;break; //输出自锁
  99.                         }
  100. }
  101. /********************************************************************
  102.                             定时中断服务函数
  103. *********************************************************************/
  104. void t0(void) interrupt 1 using 0 //定时中断服务函数
  105. {
  106.         TH0=0x06; //对TH0 TL0 赋值
  107.         TL0=0x06;
  108.         tcnt++; //每过250ust tcnt 加一
  109.         if(tcnt==400) //计满400 次(1/10 秒)时
  110.         {
  111.                 tcnt=0; //重新再计
  112.                 sec++;
  113.                 if(sec==20) //定时2 秒,在从零开始计时
  114.                 {
  115.                 t=1;
  116.                 //sec=0;         
  117.                 //t++;
  118.             //keycnt=t%2;
  119.             //if(t==100)t=0;
  120.                 }
  121.         }
  122. }
  123. /**********************************************************************
  124.                                            初始化I/O                                   
  125. **********************************************************************/
  126. void Init_IO(void)             //初始化I/O口
  127. {

  128.         OUT0=1;//输出灯熄灭
  129.         OUT1=1;//输出灯熄灭

  130. }
  131. /********************************************************************
  132.                             主函数
  133. *********************************************************************/
  134. void main()

  135. {
  136.         TMOD=0x02; //定时器工作在方式2
  137.         ET0=1;
  138.         EA=1;
  139.         TH0=0x06; //对TH0 TL0 赋值
  140.         TL0=0x06;
  141.         //TR0=1; //开始定时
  142.         Init_IO();

  143.         while(1)/*永远为真,一直执行下去*/
  144.         {
  145.         KEY();           //取键函数
  146.         jianzhi(); //执行函数
  147.         }
  148. }
  149. /********************************************************************
  150.                               结束
  151. *********************************************************************/
复制代码



分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏3 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:301491 发表于 2018-5-21 10:51 | 只看该作者
感谢分享!!!!!!!
回复

使用道具 举报

板凳
ID:331575 发表于 2018-5-22 21:37 | 只看该作者
简单实用 谢谢
回复

使用道具 举报

地板
ID:66287 发表于 2018-7-25 15:27 | 只看该作者
已验证通过,感谢分享!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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