51单片机16×16点阵led屏滚动显示+protues仿真+按键功能(史上最全)

文章目录

  • 前言
  • 一、protues仿真
    • 安装软件
    • 绘制原理图
  • 二、keil程序编写
    • 1.
  • 三、仿真示例


前言

本次任务:基于protues仿真实现at89c51控制16×16点阵led屏实现流水文字滚动,按键实现暂停,反向,调速
需要用到的工具:keil5,protues8.9


提示:以下是本篇文章正文内容,下面案例可供参考

一、protues仿真

安装软件

protues是一款仿真软件,推荐使用最新版protues8.9具体下载地址:protues8.9安装

绘制原理图

由于官方所给库中只有8×8点阵,现有两个方案:1自行绘制一个16×16点阵教程
2,用四块8×8点阵拼接而成(由于技术有限选择方案二)
51单片机16×16点阵led屏滚动显示+protues仿真+按键功能(史上最全)_第1张图片
先点开元件库,在库里搜索我们需要的元件
51单片机16×16点阵led屏滚动显示+protues仿真+按键功能(史上最全)_第2张图片
接下来任选一个自己喜欢的颜色,同理选择at89c51芯片,74h138,按键,电阻电容等等。
51单片机16×16点阵led屏滚动显示+protues仿真+按键功能(史上最全)_第3张图片
左上部分为51最小系统固定格式,照抄就好
51单片机16×16点阵led屏滚动显示+protues仿真+按键功能(史上最全)_第4张图片
四块数码点阵图51单片机16×16点阵led屏滚动显示+protues仿真+按键功能(史上最全)_第5张图片
51单片机16×16点阵led屏滚动显示+protues仿真+按键功能(史上最全)_第6张图片
完整示例

二、keil程序编写

1.

代码如下(示例):

#include
#include
#define uchar unsigned char
#define uint unsigned int
#define data1 P0
#define data2 P2
sbit s1=P3^6;
sbit s2=P3^7;
sbit s3=P3^4;
bit fangxiang;
uint net=0,sl=128;
int i = 20;
int alt =0;
bit mode;
uchar code tab[]={
//

0x00,0x01,0x00,0x02,0x03,0xEC,0x02,0x20,0x02,0x20,0x02,0x28,0xFE,0x26,0x12,0x20,0x12,0x28,0x12,0x26,0x12,0x20,0x13,0xE0,0x10,0x08,0x10,0x07,0x00,0x00,0x00,0x00,/*"点",0*/
/* (16 X 16 , 宋体 ) */

0x01,0x00,0x01,0x00,0x02,0x00,0x04,0x00,0x08,0x00,0x10,0x00,0x20,0x00,0xC3,0xFF,0x20,0x00,0x10,0x00,0x08,0x00,0x04,0x00,0x02,0x00,0x01,0x00,0x01,0x00,0x00,0x00,/*"个",1*/
/* (16 X 16 , 宋体 ) */

0x00,0x81,0x00,0x81,0x08,0x82,0x88,0x82,0x68,0x84,0x08,0x88,0x08,0xB0,0x0F,0xC0,0x08,0xB0,0x08,0x88,0x28,0x84,0xC8,0x82,0x08,0x82,0x00,0x81,0x00,0x81,0x00,0x00,/*"关",2*/
/* (16 X 16 , 宋体 ) */

0x08,0x20,0x06,0x20,0x40,0x7E,0x31,0x80,0x00,0x02,0x10,0x02,0x10,0x82,0x10,0x82,0x90,0x82,0x5F,0xFE,0x10,0x82,0x10,0x82,0x10,0x82,0x10,0x82,0x00,0x02,0x00,0x00,/*"注",3*/
/* (16 X 16 , 宋体 ) */

0x02,0x00,0x42,0x00,0x33,0xFC,0x00,0x08,0x00,0x54,0x3F,0xC8,0x6A,0x52,0xAA,0x61,0x3F,0xFE,0x01,0x00,0x08,0xC2,0x08,0x01,0xFF,0xFE,0x08,0x00,0x08,0x00,0x00,0x00,/*"谢",4*/
/* (16 X 16 , 宋体 ) */

0x02,0x00,0x42,0x00,0x33,0xFC,0x00,0x08,0x00,0x54,0x3F,0xC8,0x6A,0x52,0xAA,0x61,0x3F,0xFE,0x01,0x00,0x08,0xC2,0x08,0x01,0xFF,0xFE,0x08,0x00,0x08,0x00,0x00,0x00,/*"谢",5*/
/* (16 X 16 , 宋体 ) */



0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*" ",5*/

0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*" ",6*/

};

void delay(uint z)	   
{
   uchar x;
   for(;z>0;z--)
   for(x=110;x>0;x--);
}
void Delay20ms()		//@11.0592MHz
{
	unsigned char i, j;

	_nop_();
	_nop_();
	i = 216;
	j = 36;
	do
	{
		while (--j);
	} while (--i);
}


void xianshi()			
{ 
	uchar aa,i;
	for(i=0;i<16;i++)
	{
		P1=i; 
		data1=tab[net+aa]; 
		aa++;
		data2=tab[net+aa]; 
		aa++;
		delay(5);	
		data1=0;  
		data2=0;  
		P1=0x00;  
		if(aa>30) aa=0;  
	}		
}

void main()	 
{
   ET1=1;	
   EA=1;	 
   TR1=1;	
   while(1)	 
   {
	   xianshi();  
	   if(s1==0)   
	   {
	      delay(30);  
		  TR1=~TR1;	  
		  while(!s1)xianshi();
		  delay(30);
	   }
	   if(s2==0)	
	   {
	       delay(30);			
		   fangxiang=~fangxiang;  
		   while(!s2)xianshi();
		   delay(30);
	   }
		 if(s3==0)
		 {
			 Delay20ms();
			 alt = 0;
			 i=i-9;
			 if(i<0)
			 {
				 i=20;
			 }			 
			 Delay20ms();
	 }
}
 }
void timer1() interrupt 3
{

   alt++;
   if(alt==i)		   
   {
     alt=0;
	 if(fangxiang==0)	 
	 {
		 net=net+2;
	     if(net>sl)  
	     net=0;
	 }
	 else			   
	 {
	     net=net-2;
		 if(net<2)
		 net=sl;	  
	 }
   }
   
}

上面是main函数,下面是头文件

/*--------------------------------------------------------------------------
INTRINS.H

Intrinsic functions for C51.
Copyright (c) 1988-2010 Keil Elektronik GmbH and ARM Germany GmbH
All rights reserved.
--------------------------------------------------------------------------*/

#ifndef __INTRINS_H__
#define __INTRINS_H__

#pragma SAVE

#if defined (__CX2__)
#pragma FUNCTIONS(STATIC)
/* intrinsic functions are reentrant, but need static attribute */
#endif

extern void          _nop_     (void);
extern bit           _testbit_ (bit);
extern unsigned char _cror_    (unsigned char, unsigned char);
extern unsigned int  _iror_    (unsigned int,  unsigned char);
extern unsigned long _lror_    (unsigned long, unsigned char);
extern unsigned char _crol_    (unsigned char, unsigned char);
extern unsigned int  _irol_    (unsigned int,  unsigned char);
extern unsigned long _lrol_    (unsigned long, unsigned char);
extern unsigned char _chkfloat_(float);
#if defined (__CX2__)
extern int           abs       (int);
extern void          _illop_   (void);
#endif
#if !defined (__CX2__)
extern void          _push_    (unsigned char _sfr);
extern void          _pop_     (unsigned char _sfr);
#endif

#pragma RESTORE

#endif

将头文件导入即可
51单片机16×16点阵led屏滚动显示+protues仿真+按键功能(史上最全)_第7张图片
具体不做过多赘述;
如果需要修改文字内容,可以用取模软件
51单片机16×16点阵led屏滚动显示+protues仿真+按键功能(史上最全)_第8张图片

取模软件地址
需要注意,在放入程序后,需要将每行前后的中括号去掉

三、仿真示例

keil生成hex文件后,用protues打开
51单片机16×16点阵led屏滚动显示+protues仿真+按键功能(史上最全)_第9张图片

51单片机16×16点阵led屏滚动显示+protues仿真+按键功能(史上最全)_第10张图片
按下第一个按键即可更改速度;第二个按键暂停/启动;第三个按键反向滚动

到这里就结束啦,本人水平有限,如有错误多多指教!!

你可能感兴趣的:(51单片机,单片机,物联网,proteus,嵌入式硬件)