单片机实验(一)

前言

实验一:用单片机控制多只数码管(屏)分别左、右滚动显示自己完整的学号;
实验二:用单片机控制LED16×16点阵交替正序、逆序显示自己的中文姓名。

参考链接:

LED数码管的静态显示与动态显示(Keil+Proteus)-CSDN博客

LED点阵显示原理(取字模软件+Keil+Proteus)-CSDN博客

C51单片机笔记(动态数码管与8*8点阵) - 知乎 (zhihu.com)

实验一

keil

我不知道这个是不是我理解的那个意思,如果不需要实现同时点亮八个数码管的话(不知道能不能实现),就是每次点亮一个的话,这个滚动就只需要修改循环和增加数组里面的元素即可。

只需要修改keil,不需要修改proteus的原理图。

原理:P0口根据共阳极的码来确定输出什么数字,P2来确定在哪一个地方输出,可以用到移位函数方便一点。

右移滚动

#include<reg51.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
	
uchar code dis_code[]={0xA4,0xC0,0xA4,0xF9,0x99,0xC0,0xA4,0xC0,0xC0,0xF9,0xA4,0x82};//202140200126(共阳极段码表)

//延时
void delay(uint t){
	uchar i;
	while(t--)
		for(i=0;i<200;i++);
}

void main(){
	uchar i,j=0x80;
	while(1){
		for(i=0;i<12;i++){
			j=_crol_(j,1);//循环移位函数,将j循环右移1位
			P0=dis_code[i];//P0口输出段码
			P2=j;//P2口输出位控码
			delay(123);//延时
			P0=0x00;
		}
	}
}

 左移滚动

下面两种都可以,前者就是修改了最开始输出的位置j和移位函数,后者将输出反过来,将数组反过来了,总之前者更加简便一点。

#include<reg51.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
	
uchar code dis_code[]={0xA4,0xC0,0xA4,0xF9,0x99,0xC0,0xA4,0xC0,0xC0,0xF9,0xA4,0x82};//202140200126(共阳极段码表)


//延时
void delay(uint t){
	uchar i;
	while(t--)
		for(i=0;i<200;i++);
}

void main(){
	uchar i,j=0x01;
	while(1){
		for(i=0;i<12;i++){
			j=_cror_(j,1);//循环移位函数,将j循环右移1位
			P0=dis_code[i];//P0口输出段码
			P2=j;//P2口输出位控码
			delay(123);//延时
			P0=0x00;
		}
	}
}
#include<reg51.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
	

uchar code dis_code[]={0x82,0xA4,0xF9,0xC0,0xC0,0xA4,0xC0,0x99,0xF9,0xA4,0xC0,0xA4};//621002041202

//延时
void delay(uint t){
	uchar i;
	while(t--)
		for(i=0;i<200;i++);
}

void main(){
	uchar i,j=0x01;
	while(1){
		for(i=0;i<12;i++){
			j=_cror_(j,1);//循环移位函数,将j循环右移1位
			P0=dis_code[11-i];//P0口输出段码
			P2=j;//P2口输出位控码
			delay(123);//延时
			P0=0x00;
		}
	}
}

35f409fb449948e18399a4bbd6e58761.png

576678ae973a400e8d105f79d9050f54.png

实验二

keil

这个只需要修改keil的代码,不需要改Proteus中的原理图。

keil修改部分就是修改数组和循环,修改数组表示你要输出什么,修改循环表示你要输出几个字,

扫描二维码关注公众号,回复: 17161339 查看本文章

如果姓名一起只有两个字,就需要把循环改成四次,把数组里面的元素之前是顺序排列了一次,如今增加逆序的部分。

原理:通过P1口控制当前扫描的行,通过P0口和P2来确定当前行哪些地方需要点亮,当扫描的速度过快的时候就让人感觉是整个汉字一起打印的,所以数组里面装着就是你姓名对应的16*16点阵码。

#include <reg51.h>
#define uchar unsigned char
#define uint unsigned int 
#define out0 P0
#define out1 P1
#define out2 P2


void delay(uint y) //延时函数
{
	uchar x=250;
	for(;y>0;y--)
	{
		while(--x);
		x=100;
	}
}

uchar code string[]=
{
/*--  文字:  刘  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
0x08,0x20,0x10,0x20,0x10,0x20,0xFF,0x25,0x40,0x24,0x42,0x24,0x44,0x24,0x28,0x24,
0x28,0x24,0x10,0x24,0x10,0x24,0x28,0x24,0x24,0x20,0x42,0x20,0x41,0x28,0x00,0x10,

/*--  文字:  健  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
0x08,0x04,0x08,0x04,0x08,0x3F,0x74,0x24,0xC4,0x7F,0x46,0x24,0x26,0x3F,0x25,0x04,
0x74,0x3F,0x44,0x04,0x44,0x04,0xD4,0x7F,0x24,0x04,0x64,0x04,0x94,0x7F,0x0C,0x00,

/*--  文字:  健  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
0x08,0x04,0x08,0x04,0x08,0x3F,0x74,0x24,0xC4,0x7F,0x46,0x24,0x26,0x3F,0x25,0x04,
0x74,0x3F,0x44,0x04,0x44,0x04,0xD4,0x7F,0x24,0x04,0x64,0x04,0x94,0x7F,0x0C,0x00,
	
	/*--  文字:  刘  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
0x08,0x20,0x10,0x20,0x10,0x20,0xFF,0x25,0x40,0x24,0x42,0x24,0x44,0x24,0x28,0x24,
0x28,0x24,0x10,0x24,0x10,0x24,0x28,0x24,0x24,0x20,0x42,0x20,0x41,0x28,0x00,0x10,

}  ;
void main()
{	uchar i,j,n;
	while(1)
	{
		for(j=0;j<4;j++)	//共显示4个汉字
		{
			for(n=0;n<40;n++)//每个汉字整屏扫描40次
			{
				for(i=0;i<15;i++)//逐行扫描16行
				{
					out1=i%15;//输出行码
			        out0=string[i*2+j*32];//输出列码C0~C7
					out2=string[i*2+1+j*32];//输出列码C8~C15
					delay(4);//每一行之间的延时
					//out0=0xff;
					//out2=0xff;
				}
			}
		}
	}
}

94fd774ce3d44e2c877344fa92effc29.png

运行结果

14b3f9f8c5814c269976bcfc5de9dddd.png

总结

继续努力

猜你喜欢

转载自blog.csdn.net/weixin_64066303/article/details/134429449