標(biāo)題:
單片機(jī)實(shí)驗(yàn) 定時(shí)器的應(yīng)用實(shí)驗(yàn)
[打印本頁]
作者:
xuelongxl
時(shí)間:
2016-11-5 20:54
標(biāo)題:
單片機(jī)實(shí)驗(yàn) 定時(shí)器的應(yīng)用實(shí)驗(yàn)
之前做過的實(shí)驗(yàn)
通過P3.4和P3.5來調(diào)節(jié)發(fā)生頻率
#include "reg52.h"
sbit BeepPin =P2^5; //定義蜂鳴器引腳
sbit IncKey =P3^4; //定義按鍵引腳
sbit DecKey =P3^5;
#define FOSC (11059200L) //Hz
#define WANTTIME (10) //ms
#define VTHX (65536-WANTTIME*FOSC/12000)/256 //計(jì)算定時(shí)初值
#define VTLX (65536-WANTTIME*FOSC/12000)%256
#define BEEPON (0) //使蜂鳴器發(fā)聲的電平
#define BEEPOFF (1) //使蜂鳴器不發(fā)聲的電平
#define INCKEY (1) //定義鍵值
#define DECKEY (2)
#define NOKEY (3)
#define TRUE (1) //定義真常量
#define FALSE (0) //定義假常量
//定義延時(shí)運(yùn)行值變量和設(shè)置值變量
unsigned int DelayTime_Run,DelayTime_Set;
unsigned char TimeIsUpFlag; //定義時(shí)間到標(biāo)志變量
bit BeepOutValue; //控制蜂鳴器的輸出變量,用于刷新到BeepPin
//初始化函數(shù)
void Init(void)
{
DelayTime_Set=100; //為各變量賦初值
TimeIsUpFlag=TRUE;
BeepOutValue=BEEPOFF;
IncKey=1; //關(guān)閉按鍵口線內(nèi)部的鎖存器
DecKey=1;
TMOD=0x01; //初始化定時(shí)器T0
TL0=VTLX;
TH0=VTHX;
ET0=1; //使用T0中斷
EA=1;
TR0=1; //啟動T0
}
//清除時(shí)間到標(biāo)志變量
void ClearTimeUpFlag(void)
{
TimeIsUpFlag=FALSE;
}
//讀取時(shí)間到標(biāo)志變量的值
unsigned char GetTimeUpFlag(void)
{
return(TimeIsUpFlag);
}
//設(shè)置延時(shí)時(shí)間
//xTime為延時(shí)時(shí)間,范圍1~65535
void SetDelayTime(unsigned int xTime)
{
DelayTime_Run=xTime;
}
//按鍵函數(shù)
//返回為值為相應(yīng)鍵的鍵值或NOKEY
unsigned char Key(void)
{
unsigned char RetValue=NOKEY;
if(IncKey==0) RetValue=INCKEY;
if(DecKey==0) RetValue=DECKEY;
while((IncKey==0)||(DecKey==0));
return(RetValue);
}
//主函數(shù)
void main(void)
{
unsigned char Temp; //聲明局部變量
Init(); //調(diào)用初始化函數(shù)
while(1){
Temp=Key(); //調(diào)用按鍵函數(shù)
switch(Temp){ //處理按鍵
case INCKEY:
DelayTime_Set+=10;
break;
case DECKEY:
if(DelayTime_Set>0)
DelayTime_Set-=10;
break;
default: ;
}
BeepOutValue^=1; //蜂鳴器輸出變量狀態(tài)取反
BeepPin=BeepOutValue; //刷新蜂鳴器
ClearTimeUpFlag(); //清除時(shí)間到標(biāo)志
SetDelayTime(DelayTime_Set); //設(shè)置延時(shí)時(shí)間
while(GetTimeUpFlag()==FALSE); //等待時(shí)間到
//此處的循環(huán)會導(dǎo)致對按鍵的響應(yīng)速度變慢!
//解決辦法:多按一會再放手
}
}
//T0的中斷服務(wù)函數(shù)
void T0Int(void) interrupt 1
{
TL0=VTLX; //恢復(fù)定時(shí)初值
TH0=VTHX;
if(DelayTime_Run>0) //操作延時(shí)運(yùn)行值變量,其到0時(shí)時(shí)間到
{DelayTime_Run--; TimeIsUpFlag=FALSE;}
else
TimeIsUpFlag=TRUE; //時(shí)間到,設(shè)置時(shí)間到標(biāo)志
}
復(fù)制代碼
03實(shí)驗(yàn)三 定時(shí)器.zip
2016-11-5 20:54 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
20.82 KB, 下載次數(shù): 3, 下載積分: 黑幣 -5
作者:
不住的MI
時(shí)間:
2017-12-11 20:11
很不錯,解決了我的難題
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1