4路抢答器设计程序

#include

unsigned char code table[]={0xc0,0xf9,0xa4,0xb0, //0~f显示表 0x99,0x92,0x82,0xf8, 0x80,0x90,0x88,0x83, 0xc6,0xa1,0x86,0x8e};

unsigned char code table0[]={0xf1,0xf2,0xf4,0xf8}; //P2口位选 unsigned char code table2[]={0xef,0xdf,0xbf,0x7f}; //P3口送行信号 unsigned char display[]={0,0,0,0}; //显示位 void sw1(); //子函数申明 void sw2(); void sw3(); void sw4(); void xianshi(); void init();

unsigned char temp,num2,x,x1,x2,a,count; //变量声明 int num,num1;

unsigned char key; unsigned char i,j; sbit P3_4=P3^4; sbit P3_5=P3^5; sbit P3_6=P3^6; sbit P3_7=P3^7;

sbit k1=P1^0; //位申明(时间加) sbit k2=P1^1; //位申明(时间减) sbit k3=P1^2; //位申明(开始) sbit k4=P1^3; //位申明(复位) sbit sp=P1^4; //蜂鸣器 sbit l1=P1^5; //LED显示 sbit l2=P1^6; //LED显示

void delay(unsigned char z) //延时1ms 子函数 { unsigned char x,y; for(x=z;x>0;x--) for(y=110;y>0;y--); }

void init() //初始化子函数 { a=0;

TMOD=0x01; //定时器T0工作方式设定 TH0=(65536-10000)/256; //装初值 TL0=(65536-10000)%256; EA=1; //开定时器T0

ET0=1;

if(k1==0) //判断时间加K1是否按下 {

delay(5); //延时躲过抖动 if(k1==0) //再次确认是否按下K1 {

num++; //时间自加1 if(num==99) //如果时间num=99,清零num {

num=0; }

num2=num; //将num 值赋值给num2 while(k1==0); //等待K1松手 } }

if(k2==0) //判断时间减K2是否按下 { delay(5); //延时躲过抖动

if(k2==0) //再次确认是否按下K2 {

num--; //时间自减1 if(num==-1) //如果时间num=-1,赋值num=99 { num=99; }

num2=num; //将num 值赋值给num2 while(k2==0); //等待K2松手 } }

if(k3==0) //判断开始按钮K3是否按下 {

delay(5); //延时躲过抖动 if(k3==0) //再次确认是否按下K3 {

x++; //自加1 if(x==2) //假如x=2,清零x { x=0; } } }

}

void keyboad() //按键检测子函数 {

while(1) {

P3=0xff; //读引脚前需写入高电平 P3_4=0; //置第一行线为低 temp=P3; //P3口信息送入temp 中 temp=temp & 0x0f; //屏蔽高四位,保留低四位

if (temp!=0x0f) //判断:假如列线有不为高的时候,执行if 循环体 {

delay(5); //延时躲过抖动 temp=P3;

temp=temp & 0x0f; if (temp!=0x0f) {

temp=P3;

temp=temp & 0x0f; //判断是哪个键按下 switch(temp) {

case 0x0e: //第一行第四个按下

{delay(5);num1=4;l2=0;xianshi();} //第一行第一个键按下 break;

case 0x0d: //第一行第三个按下 {delay(5);num1=3;l2=0;xianshi();} break;

case 0x0b: //第一行第二个按下 {delay(5);num1=2;l2=0;xianshi();} break;

case 0x07: //第一行第一个按下

{delay(5);num1=1;l2=0;xianshi();} break; //第一行第一个键按下 } } }

P3=0xff; P3_5=0; temp=P3;

temp=temp & 0x0f; if (temp!=0x0f) {

delay(5); //延时躲过抖动 temp=P3;

temp=temp & 0x0f; if (temp!=0x0f) {

temp=P3;

temp=temp & 0x0f; switch(temp) {

case 0x0e:

{delay(5);num1=8;l2=0;xianshi();} break; case 0x0d:

{delay(5);num1=7;l2=0;xianshi();} break; case 0x0b:

{delay(5);num1=6;l2=0;xianshi();} break; case 0x07:

{delay(5);num1=5;l2=0;xianshi();} break; } } }

P3=0xff; P3_6=0; temp=P3;

temp=temp & 0x0f; if (temp!=0x0f) {

delay(5); //延时躲过抖动 temp=P3;

temp=temp & 0x0f; if (temp!=0x0f) {

temp=P3;

temp=temp & 0x0f; switch(temp) {

case 0x0e:

{delay(5);num1=12;l2=0;xianshi();} break; case 0x0d:

{delay(5);num1=11;l2=0;xianshi();} break; case 0x0b:

{delay(5);num1=10;l2=0;xianshi();} break; case 0x07:

{delay(5);num1=9;l2=0;xianshi();} break;

//第二行第四个键按下//第二行第三个键按下//第二行第二个键按下//第二行第一个键按下//第三行第四个键按下//第三行第三个键按下//第三行第二个键按下//第三行第一个键按下

} } }

P3=0xff; P3_7=0; temp=P3;

temp=temp & 0x0f; if (temp!=0x0f) {

delay(5); //延时躲过抖动 temp=P3;

temp=temp & 0x0f; if (temp!=0x0f) {

temp=P3;

temp=temp & 0x0f; switch(temp) {

case 0x0e:

{delay(5);num1=16;l2=0;xianshi();} break; case 0x0d:

{delay(5);num1=15;l2=0;xianshi();} break; case 0x0b:

{delay(5);num1=14;l2=0;xianshi();} break; case 0x07:

{delay(5);num1=13;l2=0;xianshi();} break; }

temp=P3;

P0=table[key]; } } } }

void xianshi() { TR0=0; //停止定时计数 num=0; //倒计时num 清零 sp=1; //成功抢答,蜂鸣器叫 delay(100); //延时一段时间 sp=0; //关蜂鸣器

//第四行第四个键按下//第四行第三个键按下//第四行第二个键按下//第四行第一个键按下

while(1) { for(a=0;a

void main() //主函数 { l1=1; //D1,D2关闭 l2=1; sp=0;//初始化蜂鸣器 x=0; num=num2=30; //赋初值 while(1) { if(x==1) //开始键按下 { delay(5); TR0=1; //启动定时 while(1) { keyboad(); //调用按键检测子函数 if(k4==0) //判断复位键是否按下 { l1=1; //D1,D2关闭

l2=1; delay(5); num=num2; //倒计时时间30秒赋值给num TR0=1; //启动定时器T0 } } } else //开始键没有按下 { for(a=0;a

void time0() interrupt 1 //定时器T0中断 {

TH0=(65536-10000)/256; //重装初值 TL0=(65536-10000)%256; count++; //中断次数记录 if(k4==0) //复位键K4检测 { num=num2; TR0=1; num1=0; return; }

for(a=0;a

delay(10); P2=table0[a];

P0=table[display[a]]; } display[0]=num/10; //倒计时显示0 display[1]=num%10;

display[2]=num1/10; //显示抢答者号 display[3]=num1%10; if(count==100) //1秒定时是否已到 { count=0; //清零记录 num--; //显示倒计时自减一 if(num

}

#include

unsigned char code table[]={0xc0,0xf9,0xa4,0xb0, //0~f显示表 0x99,0x92,0x82,0xf8, 0x80,0x90,0x88,0x83, 0xc6,0xa1,0x86,0x8e};

unsigned char code table0[]={0xf1,0xf2,0xf4,0xf8}; //P2口位选 unsigned char code table2[]={0xef,0xdf,0xbf,0x7f}; //P3口送行信号 unsigned char display[]={0,0,0,0}; //显示位 void sw1(); //子函数申明 void sw2(); void sw3(); void sw4(); void xianshi(); void init();

unsigned char temp,num2,x,x1,x2,a,count; //变量声明 int num,num1;

unsigned char key; unsigned char i,j; sbit P3_4=P3^4; sbit P3_5=P3^5; sbit P3_6=P3^6; sbit P3_7=P3^7;

sbit k1=P1^0; //位申明(时间加) sbit k2=P1^1; //位申明(时间减) sbit k3=P1^2; //位申明(开始) sbit k4=P1^3; //位申明(复位) sbit sp=P1^4; //蜂鸣器 sbit l1=P1^5; //LED显示 sbit l2=P1^6; //LED显示

void delay(unsigned char z) //延时1ms 子函数 { unsigned char x,y; for(x=z;x>0;x--) for(y=110;y>0;y--); }

void init() //初始化子函数 { a=0;

TMOD=0x01; //定时器T0工作方式设定 TH0=(65536-10000)/256; //装初值 TL0=(65536-10000)%256; EA=1; //开定时器T0

ET0=1;

if(k1==0) //判断时间加K1是否按下 {

delay(5); //延时躲过抖动 if(k1==0) //再次确认是否按下K1 {

num++; //时间自加1 if(num==99) //如果时间num=99,清零num {

num=0; }

num2=num; //将num 值赋值给num2 while(k1==0); //等待K1松手 } }

if(k2==0) //判断时间减K2是否按下 { delay(5); //延时躲过抖动

if(k2==0) //再次确认是否按下K2 {

num--; //时间自减1 if(num==-1) //如果时间num=-1,赋值num=99 { num=99; }

num2=num; //将num 值赋值给num2 while(k2==0); //等待K2松手 } }

if(k3==0) //判断开始按钮K3是否按下 {

delay(5); //延时躲过抖动 if(k3==0) //再次确认是否按下K3 {

x++; //自加1 if(x==2) //假如x=2,清零x { x=0; } } }

}

void keyboad() //按键检测子函数 {

while(1) {

P3=0xff; //读引脚前需写入高电平 P3_4=0; //置第一行线为低 temp=P3; //P3口信息送入temp 中 temp=temp & 0x0f; //屏蔽高四位,保留低四位

if (temp!=0x0f) //判断:假如列线有不为高的时候,执行if 循环体 {

delay(5); //延时躲过抖动 temp=P3;

temp=temp & 0x0f; if (temp!=0x0f) {

temp=P3;

temp=temp & 0x0f; //判断是哪个键按下 switch(temp) {

case 0x0e: //第一行第四个按下

{delay(5);num1=4;l2=0;xianshi();} //第一行第一个键按下 break;

case 0x0d: //第一行第三个按下 {delay(5);num1=3;l2=0;xianshi();} break;

case 0x0b: //第一行第二个按下 {delay(5);num1=2;l2=0;xianshi();} break;

case 0x07: //第一行第一个按下

{delay(5);num1=1;l2=0;xianshi();} break; //第一行第一个键按下 } } }

P3=0xff; P3_5=0; temp=P3;

temp=temp & 0x0f; if (temp!=0x0f) {

delay(5); //延时躲过抖动 temp=P3;

temp=temp & 0x0f; if (temp!=0x0f) {

temp=P3;

temp=temp & 0x0f; switch(temp) {

case 0x0e:

{delay(5);num1=8;l2=0;xianshi();} break; case 0x0d:

{delay(5);num1=7;l2=0;xianshi();} break; case 0x0b:

{delay(5);num1=6;l2=0;xianshi();} break; case 0x07:

{delay(5);num1=5;l2=0;xianshi();} break; } } }

P3=0xff; P3_6=0; temp=P3;

temp=temp & 0x0f; if (temp!=0x0f) {

delay(5); //延时躲过抖动 temp=P3;

temp=temp & 0x0f; if (temp!=0x0f) {

temp=P3;

temp=temp & 0x0f; switch(temp) {

case 0x0e:

{delay(5);num1=12;l2=0;xianshi();} break; case 0x0d:

{delay(5);num1=11;l2=0;xianshi();} break; case 0x0b:

{delay(5);num1=10;l2=0;xianshi();} break; case 0x07:

{delay(5);num1=9;l2=0;xianshi();} break;

//第二行第四个键按下//第二行第三个键按下//第二行第二个键按下//第二行第一个键按下//第三行第四个键按下//第三行第三个键按下//第三行第二个键按下//第三行第一个键按下

} } }

P3=0xff; P3_7=0; temp=P3;

temp=temp & 0x0f; if (temp!=0x0f) {

delay(5); //延时躲过抖动 temp=P3;

temp=temp & 0x0f; if (temp!=0x0f) {

temp=P3;

temp=temp & 0x0f; switch(temp) {

case 0x0e:

{delay(5);num1=16;l2=0;xianshi();} break; case 0x0d:

{delay(5);num1=15;l2=0;xianshi();} break; case 0x0b:

{delay(5);num1=14;l2=0;xianshi();} break; case 0x07:

{delay(5);num1=13;l2=0;xianshi();} break; }

temp=P3;

P0=table[key]; } } } }

void xianshi() { TR0=0; //停止定时计数 num=0; //倒计时num 清零 sp=1; //成功抢答,蜂鸣器叫 delay(100); //延时一段时间 sp=0; //关蜂鸣器

//第四行第四个键按下//第四行第三个键按下//第四行第二个键按下//第四行第一个键按下

while(1) { for(a=0;a

void main() //主函数 { l1=1; //D1,D2关闭 l2=1; sp=0;//初始化蜂鸣器 x=0; num=num2=30; //赋初值 while(1) { if(x==1) //开始键按下 { delay(5); TR0=1; //启动定时 while(1) { keyboad(); //调用按键检测子函数 if(k4==0) //判断复位键是否按下 { l1=1; //D1,D2关闭

l2=1; delay(5); num=num2; //倒计时时间30秒赋值给num TR0=1; //启动定时器T0 } } } else //开始键没有按下 { for(a=0;a

void time0() interrupt 1 //定时器T0中断 {

TH0=(65536-10000)/256; //重装初值 TL0=(65536-10000)%256; count++; //中断次数记录 if(k4==0) //复位键K4检测 { num=num2; TR0=1; num1=0; return; }

for(a=0;a

delay(10); P2=table0[a];

P0=table[display[a]]; } display[0]=num/10; //倒计时显示0 display[1]=num%10;

display[2]=num1/10; //显示抢答者号 display[3]=num1%10; if(count==100) //1秒定时是否已到 { count=0; //清零记录 num--; //显示倒计时自减一 if(num

}


相关文章

  • PLC六路抢答器课程设计
  • 漯职业技术学院 毕业设计说明书 专业:机电一体化技术学号:指导老师:赵滟平 [1**********]04 2010年 3月 29 日 摘 要 随着我国经济和文化实业的发展,在很多公开竞争场合要求有公正的竞争裁决,诸如证券.股票交易及各种智 ...查看


  • 单片机八路抢答器课设
  • 目录 前言................................................................ 1 1.1设计背景及意义 ..................................... ...查看


  • 抢答器课程设计 1
  • <单片机技术>课程设计说明书 数字抢答器 系 . 部: 电气与信息工程系 学生姓名:指导教师: 王韧 职称 副教授 专 业: 电气工程及其自动化 班 级: 完成时间: 2014年6月5号 摘 要 单片机把我们带入了智能化的电子领 ...查看


  • 四人智力竞赛抢答器
  • 电子工艺实训报告 实训课题 智力竞赛抢答器的制作与调试 学号 ************* 年级 ** 学院 ***** 专业 *********** 姓名 ****** 指导教师 ****** 一.实训目的 (1) 学习识别简单的电子元件与 ...查看


  • 四路抢答器毕业设计
  • 滁州职业技术学院机电系 毕 业 设 计 课 题: 抢答器 设计时间: 2014.11-2014.12 班 级: 机 电(4)班 学 号: 姓 名:指导教师: 杨入超 摘 要 随着微处理器.计算机和数字通讯技术的飞速发展,计算机控制已扩展到了 ...查看


  • 智能抢答器设计
  • 能力拓展训练 题 目 学 院 专 业 班 级 姓 名 指导教师 智能抢答器设计 2013年6月24日 能力拓展训练任务书 学生姓名: 专业班级: 指导教师: 工作单位: 自动化学院 题 目: 智能抢答器设计 初始条件:计算机.Max+plu ...查看


  • 八路抢答器说明书
  • 烟台大学 单片机 课程设计说明书 课题: 八路抢答器 学生姓名 学号:[1**********]8 院系:机电汽车工程学院 专业 指导老师 同组成员 组长 2012 年 06 月 07 日 目录 1 概述.................. ...查看


  • 单片机抢答器课程设计
  • 1 系统总体设计方案 1.1 设计课题任务 设计一个具有特定功能的抢答器. 1.2 功能要求说明 (1)该抢答器上电或按键复位后能自动显示系统提示符"P .". (2)主持人按下开始按钮后,抢答开始并限定时间30S . ...查看


  • 多路抢答器课程设计报告
  • 课 程 设 计 说 明 书 题目: 多路抢答器设计 二级学院 年级专业 学 号 学生姓名 指导教师 教师职称 机械工程学院 14级机械设计制造及其自动化 1401210012 曾骏 洪云 讲师 目录 摘要·················· ...查看


  • 四路智能抢答器课程设计
  • 摘 要 近年来随着科技的飞速发展,单片机的应用正在不断深入,同时带动传统控制检测日新月异.此次设计提出一种用AT89C52单片机作为核心控制元件与电阻.液晶显示屏.蜂鸣器等构成硬件条件,再利用C语言编程来控制抢答器的功能实现. 本论文对抢答 ...查看


热门内容