标题:
单片机可调方波程序,按键key2没有反应,请指教
[打印本页]
作者:
ziba108
时间:
2022-2-26 13:24
标题:
单片机可调方波程序,按键key2没有反应,请指教
#include<reg51.h>
#include<math.h>
typedef unsigned int u16;
typedef unsigned char u8;
sbit Waveout=P2^0; /*P2.0口输出方波*/
sbit key1=P3^2;
sbit key2=P3^4;
sbit led1=P0^0;
sbit led2=P0^1;
u16 freq; //频率
float fosc=12000000; //系统时钟频率12MHz
u8 TIMER0_L,TIMER0_H;
//声明函数写在前面
/*延时函数*/
void delay(u16 i)
{
while(i--);
}
/*初始化*/
void chushihua()
{
TIMER0_L=0x18; //定时变量,定时器1初始时间高8位赋值,具体定时时间自己查资料 10000
TIMER0_H=0xFC; //方波初始频率 = 500Hz
}
/*外部中断0初始化函数*/
void int0_init()
{
EX0=1; // 开启外部中断0
IT0=1; //设置外部中断触发方式 下降沿触发 P3.2广脚 key1
EA=1; //开总中断
}
/*外部中断1初始化函数*/
void int1_init()
{
EX1=1; // 开启外部中断1
IT1=1; //设置外部中断触发方式 下降沿触发 P3.4广脚 key2
EA=1; //开总中断
}
/*定时器T1初始化函数*/
void T0_init()
{
TMOD=0X10;//选择定时器T1,工作方式1,仅用TR1打开启动
ET1=1; //开定时器T1中断
TR1=1; //启动定时器T1
EA=1; //开总中断
}
/*主函数*/
void main()
{
led1=0;
led2=0;
freq=500;
int0_init();
int1_init();
T0_init();
chushihua();
while(1);
}
//定时器T1的中断服务函数
void T0_time() interrupt 3//定时器T1的中断序号为3
{
TH1=TIMER0_H; //2^16=65536 2^8=256 TH0=0Xdc
TL1=TIMER0_L; //取余 TL0=0x00
Waveout=!Waveout; //取反,产生50HZ方波
}
//外部中断0的中断服务函数
void int0() interrupt 0 //外部中断的中断序号为0
{
float TF0;
delay(1000);//10ms
if(key1==0)
{
delay(1000);
freq+=100;
led1=~led1;
TF0=(65536-fosc/(24.0*freq)); //2^16=65536 2^8=256 TH0=0Xdc
TIMER0_H=(u16)TF0/256;
TIMER0_L=(u16)TF0%256; //取余TL0=0x00
}
}
void int1() interrupt 2//外部中断1的中断序号为2
{
float TF0;
delay(1000);//10ms
if(key2==0)
{
delay(1000);
freq-=100;
led2=~led2;
TF0=(65536-fosc/(24.0*freq)); //2^16=65536 2^8=256
TIMER0_H=(u16)TF0/256;
TIMER0_L=(u16)TF0%256; //取余
}
}
作者:
lkc8210
时间:
2022-2-26 20:24
不要在中断中用delay
而且你这情况也没必要用中断
作者:
wulin
时间:
2022-2-27 10:23
#include<reg51.h>
typedef unsigned int u16;
typedef unsigned char u8;
#define constant 1000000UL
sbit Waveout=P2^0;
sbit key1=P3^2;
sbit key2=P3^4;
u16 freq=500;//频率Hz范围400~600
u16 preset;//预置
void Timer1_Init()//@12.000MHz
{
TMOD= 0x10;
TL1 = preset;
TH1 = preset>>8;
TR1 = 1;
EA = 1;
ET1 = 1;
}
void key_scan() //按键扫描程序
{
static bit sign=0; //按键自锁标志
static u16 count=0; //消抖计数变量
if(!key1||!key2)
{
if(++count>=100 && sign==0)
{
sign=1;
if(!key1)
{
if(freq<600)freq+=10;
}
if(!key2)
{
if(freq>400)freq-=10;
}
preset=65536-(1.0/freq/2*constant);
}
}
else //键抬起
{
sign=0; //按键自锁标志清0
count=0; //消抖计数清0
}
}
void main() //主函数
{
preset=65536-(1.0/freq/2*constant);
Timer1_Init();
while(1)
{
key_scan(); //按键扫描程序
}
}
void timer1_Interrupt() interrupt 3 //12.000MHz
{
TL1 = preset;
TH1 = preset>>8;
Waveout=~Waveout;
}
复制代码
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1