51单片机入门教程(2)——流水灯的实现

目录

1、 硬件设计

2、 软件设计

3、综合调试

4、小结


1、 硬件设计

首先,介绍下流水灯的原理,下图为我们这个工程的原理图。其中主要包括51单片机芯片和流水灯模块,流水灯模块接在了单片机的P1口,200欧电阻是用来保护电路的。由原理图可以知道,我们可以看到LED的左边接了电源(高电平),在P1口给一个低电平即可点亮LED灯。相反,如果要LED灯熄灭,就要把P1口的电平变为高电平即可。要实现流水灯功能,我们只要将LED1~LED8依次点亮、熄灭,以此类推,8只LED变回一亮一暗的做流水灯了。

 大家可以打开Proteus新建一个名为LED的工程,然后照着我的硬件图进行连接,需要用到的元器如下图,大家可以在元件库(点击P按钮进入元件库,上一章讲过的)里面搜索。

2、 软件设计

硬件设计好了之后,我们就可以根据硬件连接来写代码了,也就是我们的软件设计环节。

首先我们要新建一个工程,打开Keil新建一个名为LED的工程,在下面的代码复制到main.c里。新建工程上一章详细讲过了,不知道怎么建工程的同学见第二章。我的代码将下面的代码复制到工程里,再进行初步编译,看看代码是否会报错。

#include <reg51.h> 
#include <intrins.h>
void delay(unsigned char i)
{
	unsigned char m,n;
	for(m=i;m>0;m--)
	for(n=200;n>0;n--);
}

void main()
{	unsigned char k;
	while(1)
	{
			P1=0xfe;
		 for(k=0;k<8;k++)
		{		
				delay(500);
				P1=_crol_(P1,1);		
		}	
	}	
}

我们可以看到,初步编译之后,编译窗口显示0错误0警告,说明我们的代码在语法上是正确的,软件设计部分就基本完成了,最后我们怎么把软件和硬件结合起来呢?

3、综合调试

在综合调试部分,我将教大家如何把代码烧录到硬件里,最后实现我们的流水灯效果。

首先我们必须知道一个概念,计算机是只认识0和1的,我们对电脑的所有操作和命令,最终都会变成很多0101010101001011010111,然后计算机就能看懂是什么意思,并作出反应,我们的单片机其实也是一台计算机,它也只认识0和1,但是我们刚刚软件设计写的代码是C语言写的,只有我们人能看懂,所以要怎么做才能把C语言转换为0和1的二进制语言呢,其实很简单,我们只需进行一个设置即可,跟我一起操作吧。

首先点击Keil主界面的这个魔法棒。

这个魔法棒很重要,里面有很多重要的设置,大家可以多摸索摸索,可以看到我们的2步骤是Create HEX File,翻译一下就是创建HEX文件,HEX文件其实就是机器代码,也就是计算机可以识别的文件了。

HEX文件:如何大家百度一下会发现HEX是十六进制的含义,那么刚刚不是说计算机只能识别二进制吗,为什么这里是十六进制。其实导入到单片机的是二进制文件,之所以要变为HEX文件,是因为HEX文件带校验,在传输、存储过程中有错误的话,容易提前发现,而二进制文件就不能,假如在存储中由于某一位或几位数受损,那么下载时照样按受损的文件导入到单片机。但最后烧录时HEX文件首先变成二进制数,再烧录进入单片机。

设置了之后我们再进行编译,这个时候就不需要全编译了,因为之前全编译过一次,现在进行部分编译即可,因为如果是很长的代码全编译一次很费时间,部分编译只会编译我们刚刚被修改过的设置和代码)

我们可以去流水灯工程的路径下找到这个HEX文件,用记事本打开给大家看看里面是什么。

这就是我们刚刚C语言的代码被转换成了计算机所能识别的文件了,虽然我们看不懂HEX文件的含义,但在计算机眼里,这就是让他做流水灯的指令。

下面我们来把这个文件放到单片机里面,也就是到了我们最后的环节了——烧录代码。首先打开Proteus,前面硬件部分已经连接好了。

进入编辑界面,我们在Program File里找到我们刚刚生成的hex文件

  现在我们的HEX文件已经烧录到单片机当中,我们只需要点击运行就可以看到仿真的现象了。

下面就是最后实现的流水灯效果(动态依次点亮),大家做出来了吗。

4、小结

在这个流水灯的实现教程中,我是以工程的形式展现出来的。原因在于我想让大家从入门开始就建立起工程的意识,从硬件设计再到软件设计,最后我们进行综合调试,把工程实现。包括在这章里面,我讲了很多细节的知识,比如全编译和部分编译的使用、HEX文件等,这都是在实际工程中经过自己的理解总结出来的,相信大家学习到这里,已经基本掌握了这两个软件的使用,对于刚入门51单片机,我们可以使用这两个软件做很多有意思的工程,下一章我会教大家如何如何用数码管显示自己的学号。

好的,我可以为你提供一段代码示例,实现51单片机的数码管流水灯效果。请注意,以下代码示例仅供参考,具体实现方式可能因硬件环境、编程语言等因素而有所不同。 ``` #include <reg52.h> // 定义各个数码管对应的引脚 sbit DIG1 = P2^2; sbit DIG2 = P2^3; sbit DIG3 = P2^4; sbit DIG4 = P2^5; // 定义数字0-9的各个段的状态 unsigned char digitSegments[] = {0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x98}; void delay(unsigned int ms) { // 延时函数,延时时间为ms毫秒 unsigned int i, j; for (i = 0; i < ms; i++) { for (j = 0; j < 1141; j++); } } void main() { unsigned char i, j; while (1) { for (i = 0; i < 10; i++) { // 显示当前数字 DIG1 = 1; DIG2 = 0; DIG3 = 0; DIG4 = 0; P0 = digitSegments[i]; delay(20); // 显示下一个数字 DIG1 = 0; DIG2 = 1; DIG3 = 0; DIG4 = 0; P0 = digitSegments[(i + 1) % 10]; delay(20); // 显示下下一个数字 DIG1 = 0; DIG2 = 0; DIG3 = 1; DIG4 = 0; P0 = digitSegments[(i + 2) % 10]; delay(20); // 显示下下下一个数字 DIG1 = 0; DIG2 = 0; DIG3 = 0; DIG4 = 1; P0 = digitSegments[(i + 3) % 10]; delay(20); } } } ``` 这段代码使用51单片机实现了数码管流水灯效果。在`main()`函数中,通过循环依次显示0-9的数字,并且每次显示3个数字,形成流水灯效果。在循环中,先显示当前数字,然后通过设置不同的数码管引脚,依次显示下一个数字、下下一个数字和下下下一个数字。每次显示完一个数字后,会等待一段时间,再显示下一个数字,循环往复,实现了数码管流水灯效果。在这段代码中,`delay()`函数用于延时,确保每个数字的显示时间一致。
评论 18
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值