久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费
標題:
單片機+Proteus仿真四路搶答器程序
[打印本頁]
作者:
luozhao
時間:
2019-12-25 21:45
標題:
單片機+Proteus仿真四路搶答器程序
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
Snipaste_2019-12-25_21-43-19.png
(31.87 KB, 下載次數: 54)
下載附件
2019-12-25 21:44 上傳
單片機源程序如下:
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
sbit RS = P2^0;
sbit RW = P2^1;
sbit EN = P2^2;
sbit K0 = P3^0;
sbit K1 = P1^0;
sbit K2 = P1^1;
sbit K3 = P1^2;
sbit K4 = P1^3;
sbit K5 = P3^1;
sbit K6 = P2^3;
sbit K7 = P2^4;
sbit K8 = P3^4;
sbit Buzz = P3^7;
uint cnt = 0;//記錄中斷次數
uint cnt1= 0;
uint sec = 20;//記錄倒計時
uchar num = 0;//記錄搶答選手
uchar flag = 1;//搶答標志
uchar s_flag = 0;//開始標志
uchar e_flag = 0;//結束標志
uchar score[4]={0};
void init1602();
void Lcdshow(uchar x,uchar y,uchar *str);
void KeyScan();
void Keycontrol() ;
void Judge();
uchar IntToString(uchar *str, int dat);
void main()
{
uchar str1[12];
uchar str2[12];
uchar len,len1;
EA = 1;
ET0 = 1;
TMOD = 0x11;//打開定時器T0,T1
TR0 = 0;
TH0 = 0xFC;
TL0 = 0x67;
TR1 = 0;
TH1 = 0xFC;
TL1 = 0x67;
ET1 = 1;
init1602();
Lcdshow(0,0,str1);
while(1)
{
Keycontrol();
KeyScan();
len = IntToString(str1,sec);
len1= IntToString(str2,num);
if(e_flag==0)
{
Lcdshow(0,0,"Time:");
Lcdshow(6,0,str1);
}
if(num!=0&&e_flag==0&&flag==0)//沒有結束且有人按下按鍵
{
Lcdshow(0, 1, "answerer:");
Lcdshow(9, 1, str2);
}
if(e_flag==1)
{
Judge();
}
}
}
/*等待液晶準備*/
void Lcdready()
{
uchar sta;
P0 = 0xFF;
RS = 0;
RW = 1;
do
{
EN = 1;
sta = P0;//讀取狀態字
EN = 0;
}while(sta & 0x80);
}
/* 向 LCD1602 液晶寫入命令,cmd-待寫入命令值 */
void WriteCmd(uchar cmd)
{
Lcdready();
RS = 0;
RW = 0;
P0 = cmd;
EN = 1;
EN = 0;
}
/* 向 LCD1602 液晶寫入數據,dat-待寫入數據 */
void WriteData(uchar dat)
{
Lcdready();
RS = 1;
RW = 0;
P0 = dat;
EN = 1;
EN = 0;
}
/* 設置顯示 RAM 起始地址(x,y)-對應屏幕上的字符坐標 */
void Lcdaddr(uchar x,uchar y)
{
uchar m;
if(y==0)
m = 0x00+x; //第一行字符地址從 0x00 起始
else
m = 0x40+x; //第二行字符地址從 0x40 起始
WriteCmd(m | 0x80);//設置 RAM 地址
}
/* 在液晶上顯示字符串,(x,y)-對應屏幕上的起始坐標,str-字符串指針 */
void Lcdshow(uchar x,uchar y,uchar *str)
{
Lcdaddr(x,y);
while(*str != '\0')
{
WriteData(*str++);
}
}
/* 初始化 1602 液晶 */
void init1602()
{
WriteCmd(0x38);
WriteCmd(0x0C);
WriteCmd(0x06);
WriteCmd(0x01);
}
/* 整型數轉換為字符串,str-字符串指針,dat-待轉換數,返回值-字符串長度 */
unsigned char IntToString(unsigned char *str, int dat)
{
uchar i = 0;
unsigned char len = 0;
unsigned char buf[6];
if (dat < 0) //如果為負數,首先取絕對值,并在指針上添加負號
{
dat = -dat;
*str++ = '-';
len++;
}
do //先轉換為低位在前的十進制數組
{
buf[i++] = dat % 10;
dat /= 10;
} while (dat > 0);
len += i; //i最后的值就是有效字符的個數
while (i-- > 0) //將數組值轉換為ASCII碼反向拷貝到接收指針上
{
*str++ = buf[i] + '0';
}
*str = '\0'; //添加字符串結束符
return len; //返回字符串長度
}
/*簡易延時*/
void delay(uint x)
{
uchar i,j;
for(i=x;i>0;i--)
for(j=110;j>0;j--);
}
/*控制鍵掃描函數,開始結束*/
void Keycontrol()
{
if(K0==0) //開始鍵
{
delay(10);
if(K0==0)
{
while(!K0);
WriteCmd(0x01);
sec=20;
TR0=~TR0;
e_flag=0;
flag=1;
s_flag = 1;//表示已經開始
}
}
if(K5==0)
{
delay(10);
if(K5==0 && flag==0)
{
while(!K5);
e_flag =1;//表示結束
Buzz = 0;
Lcdshow(9,0,"Successed");
}
}
if(K8==0) //查分鍵
{
uchar ch;
delay(10);
if(K8==0 && e_flag==1) //按鍵按下且此時已結束
{
while(!K8);
WriteCmd(0x01);
Lcdshow(0,0,"P1:");
ch=(char) (score[1]+48);
WriteData(ch);
Lcdshow(10,0,"P2:");
ch=(char) (score[2]+48);
WriteData(ch);
Lcdshow(0,1,"P3:");
ch=(char) (score[3]+48);
WriteData(ch);
Lcdshow(10,1,"P4:");
ch=(char) (score[4]+48);
WriteData(ch);
}
}
}
/*四路熱鍵掃描(哪個鍵先按下,哪個優先級最高) */
void KeyScan()
{
if( K1==0 && flag != 0 && s_flag==1)
{
delay(10);
if(K1==0)
{
while(!K1);
num=1; //數碼管顯示1號"1"
TR0=0; //關閉定時器0,時間停止
TR1=1; //按下搶答器,蜂鳴器提醒
flag=0; //關閉開始鍵標志位,使再按其他三個鍵不會響應
}
}
if( K2==0 && flag != 0 && s_flag==1) //以下三個按鍵同一
{
delay(10);
if(K2==0)
{
while(!K1);
num=2;
TR0=0;
TR1=1;
flag=0;
}
}
if( K3==0 && flag != 0 && s_flag==1)
{
delay(10);
if(K3==0)
{
while(!K1);
num=3;
TR0=0;
TR1=1;
flag=0;
}
}
if( K4==0 && flag != 0 && s_flag==1)
{
delay(10);
if(K4==0)
{
while(!K1);
num=4;
TR0=0;
TR1=1;
flag=0;
}
}
}
void Judge()
{
if( K6==0 ) //Yes按鍵
{
delay(10);
if(K6==0)
{
while(!K6);
WriteCmd(0x01);
Lcdshow(0, 0, "Your answer is:");
Lcdshow(0, 1, "Right");
score[num]++;//為選手加分
}
}
if( K7==0 )
{
delay(10);
if(K7==0)
{
while(!K7);
WriteCmd(0x01);
Lcdshow(0, 0, "Your answer is:");
Lcdshow(0, 1, "Worry");
}
}
}
void Time0 () interrupt 1
{
TH0 = 0xFC;
TL0 = 0x67;//重賦值
cnt++;
if(cnt>=1000)
{
cnt = 0;
sec--;
if(sec==0)
TR0 = 0;
}
}
void Time1 () interrupt 3
{
TH1=(65536-2000)/256;
TL1=(65536-2000)%256;
Buzz = ~Buzz;
cnt1++;
if(cnt1==1000)
{
cnt1=0;
TR1=0;
}
}
復制代碼
所有資料51hei提供下載:
4路搶答器1602顯示.zip
(53.54 KB, 下載次數: 47)
2019-12-25 21:44 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
作者:
luozhao
時間:
2019-12-25 21:47
注釋亂碼了
歡迎光臨 (http://m.zg4o1577.cn/bbs/)
Powered by Discuz! X3.1
主站蜘蛛池模板:
成人免费视频网站在线看
|
av中文网
|
精品国产乱码久久久久久果冻传媒
|
中文字幕av一区
|
成人乱人乱一区二区三区软件
|
久久免费福利
|
国产高清在线精品一区二区三区
|
日韩精品一区二区三区免费视频
|
久久香蕉精品视频
|
国产在线不卡视频
|
久久久久久免费看
|
激情欧美日韩一区二区
|
成人夜晚看av
|
欧美日韩亚洲一区
|
精品国产乱码久久久久久老虎
|
欧美一卡二卡在线观看
|
在线视频a
|
国产精品欧美一区二区三区
|
天天综合永久入口
|
久久精品国产一区二区
|
国产农村妇女精品一二区
|
欧美亚洲另类丝袜综合网动图
|
久久久久国产一区二区三区
|
av在线三级
|
国产日韩精品视频
|
av网站在线看
|
99精品国产一区二区三区
|
亚洲免费视频一区
|
国产高清精品在线
|
国产成人免费在线
|
国产黄色一级电影
|
国产欧美视频一区二区三区
|
av一区二区三区四区
|
国产亚洲欧美在线视频
|
天堂视频中文在线
|
亚洲视频免费在线播放
|
成人午夜免费福利视频
|
日日操夜夜摸
|
涩涩视频网站在线观看
|
91国自视频
|
国精产品一品二品国精在线观看
|