刚学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();
- }
- }
复制代码
|