找回密码
 立即注册

QQ登录

只需一步,快速开始

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

为什么程实现不了,是哪里有错误呢

[复制链接]
跳转到指定楼层
楼主
刚学51单片机,写了一个通过按键减小输出方波的占空比的程序,按下K1在原有方波基础上减小10%占空比,按下K2在原有方波基础上减小20%的占空比,在未按任何按键之前有输出周期为10ms的方波,晶振频率为12Mhz。但是在按下按键之后占空比变化超出设计,为什么会这样呢?
  1. #include<reg52.h>
  2. unsigned char P10ms=0;                          //定义10ms计数器,并清零赋值
  3. typedef unsigned char u16;
  4. sbit K1=P3^1;                                          //独立按键K1的端口定义
  5. sbit K2=P3^2;                                          //独立按键K2的端口定义
  6. sbit P10=P2^0;                                          //定义P1为P2^0从21引脚输出
  7. void delay(u16 t)                                 //延时函数
  8. {
  9.     while(t--);
  10. }
  11. void keypress1()                                         //定义按键1函数
  12. {
  13.    if(K1==0)                                          //判断K1是否按下
  14.    {
  15.       delay(1000);                                //消抖
  16.           if(K1==0)
  17.           {
  18.              TH1=0x06;                                  //重置T1定时初值为25us
  19.                  TL1=0x06;                     //重置T1定时初值为25us
  20.                  if(P10==1) P10=0;            //若P1.0为高电平,则P1.0转为低电平
  21.                  else
  22.                      {
  23.                            P10ms++;                         //若1.0位低电平,则1ms计数
  24.                            if(P10ms==36)        //判断9ms是否满足,及实现减小10%的占空比
  25.                            {
  26.                              P10=1;                 //满足9ms,P1.0转为高电平
  27.                                  P10ms=0;          //10ms计数器清零
  28.                                  }
  29.                          }
  30.            }
  31.         }
  32. }

  33. void keypress2()                                   //定义按建2函数
  34. {
  35.    if(K2==0)                                           //判断K2是否按下
  36.    {
  37.       delay(1000);                 //消抖
  38.           if(K2==0)
  39.           {
  40.              TH1=0x06;                      //重置T0定时初值为25us
  41.                  TL1=0x06;                      //重置T0定时初值为25us
  42.                  if(P10==1) P10=0;              //若P1.0为高电平,则P1.0转为低电平
  43.                  else
  44.                      {
  45.                            P10ms++;                          //若1.0位低电平,则1ms计数
  46.                            if(P10ms==32)         //判断是否达到8ms,即实现减小20%的占空比
  47.                            {
  48.                              P10=1;                         //满足8ms,P1.0转为高电平
  49.                                  P10ms=0;                 //10ms计数清零
  50.                            }
  51.                          }
  52.            }
  53.         }
  54. }
  55. void main()
  56. {
  57.   TMOD=0x20;                     //TMOD=00100000B,置T1定时器方式2
  58.   TH1=0x06;                     //置T1定时初值250us
  59.   TL1=0x06;                                                //置T1定时初值250us
  60.   IP=0x08;                           //IP=00001000B,置T1为高优先级
  61.   IE=0xff;                          //IE=11111111B,全部开中
  62.   TR1=1;                         //T1运行
  63.   P10=0;                        //脉冲方波初始输出为低电平
  64.   while(1);                       //无限循环,等待T1中断
  65. }
  66. void t1() interrupt 3
  67. {
  68.    if(K1==1&&K2==1)                   //判断K1和K2是否按下,
  69.    {
  70.     P10ms++;                           //开始计数
  71.     if(P10ms==20)        //若10ms计数器到位,则
  72.     {
  73.       P10=!P10;                //P1.0引脚端输出电平取反(输出周期10ms脉冲方波,占空比为50%)
  74.           P10ms=0;                //10ms计数器清0
  75.         }                
  76.     }
  77.    else
  78.    {
  79.         keypress1();
  80.         keypress2();
  81.         }
  82. }
复制代码



极速截图201903092330.png (61.81 KB, 下载次数: 15)

极速截图201903092330.png
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:234075 发表于 2019-3-10 00:13 | 只看该作者
按键松开的动作没有检测
在30行和53行前插入  while(!k1);和 while(!k2);
回复

使用道具 举报

板凳
ID:137676 发表于 2019-3-10 00:24 | 只看该作者
中断函数运行delay()函数时间太长了吧!
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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