标题:
为什么程实现不了,是哪里有错误呢
[打印本页]
作者:
查理九世
时间:
2019-3-9 23:32
标题:
为什么程实现不了,是哪里有错误呢
刚学51单片机,写了一个通过按键减小输出方波的占空比的程序,按下K1在原有方波基础上减小10%占空比,按下K2在原有方波基础上减小20%的占空比,在未按任何按键之前有输出周期为10ms的方波,晶振频率为12Mhz。但是在按下按键之后占空比变化超出设计,为什么会这样呢?
#include<reg52.h>
unsigned char P10ms=0; //定义10ms计数器,并清零赋值
typedef unsigned char u16;
sbit K1=P3^1; //独立按键K1的端口定义
sbit K2=P3^2; //独立按键K2的端口定义
sbit P10=P2^0; //定义P1为P2^0从21引脚输出
void delay(u16 t) //延时函数
{
while(t--);
}
void keypress1() //定义按键1函数
{
if(K1==0) //判断K1是否按下
{
delay(1000); //消抖
if(K1==0)
{
TH1=0x06; //重置T1定时初值为25us
TL1=0x06; //重置T1定时初值为25us
if(P10==1) P10=0; //若P1.0为高电平,则P1.0转为低电平
else
{
P10ms++; //若1.0位低电平,则1ms计数
if(P10ms==36) //判断9ms是否满足,及实现减小10%的占空比
{
P10=1; //满足9ms,P1.0转为高电平
P10ms=0; //10ms计数器清零
}
}
}
}
}
void keypress2() //定义按建2函数
{
if(K2==0) //判断K2是否按下
{
delay(1000); //消抖
if(K2==0)
{
TH1=0x06; //重置T0定时初值为25us
TL1=0x06; //重置T0定时初值为25us
if(P10==1) P10=0; //若P1.0为高电平,则P1.0转为低电平
else
{
P10ms++; //若1.0位低电平,则1ms计数
if(P10ms==32) //判断是否达到8ms,即实现减小20%的占空比
{
P10=1; //满足8ms,P1.0转为高电平
P10ms=0; //10ms计数清零
}
}
}
}
}
void main()
{
TMOD=0x20; //TMOD=00100000B,置T1定时器方式2
TH1=0x06; //置T1定时初值250us
TL1=0x06; //置T1定时初值250us
IP=0x08; //IP=00001000B,置T1为高优先级
IE=0xff; //IE=11111111B,全部开中
TR1=1; //T1运行
P10=0; //脉冲方波初始输出为低电平
while(1); //无限循环,等待T1中断
}
void t1() interrupt 3
{
if(K1==1&&K2==1) //判断K1和K2是否按下,
{
P10ms++; //开始计数
if(P10ms==20) //若10ms计数器到位,则
{
P10=!P10; //P1.0引脚端输出电平取反(输出周期10ms脉冲方波,占空比为50%)
P10ms=0; //10ms计数器清0
}
}
else
{
keypress1();
keypress2();
}
}
复制代码
极速截图201903092330.png
(61.81 KB, 下载次数: 73)
下载附件
2019-3-9 23:31 上传
作者:
zhb2004xp
时间:
2019-3-10 00:13
按键松开的动作没有检测
在30行和53行前插入 while(!k1);和 while(!k2);
作者:
黑黑—坤
时间:
2019-3-10 00:24
中断函数运行delay()函数时间太长了吧!
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1