標題:
單片機可調(diào)方波程序,按鍵key2沒有反應,請指教
[打印本頁]
作者:
ziba108
時間:
2022-2-26 13:24
標題:
單片機可調(diào)方波程序,按鍵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; //系統(tǒng)時鐘頻率12MHz
u8 TIMER0_L,TIMER0_H;
//聲明函數(shù)寫在前面
/*延時函數(shù)*/
void delay(u16 i)
{
while(i--);
}
/*初始化*/
void chushihua()
{
TIMER0_L=0x18; //定時變量,定時器1初始時間高8位賦值,具體定時時間自己查資料 10000
TIMER0_H=0xFC; //方波初始頻率 = 500Hz
}
/*外部中斷0初始化函數(shù)*/
void int0_init()
{
EX0=1; // 開啟外部中斷0
IT0=1; //設(shè)置外部中斷觸發(fā)方式 下降沿觸發(fā) P3.2廣腳 key1
EA=1; //開總中斷
}
/*外部中斷1初始化函數(shù)*/
void int1_init()
{
EX1=1; // 開啟外部中斷1
IT1=1; //設(shè)置外部中斷觸發(fā)方式 下降沿觸發(fā) P3.4廣腳 key2
EA=1; //開總中斷
}
/*定時器T1初始化函數(shù)*/
void T0_init()
{
TMOD=0X10;//選擇定時器T1,工作方式1,僅用TR1打開啟動
ET1=1; //開定時器T1中斷
TR1=1; //啟動定時器T1
EA=1; //開總中斷
}
/*主函數(shù)*/
void main()
{
led1=0;
led2=0;
freq=500;
int0_init();
int1_init();
T0_init();
chushihua();
while(1);
}
//定時器T1的中斷服務函數(shù)
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; //取反,產(chǎn)生50HZ方波
}
//外部中斷0的中斷服務函數(shù)
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; //消抖計數(shù)變量
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; //消抖計數(shù)清0
}
}
void main() //主函數(shù)
{
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.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1