文档详情

基于AT89S52的八路抢答器C语言源程序.doc

发布:2017-07-13约2.56千字共3页下载文档
文本预览下载声明
C语言源程序 #includereg52.h #define unchar unsigned char #define unit unsigned int #define Data_port P0 //数码管数据口 #define Bit_sel_port P1 //数码管位选口 #define Key_port P2 //抢答按键输入口 sbit Bee=P3.7; //蜂鸣器控制引脚 unit timer_out=60; //定时60s unit Count=0; unit single=0; //个位 unit decade=6; //十位 unit n; unit i; unchar start_flag=0; //启动抢答标志 unchar ans_flag=0; //已抢答标志 unit seg_tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //七段数码管字形表 void Delay(i) //延迟函数 { for(;i0;i--); } void Display_time() //显示抢答时间 { Bit_sel_port=0x01; Data_port=seg_tab[decade]; Delay(200); Bit_sel_port=0x02; Data_port=seg_tab[single]; Delay(200); } void Display_num_time() //显示抢答组编号和时间 { Bit_sel_port=0x01; Data_port=seg_tab[decade]; Delay(200); Bit_sel_port=0x02; Data_port=seg-tab[single]; Delay(200); Bit_sel_port=0x04; Data_port=seg_tab[n]; Delay(200); } main() { EX0=1; //开外部中断INT0 IT0=1; //外部中断方式为下降沿 TMOD=0x01; //定时/计时器0工作与模式1 TH0=0xd8; TL0=0xef; ET0=1; //开定时/计数器0中断,定时20ms Bee=0; //蜂鸣器停止 EA=1; //开关中断 while(1) { if(star_flag==0) //抢答未开始 { if(Key_port!=0xFF) { Bee=1; //蜂鸣器启动,抢答违规处理 while(1); //进入死循环,按复位键重新启动 } } else //抢答开始 { if(ans_flag!=1) //无人抢答,显示时间 Dislay_time(); else //显示时间和抢答组编号 Delay_num_time(); } } void Interrupt0() interrupt0 { Bee=1; //提示开始抢答 Delay(200); Bee=0; TR0=1; //启动抢答后使能定时器 start_flag=1; //启动抢答标志置位 } void Timer0() interrupt1 { TH0=0xd8; TL0=0xef; Count++; if(Count==50) { Count=0; timer_out--; } if(timer_out!=0Key_port==0xff) //如果时间未到且无抢答键按下 { decade=timer_out/10; //显示当前剩余时间 single=timer_out%10; ans_flag=0; } if(time_o
显示全部
相似文档