多用个定时器做10mS延时。
更专业的代码要充分利用这个公用定时器。比如按键扫描、数码管显示,长延时等。
#include<reg52.h>
#include<intrins.h>
sbit SPK=P3^7;
sbit k1=P1^0;
sbit k2=P1^1;
sbit k3=P1^2;
unsigned char keystep=1,keydelay,frg,i;
void DelayUs2x(unsigned char t);
void DelayMs(unsigned char t);
#define FOSC 12.0//11.0592 //晶振频率
#define MACHINE_NUM 12 //SH88F2051 STC_MCU 定时器1T/12T可选
#define M_NUM 12 //SH88F2051 STC_MCU 为1T,老51为12T
#define TICKS_PER_SEC 100.0 //每秒100次,10mS一次
#define TICK_COUNT ( (unsigned int)(FOSC*1000000L/MACHINE_NUM/TICKS_PER_SEC) )
#define T_RELOAD_LO ( (unsigned char) ((0x10000-TICK_COUNT) & 0x00ff) )
#define T_RELOAD_HI ( (unsigned char) ((0x10000-TICK_COUNT) >> 8) )
bit b_frg_;
unsigned char _frg_;
void bj_on(void)
{
b_frg_=0;
_frg_=0;
// TR0=1;
Init_Timer0();
}
void bj_off(void)
{
TR0=0;
}
void Init_Timer1(void)
{
TMOD &= 0x0f;
TMOD |= 0x10;
TH1 = T_RELOAD_HI;
ET1 = 1;
TR1 = 1;
// EA = 1;
}
void Timer1_isr(void)interrupt 3 //T1中断 约10mS执行一次
{
TH1 = T_RELOAD_HI;
if(TR0)
{
frg=_frg_;
if(b_frg_) _frg_--;
else _frg_++;
if((_frg_>=245)&&(_frg_==0)) b_frg_=!b_frg_;
}
}
void Init_Timer0(void) //初始函数
{
TMOD=0x01;
TH0=0xfe;
TL0=frg;
EA=1;
ET0=1;
TR0=1;
}
//void bj() // 报警子函数
//{
// Init_Timer0();// 必须的
// for(i=0;i<245;i++)
// {
// DelayMs(10);
// frg=i;
// }
// for(i=245;i>0;i--)
// {
// DelayMs(10);
// frg=i;
// }
// SPK=~SPK;
//}
main() //主函数
{
TMOD=0x01;
EA=1;
ET0=1;
//Init_Timer0();
Init_Timer1();//yuan
for(; ;) //相当于while(1)
{
if(k3==0) //ok ! 实现了 开关的触发一次开 再触发一次停的功能 .
{
DelayMs(10);
while(!k3);//松手按键弹起后 计数
{
keystep++;
if(keystep==2) keystep=0;
}
switch(keystep)
{
case 0: bj_on(); break; //
case 1: bj_off(); break; //
}
}
}
}
void DelayUs2x(unsigned char t) //延时函数
{
while(--t);
}
void DelayMs(unsigned char t)
{
while(t--)
{
DelayUs2x(245);
DelayUs2x(245);
}
}
void Timer0_isr(void)interrupt 1 //TR0 中断发音函数
{
TMOD=0x01;
TH0=0xfe;
TL0=frg;
SPK=~SPK;
}
|