WHCSRL 技术网

51单片机挑战10秒免费下单

 原理思路:

  看了短视频里的火锅店搞了一个“挑战10秒免单”,学了大半年的单片机觉得这是生活中我为数不多的能大致实现的了,于是花了两天时间修修改改写成个下面这个“挑战10秒”。

  原理其实很简单,就是用51单片机捕获高电平,纪录高电平也就是按下按钮的时间,当刚好按够10:00秒LED的第二行显示'Victory!',否则显示'Defeat!'。为了显示'Victory!'我试了十多次才成功,看来想要免单还是很不容易的。

效果展示:

用51单片机“挑战10秒赢免单”

打包下载地址:

https://download.csdn.net/download/small_planet/33218591https://download.csdn.net/download/small_planet/33218591

代码:

  外部中断0,下降沿中断,松开按钮会触发这个中断,ic_sta高两位置10,表示完成一次挑战,可以接收下一次挑战

  1. void exti0() interrupt 0 //注意:刚开始会有两次下降沿触发
  2. {
  3. if(flag>0)
  4. {
  5. ic_sta|=0x8000;
  6. ic_sta&=0xbfff; //让高两位变成10,其他位不变
  7. }
  8. else
  9. {
  10. flag++;
  11. }
  12. }

定时器中断,定时器记的数溢出会触发这个中断

  1. void time0() interrupt 1
  2. {
  3. TH0=(65535-46083)/256; //1.085us,溢出一次50ms
  4. TL0=(65535-46083)%%%%256;
  5. if((ic_sta&0x4000)==0x0000) //第一次捕获到高电平
  6. {
  7. ic_sta=0x4001;
  8. }
  9. else //此前已经捕获到了高电平
  10. {
  11. ic_sta++;
  12. }
  13. }

主函数,循环显示

  1. int main()
  2. {
  3. unsigned int i,t;
  4. unsigned char num[6]={'0','0',':','0','0',''};
  5. unsigned char victory[]={'V','i','c','t','o','r','y','!',' ',' ',''};
  6. unsigned char defeat[]={'D','e','f','e','a','t','!',' ',' ',' ',''};
  7. unsigned char goodluck[]={'G','o','o','d',' ','L','u','c','k','!',''};
  8. p10=1;
  9. time_init();
  10. LCD_Initial();
  11. while(1)
  12. {
  13. count=ic_sta&0x3fff;
  14. time=50*count; //ms
  15. for(i=0,t=10000;i<5;i++)
  16. {
  17. if(i==2)
  18. {
  19. continue;
  20. }
  21. num[i]=time/t+'0';
  22. time-=(num[i]-'0')*t;
  23. t/=10;
  24. }
  25. delay(100);
  26. LCD_Initial();
  27. LCD_Print(0,0,num);
  28. if(ic_sta&0x8000) //已经完成一次挑战
  29. {
  30. if(num[0]=='1'&&num[1]=='0'&&num[3]=='0'&&num[4]=='0')
  31. {
  32. LCD_Print(0,1,victory);
  33. }
  34. else
  35. {
  36. //Defeat!
  37. LCD_Print(0,1,defeat);
  38. }
  39. }
  40. else
  41. {
  42. //Good Luck!
  43. LCD_Print(0,1,goodluck);
  44. }
  45. }
  46. }

推荐阅读