要求:从P1^0口输出50Hz的方波,并通过S1,S2调整方波的频率。按下S1 频率以1Hz为单位增大,按下S2 频率以1Hz为单位减小。
(代码仅进行过初步验证,可能存在一定的BUG,谨慎使用)
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit Iput = P1^0;
//------------------------变量区------------------------
float Temp = 50;//初始频率 Hz
uint F ;//周期
float a=0;//中间变量
//------------------------函数区------------------------
void Delay(uint t)//延时函数
{
while(t--);
}
void Init_ET_0()//定时器初始话函数 50ms
{
F = a*500000;//将周期值换算成微秒并除二
TMOD = 0x01;//定时器0 工作方式 1
EA = 1; //开总中断
ET0 = 1; //开定时器开关
TR0 = 1; //启动定时器
TH0 = (65536 - F)/256; //给高八位赋初值
TL0 = (65536 - F)%256; //给低八位赋初值
//---------------------外部中断配置-------------------------
EX0 = 1;
EX1 = 1;
IT0 = 1;
IT1 = 1;
}
void Servoic_ET_0() interrupt 1 //定时器服务函数
{
F = a*500000;//将周期值换算成微秒并除二
TH0 = (65536 - F)/256; //重装高八位
TL0 = (65536 - F)%256; //重装低八位
Iput = ~Iput;
}
void Servoic_EX_0() interrupt 0 //外中断0
{
EX0 = 0;
Delay(100);
EX0 = 1; //消抖处理
Temp = Temp++;//频率加一
}
void Servoic_EX_1() interrupt 2 //外中断1
{
EX1 = 0;
Delay(100);
EX1 = 1;
Temp = Temp--;//频率减一
}
void main()
{
Init_ET_0();//定时器0初始化
while(1)
{
a = 1/Temp;//不断更新周期值
}
}
仿真图如下:
都看到这了给个赞支持一下呗🤔🤔