历史上的今天
返回首页

历史上的今天

今天是: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] != ''&&i<16)

    {                         //显示字符

      lcd_wdat(dat[i]);

      i++;

    }

}

/*******************************************************************/

/*  LCD初始化设定                                                  */

/*******************************************************************/

void lcd_init()


    LCD_PSB = 1;         //并口方式

    

//  lcd_wcmd(0x34);      //扩充指令操作

//  delay(5);

    lcd_wcmd(0x30);      //基本指令操作

    delay(5);

    lcd_wcmd(0x0C);      //显示开,关光标

    delay(5);

    lcd_wcmd(0x01);      //清除LCD的显示内容

    delay(5);

}

/*********************************************************/

/* 设定显示位置                                          */

/*********************************************************/

void lcd_pos(uchar X,uchar Y)

{                          

   uchar  pos;

   if (X==0)

     {X=0x80;}

   else if (X==1)

     {X=0x90;}

   else if (X==2)

     {X=0x88;}

   else if (X==3)

     {X=0x98;}

   pos = X+Y ;  

   lcd_wcmd(pos);     //显示地址

}

//中断初始化

void interrupt_init()

{

EA=1;/*开全局中断*/

EX0=1;/*允许INT0中断*/

IT0=1;/*设置外部中断触发方式:下降沿触发*/

TMOD=0x11;

ET0=1;

ET1=1;

TR0=0;

TR1=0;

TH0=15535/256; //计时50ms

TL0=15535%256;

TH1=55535/256; //计时10ms

TL1=55535%256;

}

/*********************************************************/

/* 主程序            */

/*********************************************************/

void  main()

 {

  uchar str[17]="        ";

  interrupt_init();

    delay(10);                 //延时

    lcd_init();                //初始化LCD             

  lcd_pos(1,4-strlen(dis[0])/4);            //设置显示位置为第二行的第1个字符

    lcd_wstr(dis[0]);      //显示字符


while(1)

{

delay(50);

if(t_flag==1)

{

t_flag=0;

lcd_pos(2,0);

lcd_wstr(str);      

delay(5);

lcd_pos(2,4-strlen(time[num])/4);

lcd_wstr(time[num]);

}

    else if(a_flag==1)

{

a_flag=0;

lcd_wcmd(0x01);

lcd_pos(2,4-strlen(award[num])/4);

lcd_wstr(award[num]);

if(end_flag==1)

{

end_flag=0;

lcd_pos(0,4-strlen(dis[2])/4);

lcd_wstr(dis[2]);

}

}

delay(10);

}

}


文件仅供参考


链接:https://pan.baidu.com/s/19En1NJREX5SyZ00IHkzvAg

提取码:7tff

推荐阅读

史海拾趣

旌芯半导体(GN)公司的发展小趣事

机顶盒,全称数字视频变换盒(Set Top Box,简称STB),是连接电视机与外部信号源的关键设备。它不仅能接收来自有线电缆、卫星天线、宽带网络及地面广播的数字电视信号,还能将这些信号转换成适合电视机播放的格式,极大地丰富了电视节目的选择,提升了观看体验。

从技术层面看,机顶盒具备强大的媒体处理能力和交互功能。它能接收高清乃至4K的超高清电视节目,并通过内置的解码器将数字信号转换为电视可识别的视频和音频流,实现细腻的画面和震撼的音效。此外,机顶盒还支持数据广播、电子节目指南(EPG)、因特网接入、视频点播等多种增值服务,使电视机成为了一个互动的智能终端。

随着技术的不断进步,机顶盒正朝着高清化、智能化方向发展。智能化技术如人工智能(AI)的集成,使机顶盒具备了语音助手、智能推荐等功能,为用户提供了更为便捷、智能的使用体验。同时,云计算和边缘计算技术的应用,也进一步提升了内容分发和管理的效率。

综上所述,机顶盒作为连接电视与外部世界的桥梁,不仅是现代家庭娱乐不可或缺的一部分,也是推动数字电视技术发展的重要力量。随着技术的持续进步和市场需求的不断增长,机顶盒的未来将更加丰富多彩,为用户提供更加优质、便捷的观影体验。

爱特姆(ATOM)公司的发展小趣事

爱特姆科技自在美国德克萨斯州休斯顿市成立以来,便致力于电子行业的创新与发展。1998年,公司成功创立了“ATOM”品牌,标志着其正式踏入了品牌化发展的道路。起初,爱特姆以台湾、深圳、昆山为主要研发生产基地,凭借对技术的不断追求和对市场的敏锐洞察,逐渐在连接器领域取得了突破。

Global Connector Technology公司的发展小趣事
安装位置不正确或连接线路错误,导致继电器无法正常检测到断相故障。
Datalogic公司的发展小趣事

Datalogic公司自成立以来,一直致力于技术创新。在1990年代,随着电子行业的快速发展,对高精度数据采集和处理的需求日益增加。Datalogic凭借其深厚的技术积累,成功研发出一系列高性能的条码扫描器和数据采集器,这些产品凭借其高效、稳定的表现,迅速在电子行业占据了一席之地。

High Energy Corp公司的发展小趣事

随着电动汽车行业的兴起,汽车行业对零部件的标记和追踪要求也日益严格。Datalogic凭借其强大的技术实力,成功开发出3W固态激光打标机Vlase UV 3,该产品能够在橙色部件上实现高度可见、稳定和持久的对比度标记,解决了电动汽车生产中的一大难题。这一创新不仅展示了Datalogic的技术实力,也进一步巩固了其在电子行业中的领先地位。

DIOO公司的发展小趣事

面对数字化时代的挑战和机遇,DIOO公司决定加快数字化转型步伐。通过引入云计算、大数据、人工智能等先进技术,DIOO公司实现了产品设计、生产、销售等各个环节的数字化管理。同时,DIOO公司还积极探索新的商业模式和市场机会,与互联网企业、电信运营商等合作伙伴共同打造智能生态圈。未来,DIOO公司将继续秉承创新、卓越、服务的理念,致力于成为全球领先的电子产品制造商和服务提供商。

问答坊 | AI 解惑

V2.0的采样时钟设计~

考虑时钟频率大于100MHz,同时,相位要比较精确.而且,当被采样信号在50M时,为设计达到7位以上的有效分辨率(ADC08200在被采样信号50M时典型ENOB为7.3位),同时有45DB以上信噪比(SNR),要求时钟的孔径抖动小于25ps,如此就对时钟源提出很高的要求. 有效位 ...…

查看全部问答>

NK.bin中N代表什么

nk.bin作为wince的内核文件,K 应该是Kernel,内核的意思吧。那么,其中的N代表什么呢…

查看全部问答>

mobile 的.exe程序在非触摸屏的手机里如何运行

mobile 的.exe程序在非触摸屏的手机里如何运行??请各位大虾指点 还有一个问题就是在部署程序时,当部署toolhelp.dll时提示在一个非套接字上尝试了一个套接字操作的错误,请各位高手指点,谢谢!…

查看全部问答>

最近有人找我做项目,可是我对项目的内容完全陌生

          最近一个学长介绍一个项目给我,我原来做的都是单片机,小功率电源,都是简单东西,可是项目的要求做的是高频滤波器之类的,一下子从低频的东西到了高频的东西,很迷茫,和一个工程师聊了 ...…

查看全部问答>

STM32IARRAM的问题,急!

IAR编译的C,函数体内的变量是存在堆里还是栈里啊?哪位大虾给指点一下。 症状: 在函数体内使用1.6KB大小数组,运行死机;将同一数组移至函数体外成为静态数组,运行通过。 xcl文件的配置如下,都给了16KB了: -D_CSTACK_SIZE=4000 -D_HE ...…

查看全部问答>

【低功耗】Artix-7 FPGA 系列资料大合集(二)

非常全的Artix-7 FPGA 系列资料 希望广大坛友顶起啊 为低功耗做贡献啊7 Series FPGAs User Guides 7 Series FPGAs Package Specifications [ 本帖最后由 hangsky 于 2011-11-10 12:53 编辑 ]…

查看全部问答>

SDRAM时钟频率设置

请问SDRAM的如果是PC133标准,那么他的工作频率必须工作在133M吗?最低值可以设置到多少?能用20M吗?…

查看全部问答>

【设计工具】PCI Express增强型端点模块核的总线主DMA参考设计

在本应用指南中,Jake Wiltgen介绍了如何利用包含了集成式PCI Express® 模块的Virtex®-5 FPGA为PCI Express增强型端点模块封装核设计和实现总线主直接存储器存取(DMA)设计。总线主DMA(BMD)设计可以将数据写入主存储器或从主存储器中读取数 ...…

查看全部问答>

msp430f149 按键接法

在P1口接个按键到地           不接上拉电阻可以吗?…

查看全部问答>

对于MSP430F5X系列的时钟系统的详细介绍

对于MSP430F5X系列的时钟系统的详细介绍可直接点击下载,也可附件下载…

查看全部问答>