侯從彬;呂衛(wèi)偉;劉艷平;朱強
實驗要求:
1: 兩個兩位的數(shù)碼管,
一個用來顯示倒計時時間,
一個用來顯示選手的編號。
2: 主持人控制兩個按鍵K1-K2:
功能鍵K1:搶答開始,開始倒時,揚聲器響。
功能鍵K2: 功能1:清除顯示(時間從倒計時的最大時間開始,選手編號顯示清零);
功能2:設置倒計時的時間。
八位選手各控制一鍵,待主持人按下開始鍵后,第一個按下?lián)尨疰I的選手的編號將被顯示。揚聲器停,其他鍵均被屏蔽,至到主持人再次按下開始鍵。
實驗模塊分析:
共陰極:
(1)
位選端: 置數(shù)功能 P00…P07
輸入 | 0X3F | 0X06 | 0X5B | 0X4F | 0X66 | 0X6D | 0X7D | 0X07 | 0X7F | 0X6F |
顯示 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
(2)
段選端: 控制功能 D0..D1;
D0=0 啟動置數(shù);
D0=1 停止置數(shù);
例如:置D0=0;P0=0X3F;
則數(shù)碼管顯示數(shù)字 0
2 .
本實驗需要兩個數(shù)碼管同時顯示,實際上是達不到同時顯示的;但可以利用“視覺暫留效應”達到此效果;
同時也要考慮到消除數(shù)碼管顯示抖動現(xiàn)象;
這就需要實驗者熟練應用 delay() 延時函數(shù);
d1=0;
P0=tab[num/10];//倒計時控制
delay(5);
d1=1;
d2=0;
P0=tab[num%10];
delay(5);
d2=1;
其中的 delay(5) 就是為了達到一上所敘述的目的
<二>、
蜂鳴器:
只要在BUZ 端接地即可鳴叫。
<二、程序框圖>
主函數(shù):
實物圖連接:
P1口接8選手開關,在ZK1 ZK2為主持人開關,功能與題目要求一樣
P0 口為數(shù)碼管位選 。
注意:P0口使用時必須接上拉電阻否則為高阻態(tài) 。
P2口的分別用作主持人開關(P2^0、P2^1)兩數(shù)碼管段選(P2^4...P2^7);
實驗程序分析:
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
#define max 20
uchar tab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,};
sbit d1=P2^4;//**************段選
sbit d2=P2^5;
sbit x1=P2^6;
sbit x2=P2^7;
sbit k1=P1^0;//*********************八位選手開關
sbit k2=P1^1;
sbit k3=P1^2;
sbit k4=P1^3;
sbit k5=P1^4;
sbit k6=P1^5;
sbit k7=P1^6;
sbit k8=P1^7;
sbit zk1=P2^0;//*****************************主持人開關zk1 zk2
sbit zk2=P2^1;
sbit buz=P2^2;//*******************蜂鳴器
uchar num,aa;
uchar f,flag;
void jianpan();
void init(void)
{
TMOD=0X01;//***************T0,模式1,定時
TL0=0XB0; //********************定時50ms
TH0=0X3C;
ET0=1; //**************開中斷
EA=1;
num=max;//置倒計時計數(shù)初值
}
void delay(uint xms)
{
uint x,y;
for(x=xms;x>0;x--)
for(y=110;y>0;y--);
}
/**********************************************
倒計時 選手號顯示函數(shù)
**********************************************/
void display()
{d1=0; //控制開始置數(shù)
P0=tab[num/10];//倒計時控制取最高位
delay(5);
d1=1; //停止置數(shù)操作
d2=0;
P0=tab[num%10];//倒計時取最低位
delay(5);
d2=1;
x1=0; //控制開始置數(shù)
P0=tab[flag/10];//選手號控制
delay(5);
x1=1; //停止置數(shù)操作
x2=0;
P0=tab[flag%10];
delay(5);
x2=1;
}
/**********************************************************主函數(shù)部分
**********************************************************/void main()
{
init();
while(1)
{ jianpan();display();} }
/***************************************
中斷控制倒計時
*************************************/
void timer0(void) interrupt 1
{
TL0=0XB0; //******重裝初值,定時50ms
TH0=0X3C;
aa++;
if(aa==20)//**********************************1秒到了
{
aa=0;//**************************************計數(shù)清零
num--;
if(num==0)//倒計時為0時迅速變?yōu)?/span>初值同時關中斷停止倒計時
{ num=max;
TR0=0; }
buz=0;//***************要求蜂鳴器響
delay(20);//**************************蜂鳴器響,特別注意時間為一秒buz=1;
}
}
/**************************************************
按鍵控制 程序的核心部分
****************************************************/
void jianpan()
{
if(zk1==0&flag=0)
{
delay(5);//消除數(shù)碼管抖動操作
flag=0;//數(shù)碼管顯示0
display();
TR0=1;//ZK1鍵按下,開中斷以此控制:只有當此鍵按下時才搶答
}
if(zk2==0&&TR0==0)//注意這里要求TR0=0;
{
delay(5);//消除抖動
if(zk2==0&&TR0==0)
if(flag==0)
{num--;buz=0;delay(20);buz=1;}
if(num==0)
num=max;
if(flag!=0)//ZK2鍵清零操作
{
flag=0;
num=max;//倒計時顯示最大值
TR0=0;//注意此時關中斷,不再進行倒計時
buz=0;
delay(20);
buz=1;
}
while(!zk2)//倒計時中ZK2 鍵不可影響
display();
}
/**********************************************************TR0控制搶答先后順序
*********************************************************/
if(k1==0&&TR0==1)//注意此時TR0=1才執(zhí)行以下按鍵操作
{
buz=0;
delay(20);
buz=1;
delay(5);
flag=1;
TR0=0;//此鍵按下關中斷,其他選手按鍵不再受影響
display();
}
/*************************************
以下原理相同
*************************************/
if(k2==0&&TR0==1)
{
buz=0;delay(20);buz=1;
delay(5);
flag=2;
TR0=0;
display();
}
if(k3==0&&TR0==1)
{
buz=0;delay(20);buz=1;
delay(5);
flag=3;
TR0=0;
display();
}
if(k4==0&&TR0==1)
{
buz=0;delay(20);buz=1;
delay(5);
flag=4;
TR0=0;
display(); }
if(k5==0&&TR0==1)
{
delay(5);
flag=5;
TR0=0;
display();
}
if(k6==0&&TR0==1)
{
buz=0;delay(20);buz=1;
delay(5);
flag=1;
TR0=0;
display(); }
if(k7==0&&TR0==1)
{
buz=0;delay(20);
buz=1;
delay(5);
flag=7;
TR0=0;
display();
}
if(k8==0&&TR0==1)
{
buz=0;delay(20);
buz=1;
delay(5);
flag=8;
TR0=0;
display();
}
}
(1).
此實驗最大的特點便是中斷的巧妙應用
另外要注意延遲函數(shù)對數(shù)碼管顯示效果的影響
(2).
控制選手先后順序時,設置了兩個條件:按鍵和TR0,
而TR0則是控制關鍵,也是主持人按鍵控制的關鍵
歡迎光臨 (http://www.zg4o1577.cn/bbs/) | Powered by Discuz! X3.1 |