原理思路:
看了短視頻里的火鍋店搞了一個“挑戰10秒免單”,學了大半年的單片機覺得這是生活中我為數不多的能大致實作的了,于是花了兩天時間修修改改寫成個下面這個“挑戰10秒”,
原理其實很簡單,就是用51單片機捕獲高電平,紀錄高電平也就是按下按鈕的時間,當剛好按夠10:00秒LED的第二行顯示'Victory!',否則顯示'Defeat!',為了顯示'Victory!'我試了十多次才成功,看來想要免單還是很不容易的,
效果展示:
用51單片機“挑戰10秒贏免單”
打包下載地址:
https://download.csdn.net/download/small_planet/33218591
https://download.csdn.net/download/small_planet/33218591
代碼:
外部中斷0,下降沿中斷,松開按鈕會觸發這個中斷,ic_sta高兩位置10,表示完成一次挑戰,可以接收下一次挑戰
void exti0() interrupt 0 //注意:剛開始會有兩次下降沿觸發
{
if(flag>0)
{
ic_sta|=0x8000;
ic_sta&=0xbfff; //讓高兩位變成10,其他位不變
}
else
{
flag++;
}
}
定時器中斷,定時器記的數溢位會觸發這個中斷
void time0() interrupt 1
{
TH0=(65535-46083)/256; //1.085us,溢位一次50ms
TL0=(65535-46083)%256;
if((ic_sta&0x4000)==0x0000) //第一次捕獲到高電平
{
ic_sta=0x4001;
}
else //此前已經捕獲到了高電平
{
ic_sta++;
}
}
主函式,回圈顯示
int main()
{
unsigned int i,t;
unsigned char num[6]={'0','0',':','0','0','\0'};
unsigned char victory[]={'V','i','c','t','o','r','y','!',' ',' ','\0'};
unsigned char defeat[]={'D','e','f','e','a','t','!',' ',' ',' ','\0'};
unsigned char goodluck[]={'G','o','o','d',' ','L','u','c','k','!','\0'};
p10=1;
time_init();
LCD_Initial();
while(1)
{
count=ic_sta&0x3fff;
time=50*count; //ms
for(i=0,t=10000;i<5;i++)
{
if(i==2)
{
continue;
}
num[i]=time/t+'0';
time-=(num[i]-'0')*t;
t/=10;
}
delay(100);
LCD_Initial();
LCD_Print(0,0,num);
if(ic_sta&0x8000) //已經完成一次挑戰
{
if(num[0]=='1'&&num[1]=='0'&&num[3]=='0'&&num[4]=='0')
{
LCD_Print(0,1,victory);
}
else
{
//Defeat!
LCD_Print(0,1,defeat);
}
}
else
{
//Good Luck!
LCD_Print(0,1,goodluck);
}
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/323240.html
標籤:其他
