久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费
標題:
有倒計時功能的單片機八路搶答器Proteus仿真程序
[打印本頁]
作者:
whiteM3
時間:
2019-7-30 17:14
標題:
有倒計時功能的單片機八路搶答器Proteus仿真程序
搶答器正常情況下使用很ok,并且可以調節(jié)倒計時時間于LCD1602顯示。
非正常情況下,會有些漏洞存在,感興趣的朋友可以進一步完善。
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
QQ圖片20190730171003.png
(73.2 KB, 下載次數: 81)
下載附件
八路搶答器
2019-7-30 17:10 上傳
單片機源程序如下:
//有倒計時功能的八路搶答器C語言程序:
#include<reg52.h>
#define LCDPORT P0 //LCD數據線
#define KEY P3 //八路搶答按鍵
typedef unsigned char uchar;
typedef unsigned int uint;
sbit begin=P1^1; //開始鍵
sbit set=P1^2; //設置時間鍵
sbit add=P1^3;
sbit dec=P1^4;
sbit rst=P1^5; //復位鍵
sbit light=P1^6; //開始指示燈
sbit speaker=P1^7; //控制蜂鳴器
sbit lcdrs=P2^0;
sbit lcdrw=P2^1;
sbit lcden=P2^2;
uchar code table[]="00:15"; //初始值的設定
uint aa=0,bb=0,cc=0,dd=0; //用于計數
uchar start; //開始標志
uchar stop; //結束標志
uchar reset; //復位標志
uchar miao=15;
uchar fen=0;
bit lockflag=0; //鎖定標志,標志著已經有人搶答成功
bit spflag=0; //開始聲響標示
bit ovflag=0; //超時聲響標志
/****延時z毫秒*******/
void delay(uint z)
{
uchar x,y;
for(x=z;x>0;x--)
for(y=250;y>0;y--); //晶振為12MHZ:4*250*z=z ms
}
/***液晶寫地址******/
void write_com(uchar com)
{
lcdrs=0;
lcdrw=0;
P0=com;
lcden=1;
delay(3);
lcden=0;
}
/****液晶寫數據******/
void write_data(uchar date)
{
lcdrs=1;
lcdrw=0;
P0=date;
lcden=1;
delay(3);
lcden=0;
}
/***液晶初始化********/
void lcd_init()
{
uchar num;
write_com(0X38); //初始化
write_com(0X0c); //打開光標 0x0c不顯示光標,0x0e光標不閃,0x0f光標閃
write_com(0X06); //清顯示
write_com(0X80); //顯示第一行,第二行為(0x80+0x40)
for(num=0;num<5;num++)
{
write_data(table[num]);
delay(5);
}
}
/******定時器初始化*******/
void timer_init()
{
TMOD=0x11; //工作方式的選擇
TH0=(65536-50000)/256;
TL0=(65536-50000)%256; //50ms
ET0=1;
TH1=(65536-500)/256;
TL1=(65536-500)%256; //0.5ms
ET1=1;
EA=1;
TR0=0;
TR1=0;
}
/*****顯示分*****/
void display1(uchar fen)
{
uchar shi,ge;
shi=fen/10;
ge=fen%10;
write_com(0X80);
write_data(0X30+shi); //這里要注意,顯示的是ASCII碼!
write_data(0X30+ge);
}
/*****顯示秒*******/
void display(uchar miao)
{
uchar shi,ge;
shi=miao/10;
ge=miao%10;
write_com(0X80+3) ;
write_data(0X30+shi); //這里要注意,顯示的是ASCII碼!
write_data(0X30+ge);
}
/******定時器0的中斷服務程序******/
//倒計時
void timer0() interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
aa++;
if(aa==20) //20*50ms=1s
{
aa=0;
miao--;
if(miao==0)
{
if(fen==0)
{
stop=1; //時間到了,搶答超時
TR0=0; //關閉定時器
light=1; //把燈也關了
TR1=1; //開啟定時器1,響聲
ovflag=1; //超時標志
}
else
{
fen--;
miao=59;
}
}
display(miao); //更新顯示數據
display1(fen);
}
}
/*****鍵盤掃描程序********/
uchar keyscan()
{
uchar keyn;
if(KEY!=0xff)
{
delay(5); //延時5ms作消抖處理
if(KEY!=0xff) //確認有按鍵按下
{
switch(KEY)
{
case 0xfe:keyn=0;break;
case 0xfd:keyn=1;break;
case 0xfb:keyn=2;break;
case 0xf7:keyn=3;break;
case 0xef:keyn=4;break;
case 0xdf:keyn=5;break;
case 0xbf:keyn=6;break;
case 0x7f:keyn=7;break;
}
while(KEY!=0xff); //等待松手
}
}
if(begin==0)
{
delay(5); //延時5m作消抖處理
if(begin==0)
{
keyn=8;
while(!begin);
}
}
if(set==0)
{
delay(5); //延時5m作消抖處理
if(set==0)
{
while(!set);
delay(5);
while(!set);
bb++;
}
}
if(bb==1)
{
write_com(0x80+4);
write_com(0x0f);
}
if(bb==2)
{
write_com(0x80+1);
write_com(0x0f);
}
if(add==0)
{
delay(5); //延時5m作消抖處理
if(add==0)
{
while(!add);
delay(5);
while(!add);
//修改秒,增加1
if(bb==1)
{
uchar ge,shi;
miao++;
shi=miao/10;
ge=miao%10;
//秒的修整
if(miao==60)
{
ge=0;
shi=0;
}
//顯示修整值
miao=shi*10+ge;
display(miao);
write_com(0x80+4);//把光標位置移回來
}
//修改分鐘,加一
if(bb==2)
{
uchar ge,shi;
fen++;
shi=fen/10;
ge=fen%10;
if(fen==60)
{
ge=0;
shi=0;
}
fen=shi*10+ge;
display1(fen);
write_com(0x80+1);
}
}
}
if(dec==0)
{
delay(5); //延時5m作消抖處理
if(dec==0)
{
while(!dec);
delay(5);
while(!dec);
if(bb==1)
{
uchar ge,shi;
miao--;
shi=miao/10;
ge=miao%10;
if(miao==-1)
{
shi=5;
ge=9;
}
miao=shi*10+ge;
display(miao);
write_com(0x80+4);
}
//修改分鐘
if(bb==2)
{
uchar ge,shi;
fen--;
shi=fen/10;
ge=fen%10;
if(fen==-1)
{
shi=5;
ge=9;
}
fen=shi*10+ge;
display1(fen);
write_com(0x80+1);
}
}
}
if(bb==3)
{
bb=0;
write_com(0x0c);
}
if(rst==0)
{
delay(5); //延時5m作消抖處理
if(rst==0)
{
keyn=9;
while(!rst);
}
}
return(keyn);
}
/*******定時器1的中斷服務程序*******/
//喇叭聲響
void timer1() interrupt 3
{
TH1=(65536-500)/256;
TL1=(65536-500)%256; //重裝初值
if(spflag) //開始時先響500ms
{
speaker=!speaker;
dd++;
if(dd>1000) //0.5ms*1000=500ms
{
dd=0;
TR1=0; //停止定時器
spflag=0;
}
}
if(ovflag) //超時聲響
{
dd++;
if(dd%4==0){speaker=!speaker;}
if(dd>3000)
{
dd=0;
TR1=0;
// ovflag=0;
}
}
}
void restart()
{
uchar num;
start=0;
TR0=0; //關閉定時器才能停止計時
TR1=0;
miao=0;
fen=0;
spflag=0;
ovflag=0;
lockflag=0; //各種標志清零
P1=0XFF;
P3=0XFF;
miao=15;
fen=0;
lcd_init();
timer_init();
write_com(0x80+0x40);
write_data(' ');
}
void main()
{
uchar a;
lcd_init();
timer_init();
while(1)
{
a=25;
a=keyscan();
if(a!=25)
{
if(a==8) //按下開始鍵
{
start=1; //第一次按下就要開始搶答
light=0; //燈亮表示開始
spflag=1; //標志開始的聲響
EA=1; //啟動定時器
TR0=1;
TR1=1;
}
while(start) //已經按下開始鍵后才作下面處理
{
a=keyscan();
if(a>=0&&a<8&&lockflag==0&&ovflag==0)
{
write_com(0x80+0x40) ;
write_data(0x30+a);
TR0=0; //關閉定時器停止計時
lockflag=1; //鎖定
start=0;
}
if(lockflag==1)start=0;
}
if(a==9)restart(); //按下復位鍵
}
}
}
復制代碼
所有資料51hei提供下載:
有倒計時功能的八路搶答器.zip
(57.34 KB, 下載次數: 49)
2019-7-30 17:13 上傳
點擊文件名下載附件
C51
下載積分: 黑幣 -5
歡迎光臨 (http://www.zg4o1577.cn/bbs/)
Powered by Discuz! X3.1
主站蜘蛛池模板:
国产精品久久久乱弄
|
欧美 日韩 在线播放
|
成人在线观看亚洲
|
欧美日韩91
|
欧美一级视频免费看
|
国产精品污污视频
|
97caoporn国产免费人人
|
成人国产精品入口免费视频
|
91激情视频
|
最新中文字幕一区
|
放个毛片看看
|
五月婷婷在线播放
|
在线看一区二区
|
久久天堂网
|
国产精品夜间视频香蕉
|
一区二区三区四区不卡
|
日日做夜夜爽毛片麻豆
|
黑人性hd
|
国产欧美精品在线观看
|
日本天堂视频
|
欧美精品1区2区3区 免费黄篇
|
国产视频一二三区
|
日韩毛片在线观看
|
精品九九九
|
男女免费在线观看视频
|
午夜精品影院
|
中文一区二区视频
|
成人亚洲片
|
91中文字幕在线
|
视频一区二区在线观看
|
激情网站
|
国产高清一区二区三区
|
亚洲一区二区不卡在线观看
|
黄色高清视频
|
欧美日韩第一页
|
亚洲男人天堂2024
|
国产一区二区精品在线观看
|
www.毛片
|
日韩中文字幕在线播放
|
日韩欧美在线视频
|
国产成人精品久久二区二区
|