文档介绍:某象棋快棋赛规则如下:红、黑双方对奕时间累计均为十分钟,超时判负;甲乙对奕方的计时器均用3位数码管显示,预定的初值均为十分钟,采用倒计时方式,通过按扭启动;由本方控制对方,比如甲方走完一步棋后必须按一次甲方的按键,该按键启动乙方倒计时。同理,乙方走完一步棋后必须按一次乙方的按键,该按键启动甲方倒计时。超时能发出报警声音,比赛结束。
利用你所学的知识,用LPC2000微控制器设计一个上述比赛用的计时器,尽可能详细给出软硬件设计、实现方案。
软件流程图
程序
#define uchar unsigned char
#define uint unsigned int
#define Fpclk 12000000 //12MHz晶振
#define BEEPCON (1<<12)//0x00001000 //,低电平蜂鸣
/***甲方数码管****/
#define wel1 (1<<7) //0x00000080,,高电平选中
#define wel2 (1<<8) //0x00000100,
#define wel3 (1<<9) //0x00000200,
/***乙方数码管****/
#define wel4 (1<<23)//0x01000000,,高电平选中
#define wel5 (1<<24) //0x02000000,
#define wel6 (1<<25) //0x04000000,
int count1 = 600,count2=600;
int key1,key2;
/*函数名称:定时器初始化函数******************/
/*函数功能:定时器时间为十分钟,为倒计时计数**/
void time0_init (void)//定时器0初始化,定时时间1s
{
T0TC = 0; //设置定时器0
T0PR = 99; //时钟100分频
T0MCR = 0x03; //设置T0MR0匹配后复位T0TC,并产生中断
T0MR0 = Fplck / 100; //设置匹配值
T0TCR = 0x01; //启动定时器
/*设置向量中断控制器*/
VICIntSelect = VICIntSelect & (~(1<<4)); //IRQ
tl0 = 0x20 | 4; //向量IRQ通道0
VICVectAddr0 = (uint32) Timer0_ISR; //中断服务地址Timer0_ISR
VICIntEable = (1<<4); //使能中断
}
/*函数名称:中断服务函数*************************/
/*函数功能:控制甲乙两方时间的暂停和继续*********/
void __irq Timer0_ISR(void)
{
if(!key2)//乙按键后甲的时间减少
count1 --;
display(count1);
if(!key1)//甲按键后乙的时间减少
cou