找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4564|回复: 0
收起左侧

3种按键实现不同功能的单片机源程序

[复制链接]
ID:553020 发表于 2019-7-19 17:27 | 显示全部楼层 |阅读模式
此程序为本人以前刚学时候编写的,还存在许多未经优化的地方,也没有多少注释,请多担待。
功能如下:
1、按下k1,流水灯闪烁。
2、按下k2,开始从20开始计时。
3、按下k3,停止计时,开始累加。

[W8WPN[Q62QXM5XMT3[34.png


以下为部分程序:
  1. #include  "reg52.h"
  2. #include "intrins.h"
  3. #define led P1   //定义LED
  4. sbit k1=P0^0;
  5. sbit k2=P0^1;
  6. sbit k3=P0^2 ;         //定义按键
  7. char code smguan[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};  //数字定义
  8. #define num1   P2
  9. #define num2   P3//定义数码管管脚
  10. int a=0,b=2;
  11. int c=0;d=2;

  12. void delay(int i)
  13. {
  14.   while(i--);
  15. }


  16. void delay800ms()   //误差 0us
  17. {
  18.     unsigned char a,b,c;
  19.     for(c=95;c>0;c--)
  20.         for(b=138;b>0;b--)
  21.             for(a=29;a>0;a--);
  22.     _nop_();  //if Keil,require use intrins.h
  23.     _nop_();  //if Keil,require use intrins.h
  24. }

  25. void twinkle()
  26. {
  27.         
  28.   if(k1==1)                  //检测按键K1是否按下
  29.         {        
  30.                 delay(1000);   //消除抖动 一般大约10ms
  31.                 if(k1==1)         //再次判断按键是否按下
  32.                 {        
  33.                                 while(1)
  34.                                 {led=0xaa;
  35.                            delay(50000);
  36.                                  led=~led; //led状态取反
  37.                                  delay(50000);
  38.                                         if((k2==1)||(k3==1))break;
  39.                                 }
  40.                 }
  41.         }        
  42. }        


  43. void Timer1Init()
  44. {
  45.         TMOD|=0X10;//选择为定时器1模式,工作方式1,仅用TR1打开启动。

  46.         TH1=0XFC;        //给定时器赋初值,定时1ms
  47.         TL1=0X18;        
  48.         ET1=1;//打开定时器1中断允许
  49.         EA=1;//打开总中断
  50.         TR1=1;//打开定时器                        
  51. }


  52. void time()
  53. {        
  54.         if(k2==1)                  //检测按键K2是否按下
  55.         {        
  56.                 delay(1000);   //消除抖动 一般大约10ms
  57.                 if(k2==1)         //再次判断按键是否按下
  58.                 {        
  59.         Timer1Init();  //定时器1初始化
  60.                
  61.                 }
  62.         }

  63. }


  64. void Timer1() interrupt 3
  65. {
  66.         static int i;
  67.         TH1=0XFC;        //给定时器赋初值,定时1ms
  68.         TL1=0X18;
  69.         i++;
  70.         if(i==1000)
  71.         {

  72.                 i=0;
  73.                 num2=smguan[a++];
  74.                 num1=smguan[b];
  75.                 if(a==10)        
  76.                 {
  77.                   a=0;
  78.                         if(b==5)
  79.                         {
  80.                           b=2;
  81.                         }
  82.                         else b++;
  83.                 }         
  84.         }        
  85.         if((k1==1)||(k3==1))TR1=0;
  86. }

  87. void Timer0Init()
  88. {
  89.         TMOD|=0X01;//选择为定时器0模式,工作方式1,仅用TR0打开启动。

  90.         TH0=0XFC;        //给定时器赋初值,定时1ms
  91.         TL0=0X18;        
  92.         ET0=1;//打开定时器0中断允许
  93.         EA=1;//打开总中断
  94.         TR0=1;//打开定时器                        
  95. }


  96. void leijia()
  97. {
  98.         while(1){
  99.                 if(k3==1)                  //检测按键K1是否按下
  100.         {
  101.                    delay(80);   //消除抖动 一般大约10ms
  102.                  if(k3==1)         //再次判断按键是否按下
  103.                 { num2=smguan[c];
  104.                         num1=smguan[d];
  105.                         c=c+1;
  106.                  if(c==10)        
  107.                 {
  108.                   c=0;
  109.                         if(d==5)
  110.                         {
  111.                           d=2;
  112.                         }
  113.                         else d=d+1;
  114.                 }        

  115.    }
  116. }delay(20000);
  117.         if((k1==1)||(k2==1)){c=0;d=2;break;}
  118. }
  119. }

  120. void main()
  121. {
  122.   while(1)
  123.         {
  124.           twinkle();
  125.           time();
  126.                 leijia();
  127.         }        
  128. }
复制代码
新建 Microsoft Word 文档.docx (15.15 KB, 下载次数: 5)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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