久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2167|回復: 8
收起左側

用51單片機制作10路數字搶答器程序修改問題

[復制鏈接]
ID:675815 發表于 2019-12-31 16:08 | 顯示全部樓層 |閱讀模式
請各位大佬幫忙看下程序要怎么修改才對,謝謝謝謝!此程序已試過仿真和實物,現象顯示不對,蜂鳴器一直響,數碼管四位一起從0-9閃爍循環。
具體要求:(1)搶答器同時供 10 名選手或 10 個代表隊比賽。 (2)設置一個系統清除和搶答控制開關 S,該開關由主持人控制。 (3) 搶答器具有鎖存與顯示功能。即選手按動按鈕,鎖存相應的編號,并在 LED 數碼管上顯示,同時 揚聲器發出報警聲響提示。選手搶答實行優先鎖存,優先搶答選手的編號一直保持到主持人將系統清除為止。 (4)搶答器具有定時搶答功能,且一次搶答的時間由主持人設定(如 20 秒)。當主持人啟動"開始"鍵后, 定時器進行減計時,同時揚聲器發出短暫的聲響,聲響持續的時間 0.5 秒左右。 (5)參賽選手在設定的時間內進行搶答,搶答有效,定時器停止工作,顯示器上顯示選手的編號和搶 答的時間,并保持到主持人將系統清除為止。 (6)如果定時時間已到,無人搶答,本次搶答無效,系統報警并禁止搶答,定時顯示器上顯示 00。
原理圖如下:
51hei圖片20191231160654.png

程序如下:
#include <reg51.h>     //包含單片機寄存器的頭文件
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int

uchar LED[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf}; //共陽數碼管:0-9,-
int count,qdtime,num_mark,qdtime1=20;
sbit smg_we1 = P2^0;
sbit smg_we2 = P2^1;
sbit smg_we3 = P2^2;
sbit smg_we4 = P2^3;
//選手相關區
sbit LED1=P3^7;
sbit LED2=P3^6;
sbit LED3=P3^5;
sbit LED4=P3^4;
sbit LED5=P3^3;
sbit LED6=P3^2;
sbit LED7=P3^1;
sbit LED8=P3^0;
sbit LED9=P2^6;
sbit LED10=P2^7;//選手搶答“監視燈”
sbit S1=P3^7;
sbit S2=P3^6;
sbit S3=P3^5;
sbit S4=P3^4;
sbit S5=P3^3;
sbit S6=P3^2;
sbit S7=P3^1;
sbit S8=P3^0;
sbit S9=P2^6;
sbit S10=P2^7;//選手搶答按鈕
uchar S[]={1,1,1,1,1,1,1,1,1,1};//選手按鈕按下標記位,按下后便標記為1
//主持人相關區
sbit S11=P1^0;//清除
sbit S12=P1^1;//搶答開始
sbit S13=P1^2;//加時間
sbit S14=P1^3;//減時間
sbit BeepIO= P1^6;
/******************************************
延時函數
**********************************************/
void delay10ms()  //@12.000MHz
{
unsigned char i, j;
i = 117;
j = 184;
do
{
  while (--j);
} while (--i);
}

void delay(uint i)//i微秒延時
{ while(i--) ;}

/************************************************************
蜂鳴器發音程序區
**************************************************************/
void BEEP()//提示音
{  unsigned int i;
  for(i=0;i<100;i++)//喇叭發聲的時間循環
   {
   delay(100);     //參數決定發聲的頻率,估算值
   BeepIO=!BeepIO;
   }
  BeepIO=1;            //喇叭停止工作,間歇的時間
  delay(5000);
}
void BEEP2()//警告音
{  unsigned int i;
  for(i=0;i<400;i++)//喇叭發聲的時間循環
   {
   BeepIO=0;
   delay(40);     //參數決定發聲的頻率,估算值
   BeepIO=1;
   delay(30);
   }            
  delay(12500);//喇叭停止工作,間歇的時間         
}
void BEEP3()//搶答成功提示音
{  unsigned int i;
   for(i=0;i<400;i++)//喇叭發聲的時間循環
   {
   BeepIO=0;
   delay(25);     //參數決定發聲的頻率
   BeepIO=1;
   delay(25);
   }            
  delay(20000);//喇叭停止工作,間歇的時間
}
void shumaxs(int n,uchar m)//數碼管顯示程序
{ int sj1,sj2,dw1,dw2;
P0=0xff;
P1=0x00;
delay(50);
  sj1=n/10;
sj2=n%10;
dw1=m/10;
dw2=m%10;
  P0=LED[sj1];smg_we4=1;delay(20);
  P0=LED[sj2];smg_we3=1;delay(20);
P0=LED[dw1];smg_we2=1;delay(20);
P0=LED[dw2];smg_we1=1;delay(20);  
}
void Timer0_init (void)//T0初始化子函數
{
TMOD=0x01;//T0設置為16位定時方式
  TH0=0x3c;
  TL0=0xb0;//50ms
  ET0=1;  //允許T0中斷
  EA=1;
// TR0=0;     //關閉定時開關
}
void timer0() interrupt 1  //倒計時
{
   TH0=0x3c;
  TL0=0xb0;     
  count++;
  if(count==20)
  { count=0;
   qdtime--;   
  }
}
void key1()
{ S[1]=1;S[2]=1;S[3]=1;S[4]=1;S[5]=1;S[6]=1;S[7]=1;S[8]=1;S[9]=1;S[10]=1;//選手按鈕按下標記位歸零
if(S12==1)
{ delay10ms();if(S12==1)
  { TR0=1;
   {switch(P3&&0xff)
    { case 0x7f: num_mark=1;LED1=0;break;
     case 0xbf: num_mark=2;LED2=0;break;
     case 0xdf: num_mark=3;LED3=0;break;
     case 0xef: num_mark=4;LED4=0;break;
     case 0xf7: num_mark=5;LED5=0;break;
     case 0xfb: num_mark=6;LED6=0;break;
     case 0xfd: num_mark=7;LED7=0;break;
     case 0xfe: num_mark=8;LED8=0;break;
     
    }
    switch(P2&&0xff)
    { case 0x7f: num_mark=9;LED9=0;break;
     case 0xbf: num_mark=10;LED10=0;break;
    }
  }
   if((num_mark!=0)&&(qdtime!=0))  
   { TR0=0;
    shumaxs(qdtime,LED[num_mark]);
    BEEP3();
   }//有人搶答成功則結束搶答
    if((qdtime==0)&&(num_mark==0))
   { TR0=0;
    shumaxs(0xbf,0xbf);
    BEEP2();
   }
  }
}
}

void key2()
{ if(S11==1)
{delay10ms();if(S11==1) {BeepIO=0;qdtime=0;shumaxs(0xbf,0xc0);}}
if(S12==1)
  {delay10ms();if(S12==1) {BEEP();shumaxs(LED[num_mark],qdtime);}}
if(S13==1)
{ delay10ms();
   if(S13==1)
   {qdtime++;if(qdtime>99) qdtime=0;shumaxs(0xbf,qdtime);}
}
if(S14==1)
{ delay10ms();
   if(S13==1)
    {qdtime--;if(qdtime>99) qdtime=0;shumaxs(0xbf,qdtime);}
}
}
  
void main()
{ qdtime=qdtime1;shumaxs(20,0);
  Timer0_init();//T0初始化
BeepIO=0;//蜂鳴器不響
TR0=0;
while(1)
  {
  LED1=1;LED2=1;LED3=1;LED4=1;LED5=1;LED6=1;LED7=1;LED8=1;LED9=1;LED10=1;//監視燈初始化為滅
  key2();
  key1();
}
}

回復

使用道具 舉報

ID:648281 發表于 2020-1-1 20:48 | 顯示全部樓層
你好!
從你描述的情況來看,程序對應要求的錯誤還很多;
只能根據你的要求,把程序分功能模塊逐段調試。
回復

使用道具 舉報

ID:332444 發表于 2020-1-2 08:36 | 顯示全部樓層
用蛋騙雞直接驅動數碼管出現的問題,必須要用三極管或鎖存器驅動數碼管,你這是常見的驅動設計問題
回復

使用道具 舉報

ID:675815 發表于 2020-1-2 14:21 | 顯示全部樓層
51hei**1140 發表于 2020-1-1 20:48
你好!
從你描述的情況來看,程序對應要求的錯誤還很多;
只能根據你的要求,把程序分功能模塊逐段調試。

好的,謝謝!
回復

使用道具 舉報

ID:675815 發表于 2020-1-2 14:21 | 顯示全部樓層
xianfajushi 發表于 2020-1-2 08:36
用直接驅動數碼管出現的問題,必須要用三極管或鎖存器驅動數碼管,你這是常見的驅動設計問題

好的,謝謝
回復

使用道具 舉報

ID:1137639 發表于 2025-4-17 15:44 | 顯示全部樓層
你好! 從你描述的情況來看,程序對應要求的錯誤還很多; 只能根據你的要求,把程序分功能模塊逐段調試。
回復

使用道具 舉報

ID:332444 發表于 2025-4-19 08:36 | 顯示全部樓層
622323wjl 發表于 2025-4-17 15:44
你好! 從你描述的情況來看,程序對應要求的錯誤還很多; 只能根據你的要求,把程序分功能模塊逐段調試。

這個帖子也翻找出來了,許多年了未知題主還關注不,看看我當時回復挺搞笑的,不知道怎么想的!電路圖中數碼管沒錯,代碼用阻塞不是很好選擇,雖然是獨立按鍵,但是整組使用時可以不單獨定義,整組判斷可對應一個按鍵操作,賦值255判斷是否不等于255就有按鍵按下,特定值對應一個按鍵,另外2個按鍵可獨立定義,按鍵寫中斷不是很好選擇,尤其還有阻塞參與其中,按鍵要求盡量快判斷結束,不影響數碼管顯示時間。
回復

使用道具 舉報

ID:332444 發表于 2025-4-19 08:42 | 顯示全部樓層
當時提出用鎖存器也是一個辦法,現在看來從軟件上能解決,那是要重寫這個程序。
回復

使用道具 舉報

ID:1109793 發表于 2025-4-19 15:28 | 顯示全部樓層
這種按鍵判定方式有問題,假設同一時刻有多個按鍵按下,那么接P3高位的就優先被判定,然而事實上極大可能是相對低位的按鍵先按下,只是在你讀取之前,相對高位的按鍵也按下了,此時你讀到的是2個位為0的數據,但是你在先判定了高位的就是后按下的那個之后便不再理會相對低位的那個開關了,雖然這個時間很短,參賽者只能認倒霉,但是這種情況還是極有可能的。
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 精品一二区 | 国产精品久久9 | 99久久亚洲| 精品国产一区一区二区三亚瑟 | 日本黄色大片免费看 | 国产一区二区在线免费观看 | 第四色狠狠 | 久久久99精品免费观看 | 超碰网址 | av手机在线免费观看 | 成人av一区二区亚洲精 | 日韩中文字幕网 | 羞羞视频一区二区 | 国产欧美日韩综合精品一区二区 | 伊人精品一区二区三区 | 亚洲网一区 | 97色在线视频 | 亚洲网站在线播放 | 成人免费毛片在线观看 | 免费在线一区二区三区 | 欧美精品一区二区三区在线播放 | 国产二区视频 | 日韩欧美一区二区三区免费看 | 日本精品999 | 欧美a在线| 91色视频在线观看 | 久久久国产亚洲精品 | 成年人免费在线视频 | 91av在线不卡| 日本三级黄视频 | 欧美激情精品久久久久久 | a级网站| 久久69精品久久久久久国产越南 | 乱码av午夜噜噜噜噜动漫 | 国产免费看 | 日韩成人免费视频 | 久草在线在线精品观看 | 91成人免费观看 | 国产精品久久精品 | 亚洲最大的成人网 | 国产999精品久久久久久 |