历史上的今天
今天是:2024年12月30日(星期一)
2021年12月30日 | 基于51单片机的简易摇号抽奖机器
2021-12-30 来源:eefocus
硬件设计
仿真图:
基于C51处理器,显示器基于LCD12864,通过一个按键开始抽奖,随机抽奖有谢谢参与 三等奖 二等奖 一等奖 特等奖

代码设计
/*******************************************************************/
/* LCD型号:TS12864A-3(带汉字库)或兼容型号 控制器ST7920 */
/* MCU:STC89S52 ,晶体频率:11.0592MHz */
/*******************************************************************/
#include #include #include #include #include #include #define delayNOP(); {_nop_();_nop_();_nop_();_nop_();}; //延时4us #define uchar unsigned char #define uint unsigned int /*12864端口定义*/ #define LCD_data P0 //数据口 sbit LCD_RS = P3^5; //寄存器选择输入 sbit LCD_RW = P3^6; //液晶读/写控制 sbit LCD_EN = P3^4; //液晶使能控制 sbit LCD_PSB = P3^7; //串/并方式控制 uint t=0; uchar num=0; uchar t_flag=0; uchar a_flag=0; uchar end_flag=0; uchar code dis[][17]={"祝你好运!","开始抽奖","恭喜你获得:"}; uchar code award[][17]={"特等奖","1等奖","2等奖","3等奖","谢谢参与"}; uchar code time[][17]={"3","2","1"}; void delay(int ms) // 毫秒延时函数 { while(ms--) { uchar i; for(i=0;i<250;i++) { _nop_(); //空操作,耗时1个指令周期,晶振12MHz时,耗时1us _nop_(); _nop_(); _nop_(); } } } /*******************************************************************/ /*检查LCD忙状态 */ /*lcd_busy为1时,忙,等待。lcd-busy为0时,闲,可写指令与数据。 */ /*******************************************************************/ bit lcd_busy() { bit result; LCD_RS = 0; LCD_RW = 1; LCD_EN = 1; delayNOP(); //延时4us result = (bit)(P0&0x80); LCD_EN = 0; return(result); } /*******************************************************************/ /*写指令数据到LCD */ /*RS=L,RW=L,E=高脉冲,D0-D7=指令码。 */ /*******************************************************************/ void lcd_wcmd(uchar cmd) { while(lcd_busy()); LCD_RS = 0; LCD_RW = 0; LCD_EN = 0; _nop_(); _nop_(); P0 = cmd; delayNOP(); LCD_EN = 1; delayNOP(); LCD_EN = 0; } /*******************************************************************/ /*写显示数据到LCD */ /*RS=H,RW=L,E=高脉冲,D0-D7=数据。 */ /*******************************************************************/ void lcd_wdat(uchar dat) { while(lcd_busy()); LCD_RS = 1; LCD_RW = 0; LCD_EN = 0; P0 = dat; delayNOP(); LCD_EN = 1; delayNOP(); LCD_EN = 0; } //写字符串 void lcd_wstr(uchar* dat) { uchar i=0; while(dat[i] != '




