亚洲春色中文字幕久久久-三上亚,一吻二脱三床四吻胸,国产真实伦对白视频全集,在线毛片观看,精品成品入口黄网,国产毛aⅴ片久久久,亚洲AV色香蕉一区二区三区老师,萧皇后A级艳片,色情日本视频更新,99久久亚洲精品日本无码
標題:
單片機實現八路搶答器+查看分數+加減分源程序
[打印本頁]
作者:
小孩。。。
時間:
2020-5-14 20:25
標題:
單片機實現八路搶答器+查看分數+加減分源程序
基于單片機的八路搶答器
一、主要內容
通過利用數碼管顯示,并自動復位的思路,運用單片機的運行產生輸出信號,通過數碼管顯示對應的通道,實現了一個以單片機為核心的8路搶答器,
并且具有查看選手分數和進行加減分的功能。
二、具體操作
2、主持人按下開始鍵選手等待時間計完聽到滴聲后才可以搶答,若提前搶到則
視為犯規。
3、搶答成功后別的選手再搶到也是沒有用的。
4、顯示屏上顯示哪位選手搶到,并開始對答題時間進行倒計時。
5、顯示答題時間,在答題時間小于 5S 時報警電路會發生作用。
7、當主持人按下 RESET 鍵則進行下一輪的比賽。
二、程序用什么軟件查看?
打開程序的軟件是Keil
單片機源程序如下:
#include <reg51.h>
#include <intrins.h>
#define uint unsigned int
#define uchar unsigned char
sbit smg1=P2^0; //定義數碼管第一位
sbit smg3=P2^2; //定義數碼管第三位
sbit smg4=P2^3; //定義數碼管第四位
sbit keyks=P3^5; //定義開始按鍵
sbit keytz=P3^4; //定義停止按鍵
sbit keyqc=P3^3; //定義清除按鍵
sbit beep=P3^6; //定義蜂鳴器
uchar k;
uchar keyvalue=0;
uint a;
int djs=20,js=0; //djs和bt是初始倒計時時間,可修改
int table[] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
int zhunbei[] = {0x92,0x99,0xb0,0xa4,0xf9,0xc0};//準備搶答
int fenshu[] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
char fs[8];
uchar mode=0; //主持人的按鍵模式
// mode=0:顯示選手1的分數 mode=1:顯示選手2的分數....../////////
void delayzb(uint z)//準備搶答延時
{
uint x,y;//局部變量定義
for(x = z;x>0;x--)//此for循環100次
for(y = 144;y>0;y--);//此for循環144次,100*144次循環正好是100ms.
}
void delay()
{
uchar m,n,s;
for(m = 20;m>0;m--);
for(n = 20;n>0;n--);
for(s = 248;s>0;s--);
}
void delayms(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void Getch () //取鍵值函數
{
//keyvalue=0;
P1=0xf0; //先對P3 置數 列掃描
if(P1!=0xf0) //判斷是否有鍵按下
{
delay(); //延時,軟件去干擾
if(P1!=0xf0) //確認按鍵按下
{
switch (P1) //判斷鍵值(哪一列被按下)
{
case 0xe0: keyvalue=1; break; //第一列被按下
case 0xd0: keyvalue=2; break; //第二列被按下
case 0xb0: keyvalue=3; break; //被三列被按下
case 0x70: keyvalue=4; break; //被四列被按下
}
P1 = 0x0f; //行掃描
switch (P1) //判斷哪一行被按下
{
case 0x0e: keyvalue=keyvalue; break; //第一行被按下
case 0x0d: keyvalue=keyvalue + 4; break; //第二行被按下
case 0x0b: keyvalue=keyvalue + 8; break; //第三行被按下
case 0x07: keyvalue=keyvalue + 12; break; //第四行被按下
}
while (P1 != 0x0f); //松手檢測
}
}
}
void Timer0_init() //定時器0初始化
{
js=0;
TMOD=0x01; //TR0=1;//IT1=1; //T0為定時器方式1 //EX1=1;
TH0=0x4c; //每50ms溢出一次
TL0=0x00;
ET0=1;
EA=1;
}
void timer0() interrupt 1 using 1 //定時器0中斷服務函數
{
TF0=0;
TH0=0x4c; //每50ms溢出一次
TL0=0x00; //賦初值
js++;
if(js==20) //20*50=1000ms=1s
{
js=0;
djs--; //產生1s的倒計時
}
if(djs==5)
{
beep = 0; //倒計時后5s報警
delay();
beep = 1;
delay();
}
if(djs==0)
{
P2 = 0xff;
TR0=0; //倒計時結束,關閉定時器
}
}
void djsxs() //顯示倒計時函數
{
int shi,ge;
shi=djs/10;
ge=djs%10; // 將倒計時時間分成高低位
P2=0XFF;
smg4 = 0;
P0=table[ge];
smg4 = 0;
delayms(2);
P2=0XFF;
smg3 = 0;
P0=table[shi];
smg3 = 0;
delayms(2);
P2=0XFF;
}
void djsxs22() //顯示- --
{
P2=0XFF;
P0=0xbf;
smg1 = 0;
delayms(3);
P2=0XFF; //第一位數碼管顯示-
P0=0xbf;
smg3 = 0;
delayms(3); //第三位數碼管顯示-
P2=0XFF;
P0=0xbf;
smg4 = 0;
delayms(3);
P2=0XFF; //第四位數碼管顯示-
}
void playerxs()
{
P0=table[keyvalue];
smg1=0;
delayms(3);
smg1=1;
} //第一位數碼管顯示
void main()
{
int djs1=20;
Timer0_init(); //初始化定時器中斷
beep=1; //蜂鳴器不響
djs=20; //倒計時賦值
while(1)
{
LOOP1:
Getch();
djs=djs1;
djsxs22(); //LOOP1是標號,顯示 - --
keyvalue = 0;
// beep=1; //蜂鳴器不響
djs=20; //倒計時賦值
TR0 = 0;
if(keyks==0)//開始按鍵
{
beep=0;//蜂鳴器響
delayms(3); //去除按鍵抖動
if(keyks==0) //確定開始按下
{
while(!keyks); //松手檢測
{
beep=1;
for(a = 0;a<6;a++) //5s倒計時準備搶答
{
P2 = 0xf7;//1111 0111 //第四位數碼管顯示5s倒計時
P0 = zhunbei[a];
delayzb(800);
P2 = 0xff;
}
}
while(1)
{
Getch();
if(keyqc == 0)
{
delayms(3); //去除抖動
if(keyqc == 0)
{
while(!keyqc); //如果按下清除鍵,則回到- --狀態
goto LOOP1; //goto語句,回到loop1表號處
}
}
/*以下是八個選手搶答,key1表示1號選手,依次類推,注釋只寫第一位選手,其他和第一個完全一致*/
if((keyvalue>=1)&&(keyvalue<=8)&&(TR0==0)) //在定時器關閉狀態下,key1==0 則說明1號選手按下按
{
beep=0; //蜂鳴器響
//while(!key1); //去除按鍵抖動后,重新在判斷,是否確實按下
beep=1; //蜂鳴器不響
TR0=1; //定時器開始
while(1)
{
mode = keyvalue;
playerxs(); //顯示選手編號
djsxs(); //顯示剩余倒計時時間
//keyvalue = 1;
if(keyqc == 0)
{
delayms(3); //去除抖動
if(keyqc == 0)
{
while(!keyqc); //如果按下清除鍵,則回到- --狀態
goto LOOP1; //goto語句,回到loop1表號處
}
}
if(keytz == 0) //暫停按下按下
{
delayms(3); //去除抖動
if(keytz == 0) //再次判斷是否按下復位按鍵
{
while(!keytz) //如果按下復位鍵,則回到- --狀態
TR0=0;
}
}
if(keyks == 0)//開始按鍵
{
beep=0;//蜂鳴器響
delayms(30); //去除按鍵抖動
if(keyks == 0) //確定開始按下
{
while(!keyks); //松手檢測
{
beep=1; //蜂鳴器不響
delay();
TR0 = 1;
}
}
}
if(djs == 0)
break;
}
}
if (mode!=0)
{
TR0 = 0;
while(1)
{
P0=table[mode];
smg1=0;
delayms(3);
smg1=1; //顯示選手編號
P0=table[fs[mode]];
smg4=0;
delayms(3);
smg4=1;
Getch();
if(keyvalue == 9)
{
keyvalue = 0;
mode++;
if(mode>8)
{
mode=0;
}
}
else if(keyvalue == 10) //加分
{
keyvalue = 0;
fs[mode]++;
if(fs[mode] == 10)
fs[mode] = 9;
}
復制代碼
八路搶答器last.zip
2020-5-14 20:05 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
32.09 KB, 下載次數: 36, 下載積分: 黑幣 -5
作者:
淺墨墨
時間:
2020-6-15 17:12
那個能把原理圖發一下嗎
作者:
暢聊甜語
時間:
2020-6-21 08:54
程序不對吧
歡迎光臨 (http://www.denmoz.com/bbs/)
Powered by Discuz! X3.1