找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机按键实现一个LED1灯的翻转等功能的程序问题

[复制链接]
跳转到指定楼层
楼主
ID:630714 发表于 2019-10-27 23:41 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
1.按键k2实现一个LED1灯的翻转
2.按键k3按下计时,松开按键,单片机串口发送按下的时间(单位ms)
3.LED2闪烁,周期为2s,其中亮1.5秒,灭0.5秒,要求时间准确。
第三个实现不了
# include<reg52.h>
# define uint unsigned int
# define uchar unsigned char

sbit key2=P3^4;
sbit key3=P3^6;
sbit LED1=P1^0;
sbit LED2=P1^1;

uint count1=0;
uint count2=0;

void delay(uint i)
{
        while(--i);        
}

void init()
{
        TMOD=0x21;
        TH0=0xfc;
        TL0=0x17;
        TH1=0xfd;
        TL1=0xfd;
        TR1=1;
        TR0=1;
        SM0=0;
        SM1=1;
        EA=1;
        ET0=1;
        ET1=1;
        ES=1;
}

void main()
{
        init();
        while(1)
        {
                if(key2==0)
                {
                        delay(10);
                        LED1=~LED1;
                        while(!key2);
                }
                if(key3==0)
                {        
                        while(!key3)
                        {
                                TH0=0xfc;
                                TL0=0x17;
                                count1++;
                        }
                        SBUF=count1;
                        if(TI==1)
                        {
                                TI=0;
                                count1=0;
                        }
                }               
        }        
}
void timer() interrupt 1
{
         TH0=0xfc;
         TL0=0x17;
         count2++;
         TF0=0;
         if(count2==500)
          LED2=~LED2;
         if(count2==2000)
         {
          LED2=~LED2;
          count2=0;
         }
}

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

使用道具 举报

沙发
ID:332444 发表于 2019-10-28 09:04 | 只看该作者
周期为2秒的话逻辑应该这样修改 if(count2==2000)count2=0; if(count2>=1500) LED2=~LED2;
回复

使用道具 举报

板凳
ID:213173 发表于 2019-10-28 10:06 | 只看该作者
给你改写,你试试。串口只能一次发送一个字节,uint count1=0; 16位数据需要分两次发送。
  1. #include<reg52.h>
  2. #define uint unsigned int
  3. #define uchar unsigned char

  4. sbit key2=P3^4;
  5. sbit key3=P3^6;
  6. sbit LED1=P1^0;
  7. sbit LED2=P1^1;

  8. uint count1=0;
  9. uint count2=0;
  10. uchar dat_A,dat_B;
  11. bit flag=0;

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

  16. void init()
  17. {
  18.         TMOD=0x21;
  19.         TH0=0xfc;                //1毫秒@11.0592MHz
  20.         TL0=0x66;
  21.         TH1=0xfd;
  22.         TL1=0xfd;
  23.         SM0=0;
  24.         SM1=1;
  25.         TR0=1;
  26.         TR1=1;
  27.         EA=1;
  28.         ET0=1;
  29. }

  30. void SendData(uchar dat)
  31. {
  32.         SBUF = dat; //发送当前数据
  33.         while(!TI);        //等待发送完毕
  34.         TI = 0;                //清除发送标志
  35. }

  36. void main()
  37. {
  38.         init();
  39.         while(1)
  40.         {
  41.                 if(key2==0)
  42.                 {
  43.                         delay(1000);
  44.                         if(key2==0)
  45.                         {
  46.                                 LED1=~LED1;
  47.                                 while(!key2);
  48.                         }
  49.                 }
  50.                 if(key3==0)
  51.                 {        
  52.                         delay(1000);
  53.                         if(key3==0 && flag==0)
  54.                                 flag=1;
  55.                 }
  56.                 else
  57.                 {
  58.                         if(flag==1)
  59.                         {
  60.                                 EA=0;//关中断
  61.                                 flag=0;
  62.                                 dat_A=count1;   //分解低8位
  63.                                 dat_B=count1>>8;//分解高8位
  64.                                 count1=0;
  65.                                 SendData(dat_A);//发送低8位
  66.                                 SendData(dat_B);//发送高8位
  67.                                 EA=1;//开中断
  68.                         }
  69.                 }               
  70.         }        
  71. }
  72. void timer() interrupt 1
  73. {
  74.         TH0=0xfc;
  75.         TL0=0x66;
  76.         count2++;
  77.         if(count2<1500)
  78.                 LED2=0;
  79.         else LED2=1;
  80.         if(count2>=2000)
  81.                 count2=0;

  82.         if(flag==1)
  83.                 count1++;       
  84. }
复制代码
回复

使用道具 举报

地板
ID:630714 发表于 2019-10-28 22:24 | 只看该作者
wulin 发表于 2019-10-28 10:06
给你改写,你试试。串口只能一次发送一个字节,uint count1=0; 16位数据需要分两次发送。

感谢感谢大佬为什么原来的第三问实现不了
回复

使用道具 举报

5#
ID:213173 发表于 2019-10-29 16:38 | 只看该作者
99899245 发表于 2019-10-28 22:24
感谢感谢大佬为什么原来的第三问实现不了

单独使用T0中断的闪烁灯程序可以完成,但这样写代码有漏洞。因为你开了没有必要的ET1=1;ES=1; 虽然没有写T1中断程序和串口中断程序,但T1约2us周期的高速中断请求会与T0中断冲突,有可能错过 if(count2==2000)而跑飞。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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