基于51单片机的简易摇号抽奖机器proteus仿真程序设计_fanfhl的博客-程序员宅基地

技术标签: 技术博客  

硬件设计

(末尾附文件)

仿真图:
基于C51处理器,显示器基于LCD12864,通过一个按键开始抽奖,随机抽奖有谢谢参与 三等奖 二等奖 一等奖 特等奖
在这里插入图片描述在这里插入图片描述

代码设计

/*******************************************************************/
/*  LCD型号:TS12864A-3(带汉字库)或兼容型号    控制器ST7920      */
/*  MCU:STC89S52 ,晶体频率:11.0592MHz                             */
/*******************************************************************/

#include <reg51.h>
#include <intrins.h>
#include<ctype.h>
#include<stdlib.h>
#include<stdio.h>
#include<string.h>
#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] != '\0'&&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

.

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/fanfhl/article/details/113650398

智能推荐

前端框架综述(8)前端_前端开发框架说明-程序员宅基地

前端到底有什么,现在前端各种各样,处于一个百家争鸣的情况,所以现在很多学习前端的人不知道到底应该学习哪一个框架,下面就针对现在前端的整体情况进行宏观描述。_前端开发框架说明

vscode对C#的tasks.json和launch.json文件的配置_/property:generatefullpaths=true-程序员宅基地

tasts.json{ "version": "2.0.0", "tasks": [ { "label": "build", "command": "dotnet", "type": "process", "args": [ "build", "${workspaceFolder}/CsharpTest/Csharp_/property:generatefullpaths=true

cdr添加节点快捷键_cdr快捷键大全_cdr教程【图文】-程序员宅基地

cdr快捷键大全_cdr教程【图文】cdr是一套屡获殊荣的图形、图像编辑软件,它包含两个绘图应用程序:一个用于矢量图及页面设计,一个用于图像编辑。这套绘图软件组合带给用户强大的交互式工具,使用户可创作出多种富于动感的特殊效果及点阵图像即时效果在简单的操作中就可得到实现——而不会丢失当前的工作。不过对于新手来说,cdr快捷键成为了他们熟悉cdr的重要标志,那么cdr快捷键有哪些呢?一、基础cdr快捷...

maven下的slf4j和logback简易整合_logback 1.4.8配置-程序员宅基地

1、创建一个maven工程 2、添加所需的jar包 我是在maven工程下pom.xml》dependencies》add 搜索添加的这里版本不能搞错,slf4j1.8和logback-classic不搭的如下面的错误信息,就是slf4j的版本问题了SLF4J: No SLF4J providers were found.SLF4J: Defaulting to no-operation (N_logback 1.4.8配置

Dan Ryan: Efficient and Flexible Hyperparameter Optimization | PyData Miami 2019-程序员宅基地

https://www.youtube.com/watch?v=IqQT8se9ofQ作者强调最后一点其实有paper在做robust:作者希望不要有"hyper hyper param",即优化算法应该对超参不敏感作者提到该算法对超参fraction敏感,不robusttry all the cutnaive , works very wellhow ever its not very effective提问环节,作者提到有人用TPOT取得了10% in kaggle...

随便推点

SVG配电站接线系统绘制-程序员宅基地

2019独角兽企业重金招聘Python工程师标准>>> ...

Java Study-程序员宅基地

1 关于动态加载机制学习Java比C++更容易理解OOP的思想,毕竟C++还混合了不少面向过程的成分。很多人都能背出来Java语言的特点,所谓的动态加载机制等等。当然概念往往是先记住而后消化的,可有多少人真正去体会过动态加载的机制,试图去寻找过其中的细节呢? 提供大家一个方法: 在命令行窗口运行Java程序的时候,加上这个很有用的参数: java -verbose *.cl..._d:\studyjava%e9%ab%98%e7%ba%a7\day_10_jsoup\target\classes\demo.xml (系统找

OpenCV成长之路6:实现读入图片并且对图片进行复制-程序员宅基地

复制: cvCopy(img1,img2);保存:cvSaveImage(filename,img);OpenCV实现对图的保存和复制大概就是这两个函数把必须要提的是:OpenCV不支持中文路径!!!!!如果你用下面的代码,就会出错:IplImage *pImg = cvLoadImage("d:/测试10.jpg"); IplImage* pIm

sql分组并提取每组的前一条,按照时间排序-程序员宅基地

select * from ( select row_number() over(partition by '分组' order by '日期') as rownum -- 排序并分组 , * -- 所需显示的字段 from 表) as Twhere T.rownum = 1对每组的数..._sql 分组按时间排序

Imagination宣布成立IMG实验室,致力于创造突破性技术-程序员宅基地

Tim Mamtora将担任IMG实验室负责人,领导这一面向下一代IP的技术孵化器英国伦敦,2021年3月25日 – Imagination Technologies宣布成立IMG实验室(...

linux下安装mysql5.7.17_linux下安装mysql5.7.17及简单配置_地缘谷的博客-程序员宅基地

原文:http://www.th7.cn/db/mysql/201612/218745.shtml1.mysql5.7.17安装在/usr/local/mysql目录里面,也可以安装在其他地方 (安装包最好与Linux系统一样,eg;32位的就是“mysql-5.7.17-linux-glibc2.5-i686.tar.gz”,官网可下载)mkdir /usr/local/mysql2.解压并复制..._linux mysql 5.7.17 安装

推荐文章

热门文章

相关标签