- 1、本文档共3页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
基于AT89S52的八路抢答器C语言源程序
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
文档评论(0)