|
发表于 2014-9-25 14:35:16
|
显示全部楼层
本帖最后由 牛东 于 2014-9-26 13:21 编辑
楼主能帮我看看,为什么 TIME_PER_SEC设成200数码管显示跟不上,差很远!!一闪一闪,要设成2000才勉强不闪!!
#include "REG52.H"
#define MAX_TASK 4 //定义任务数量
#define CLOCK 11059200 //定义时钟晶振,单位Hz
#define TIME_PER_SEC 2000 //定义任务时钟频率200Hz
void main()
{
Timer0Init();
initial_myself();
delay_long(100);
initial_peripheral();
EA = 1;
while(1)
{
if(task_delay[0]==0) {display_drive(); task_delay[0] = 1;} //按键服务程序5HZ
if(task_delay[1]==0) {display_service(); task_delay[1] = 20;} //显示服务程序5HZ
if(task_delay[2]==0) {key_service();; task_delay[2] = 1;} //显示驱动程序 10HZ
if(task_delay[3]==0) {beep_service(); task_delay[3] = 40;} //蜂鸣器服务程序20HZ
}
}
/******************************
T0初始化
******************************/
void Timer0Init(void)
{
unsigned char i;
for(i=0;i<MAX_TASK;i++) task_delay=0; //任务延时量清零
TMOD = (TMOD & 0XF0) | 0X01; //定时器 0 工作在模式 1, 16Bit定时器模式
TH0 =255-CLOCK/TIME_PER_SEC/12/256;//0xed (0xedff=60927 大概5MS中断一次)
TL0 =255-CLOCK/TIME_PER_SEC/12%256;//0xff
//(11.0592MHz晶振 机器周期 1.085us,5000us则4608个机器周期,一个机器周期T0=10.085us计数一次,65535-4068=60927=0xedff)
TR0 = 1 ;
ET0 = 1 ;
}
/******************************
T0中断服务程序
******************************/
void Time0Isr(void) interrupt 1
{
unsigned char i;
TH0 =255-CLOCK/TIME_PER_SEC/12/256;//0xed (0xedff=60927 大概5MS中断一次)
TL0 =255-CLOCK/TIME_PER_SEC/12%256;//0xff
//(11.0592MHz晶振(0.094us 震荡周期) 机器周期 1.085us, 延时5000us则4608个机器周期,一个机器周期T0计数一次,计数初值=65535-4068=60927=0xedff)
for(i=0;i<MAX_TASK;i++) if(task_delay) task_delay--;//每节拍对任务延时变量减1 ,减至 0 后,任务就绪。
ucKeyTimeFlag1=1; // 按键1消抖计数标志置1
ucKeyTimeFlag2=1; // 按键2消抖计数标志置1
ucKeyTimeFlag3=1; // 按键3消抖计数标志置1
ucKeyTimeFlag4=1; // 按键4消抖计数标志置1
ucTimeFlag=1; //倒计时的时钟中断标志置1
ucDpyTimeFlag=1; //数码管的闪烁计时中断标志置1
ucVoiceFlag=1; //蜂鸣器鸣叫计数时钟中断标志置1
}
/******************************
蜂鸣器服务程序
******************************/
void beep_service()
{
if(ucVoiceFlag==1)
{
ucVoiceFlag=0;
if(uiVoiceCnt==0)
{
uiVoiceCnt--; //每次进入定时中断都自减1,直到等于零为止。才停止鸣叫
beep_dr=1; //蜂鸣器是PNP三极管控制,低电平就开始鸣叫。
}
else
{
beep_dr=0; //蜂鸣器是PNP三极管控制,高电平就停止鸣叫。
}
}
}
|
|