电子发烧友网 > 控制/MCU > 正文

如何用用C语言编写的单片机来控制流水灯

2018年11月22日 16:01 次阅读

用C语言编写的单片机流水灯程序的软件和硬件,可以让八个LED轮流点亮,每个灯点亮和熄灭时间均为1秒。是利用单片机I/O口控制外部设备的简单例子。当然,在你掌握了本程序后,完全可以充分发挥你的想象,改变一下程序内容和灯的接法(比如用光耦驱动继电器来控制霓虹灯),做出各种变化非凡的大型灯光广告牌。

一、硬件电路

因为电路用单片机控制,所以电路非常简洁。其电路原理图见下图,印制板图如下图所示。

如何用用C语言编写的单片机来控制流水灯

如何用用C语言编写的单片机来控制流水灯

电路的核心部分是AT89C2051单片机,前面提到它有Pl和P3两组I/O口,我们这里只用到Pl口,共8个引脚。图中Cl、R9组成典型的上电复位(即在加电时单片机复位)电路,XTAL、C2、C3与AT89C2051片内振荡电路组成时钟振荡器。值得注意的是,C2、C3的容量不能与图中数值偏差太大,否则可能引起不起振或振荡不稳定。XTAL的频率可以在4-20MHz之间,不过,频率的变化会导致程序运行速度的变化,这样就需要调整延时子函数的参数。事实上,不调整参数亦可,只是此时延迟时间不再是1秒,其延迟时间会随着XTAL频率的降低而增加。

二、软件部分

本程序包含两个函数,一个是主函数,另一个是延时子函数。源程序如下(为了便于讲解,我们为每行程序加上了编号):

如何用用C语言编写的单片机来控制流水灯

程序各行作用如下:

00行:把AT89C2051的头文件“AT89x051.H”包含进来。

01行:声明Delay()延时子函数,该函数有一个无符号整型参数k,同时函数前面的void表明函数不返回函数值。

02行:延时子函数的开始,同时声明两个无符号整型变量i和j。

不过请注意,这里没有象上期的程序一样,把表示函数开始的“{”单独成行,而是把下一行写在一起了。事实上,写C程序的时候,可以把多行写作一行,C编译器只要遇到分号就认为是一行语句的结束。

当然,我们不能因为C程序有这个特点,就随意把多行合作一行书写,实际书写C程序的时候,还是要养成良好的程序书写习惯,按照约定俗成的原则来书写。

03行:声明for()循环。这个循环的初始条件是i=0,终止条件是i<k,循环计数是每循环一次,用手计数的变量i加1。因此,这个循环的循环次数就是k次。这样,只要改变k的值(即改变Delay()延时子函数的参数k的值),就可以很容易地控制循环次数,从而获得不同的延时时间。

04行:声明嵌套在03循环中的一个新的for()循环,这个循环与上一个循环相似,其循环次数是120次。本循环与上一个循环嵌套后,使得总的循环次数达120×k次。

05行:第一个分号,表示L条空语句,占用一个机器时间,以实现延时的目的。后面的两个“}”中,第一个“}”是04行for()循环的结束标志,程序遇到它时,将自动返回04行,使用于循环计数的变量j加1,同时判断j是否小于120,如果否,则转入05行;第二个是03行for()循环的结束标志,程序遇到它则会返回03行。

06行:Delay()延时子函数的结束标志。

07行:声明主函数main()。这里的主函数不需要参数,也不返回函数值。

08行:主函数的开始标志“{”。

与01行的Delay()延时子函数一样,习惯上也会把下一行的语句与本行的花括号写在一起。

09行:声明一个无条件for()循环,“;;”以使单片机重复执行任务,使流水灯能不停地流动。

10行:大括号表示09行for()循环的开始,语句“Pl_0=0”是让单片机Pl口的O号引脚(即Pl.0)输出低电平,根据电路可知,此时LED1会被点亮。

11行:以参数值1000调用01行声明的Delay()延时子函数,使程序运行到此处时,延时1000毫秒(即1秒)。

12-41行:与10、11行的作用相同。

简而言之,10-41行的作用就是依次点亮LEDl-LED8这八个发光二极管

42行:09行结束标志,程序运行到此处时,自动返回09行,因为09行的for()循环是无条件循环,所以程序马上会转到10行继续运行。

三、软件仿

真首先按照前面的方法建立一个新的工程,并把上面的程序按照前面的方法输入并存盘。然后按照下面的方法进行仿真调试。

1.把建立好的C程序加入工程

双击左边工程窗口中的“Target1”,展开“Target1”夹,然后右击“SourceGroupl”,选择“增加文件到组‘SourceGroup1’(AddFilestoSourceGroup1)”,并把刚才输入的C程序加入到工程中。

2.连编目标程序

连编之前要设置目标的输出属性,否则连编出来的目标程序中不含有用于固化到单片机中的十六进制文件。

设置目标输出属性的方法是:

先单击工程窗口中的“Target1”以选中它,然后选择“工程”菜单中的“目标‘Targetl’属性(OptionsfortargetTargetl)”,系统弹出对话框,在对话框中选择“输出(Output)”选项卡,并选中“生成HEX文件(CreateHEXFile)”选项(生成十六进制文件),当然,如果你的单片机编程器不支持十六进制文件的话,就要用转换软件把生成的十六进制文件转换成二进制了。

设置好目标属性后,按“F7”开始连编目标程序。连编的结果信息会在输出窗口中显示出来,若显示“0错误(s),0警告(s)(0Error(s),0Warning(s))”表示连编成功,否则说明连编不成功。若连编不成功,在输出窗口中会显示错误所在行及错误原因,然后根据具体的错误进行修改,修改完成后,再次连编,直到连编成功。

3.仿真调试

连编好目标程序后就可以开始仿真调试了,其步骤是:

1)选择“调试(Debug)”菜单中的“开始/停止调试(Start/StopDebugSession)”,进入仿真调试状态。

2)选择“外围设备(Peripherals)”菜单中的“I/OPorts“选项中的“Port1”,打开I/O口状态模拟器。状态模拟器中的“&raDIC;”表示相应的I/O口引脚状态为“1”电平状态。

如:图中表示Pl口(Portl)的8个引脚全为“1”电平状态。

3)按“Fll”进行单步跟踪调试。每按一次“Fll”,程序会执行一步(即一条语句),若程序的执行影响了I/O口的状态,在I/O口状态模拟器上会有相应的显示。因为每按Fll一次,程序只执行一步,所以在调试循环程序时,可能会有很多的步数,如本例中每调试一次Delay()子函数中的两个循环,其步数高达六万步,因此要设法减少步数,本例中可先将Delay()子函数的参数值由1000改为1,等调试成功后再改回1000,这样就可以大大减少循环步数。

4)再次选择“调试(Debug)”菜单中的“开始/停止调试(Start/StopDebugSession)”,退出仿真调试状态。

四、程序固化

当程序通过了仿真调试,就可以利用编程器把它固化到单片机,并插入做好的线路板上,欣赏你的劳动成果了。

技术专区

下载发烧友APP

打造属于您的人脉电子圈

关注电子发烧友微信

有趣有料的资讯及技术干货

关注发烧友课堂

锁定最新课程活动及技术直播
收藏 人收藏
分享:

评论

相关推荐

单片机对28BYJ-48步进电机的控制设计

如果要使用电机的话,需要把4个跳线帽都调到跳线组的左侧(开发板上的实际位置),即左侧针和中间针连通(...

发表于 2018-11-22 15:46 5次阅读
单片机对28BYJ-48步进电机的控制设计

单片机多机通信的设计

写寄存器的时候,如果我们要把01写到一个地址是0000的寄存器地址里,点一下“写入”,就会出现发送指...

发表于 2018-11-22 15:20 12次阅读
单片机多机通信的设计

基于C51单片机的MP3播放器设计与实现

发表于 2018-11-22 11:17 27次阅读
基于C51单片机的MP3播放器设计与实现

一文了解磁电编码器的工作原理及适用领域

磁编码器是一种新型的角度或者位移测量装置,其原理是采用磁阻或元件对变化的磁性材料的角度或者位移值进行...

发表于 2018-11-22 10:35 20次阅读
一文了解磁电编码器的工作原理及适用领域

为什么单片机不能直接驱动继电器和电磁阀?

比如我这个继电器线圈的电阻,大概是71.7欧姆,加5V电压的话,电流就是5除以71.7约等于0.07...

发表于 2018-11-22 10:33 99次阅读
为什么单片机不能直接驱动继电器和电磁阀?

超声波测距请问谁有可行方案吗

发表于 2018-11-22 09:37 15次阅读
超声波测距请问谁有可行方案吗

单片机复位的问题

发表于 2018-11-21 20:14 91次阅读
单片机复位的问题

51单片机入门教程之从原理到汇编

发表于 2018-11-21 17:46 295次阅读
51单片机入门教程之从原理到汇编

便携式封口机单片机芯片方案—深圳单片机开发方案公司

发表于 2018-11-21 17:21 21次阅读
便携式封口机单片机芯片方案—深圳单片机开发方案公司

两个单片机相互传输数据该如何接收数据?

发表于 2018-11-21 16:41 137次阅读
两个单片机相互传输数据该如何接收数据?

单片机C语言双向通信程序设计

甲机向乙机发送控制命令字符,甲机同时接收乙机发送的数字,并显示在数码管上。

发表于 2018-11-21 16:33 135次阅读
单片机C语言双向通信程序设计

51单片机逐渐的被淘汰了,大家都去学32了

发表于 2018-11-21 16:33 368次阅读
51单片机逐渐的被淘汰了,大家都去学32了

学习STM32单片机,从菜鸟到牛人就是这样简单 (2)

发表于 2018-11-21 16:30 250次阅读
学习STM32单片机,从菜鸟到牛人就是这样简单 (2)

单片机与ARM谁更实用

一般在8位单片机与ARM方面的嵌入式系统是有层次上的差别,ARM适用于系统复杂度较大的高级产品,如P...

发表于 2018-11-21 15:33 67次阅读
单片机与ARM谁更实用

如何破解单片机解密芯片

单片机加解密可划分为两大类,一类是硬件加解密,一类是软件加解密。硬件加密,对于单片机来说,一般是单片...

发表于 2018-11-21 15:06 72次阅读
如何破解单片机解密芯片

请问如何用PCF8591和51单片机实现测量0~5V的数字电压表,数码管显示?

发表于 2018-11-21 13:37 69次阅读
请问如何用PCF8591和51单片机实现测量0~5V的数字电压表,数码管显示?

C语言编程基础和C语言经典书籍

发表于 2018-11-21 11:21 69次阅读
C语言编程基础和C语言经典书籍

基于PIC12C508单片机对灯光系统的控制

以下程序使用PIC12C508 单片机 ,内部4MHz时钟,4脚输入50HZ脉冲信号,7,6,3脚(...

发表于 2018-11-20 15:37 47次阅读
基于PIC12C508单片机对灯光系统的控制

如何使用SAM4E单片机点亮LCD并显示出文字

在Atmel Studio 6中,集成了Atmel Software Framework(ASF框架...

发表于 2018-11-20 15:20 49次阅读
如何使用SAM4E单片机点亮LCD并显示出文字

单片机的空闲和掉电模式的应用

单片机进入空闲模式的时候,除了cpu处于休眠状态外,其余的硬件全部处于活动状态,芯片中未涉及的数据存...

发表于 2018-11-20 15:00 56次阅读
单片机的空闲和掉电模式的应用

单片机中的拉电流和灌电流是什么意思

单片机的拉电流和灌电流都是对单片机的输出而言的,是单片机驱动能力的具体体现。

发表于 2018-11-19 16:22 77次阅读
单片机中的拉电流和灌电流是什么意思

STM32F4的FPU性能的设置及要点

浮点运算一直是定点CPU的难题,比如一个简单的1.1+1.1,定点CPU必须要按照IEEE-754标...

发表于 2018-11-19 15:47 74次阅读
STM32F4的FPU性能的设置及要点

PIC16C5X系列单片机的四种振荡方式解析

PIC16C5X系列可以使用4种类型振荡方式:标准晶体/陶瓷振荡XT、高速晶体振荡HS(4MHz以上...

发表于 2018-11-19 15:43 32次阅读
PIC16C5X系列单片机的四种振荡方式解析

单片机调试有那些常见问题如何解决

error: #18: 6.error: #18: expected a ")" 如果是出现在c...

发表于 2018-11-17 11:50 502次阅读
单片机调试有那些常见问题如何解决

浅谈智能仪表未来发展趋势

智能仪表是以微型计算机(单片机)为主体,将计算机技术和检测技术有机结合,组成新一代“智能化仪表”。微...

发表于 2018-11-16 15:04 60次阅读
浅谈智能仪表未来发展趋势

从微观角度来看Linux内核设计

这就是究极形态了,我们添加了第四行的代码,来看&_min1,它的意思是取_min1的地址,而&_mi...

发表于 2018-11-15 16:29 227次阅读
从微观角度来看Linux内核设计

浅析单片机数码管的8个段显示效果

数码管的 8 个段,我们直接当成 8 个 LED 小灯来控制,那就是 a、b、c、d、e、f、g、d...

发表于 2018-11-15 16:21 194次阅读
浅析单片机数码管的8个段显示效果

基于ARM异常中断处理的方法解析

1. 在汇编中保存现场,然后调用C语言编写的中断处理程序,任务处理完成之后,再返回到汇编中恢复现场,...

发表于 2018-11-15 16:17 69次阅读
基于ARM异常中断处理的方法解析

浅析C语言在嵌入式开发中的应用

般将硬件初始化的工作交给汇编,比较复杂的操作交给C语言。

发表于 2018-11-15 15:20 198次阅读
浅析C语言在嵌入式开发中的应用

C语言为什么能够恒久不衰,来看看吧!

C++是由C语言发展而来的,与C兼容。用C语言写的程序基本上可以不加修改地用于C++。从C++的名字...

发表于 2018-11-15 12:58 258次阅读
C语言为什么能够恒久不衰,来看看吧!

深度解析单片机复位电路

射频干扰,它是以空间电磁场的形式传递 在机器内部的导体(引线或零件引脚)感生出相应的干扰,可通过电磁...

发表于 2018-11-15 11:32 290次阅读
深度解析单片机复位电路

PIC12F675单片机用于热释红外传感器中的应...

现在用于检测人员进出的探测器主要采用热释红外传感器。人体能够发射10μm左右的红外线,热释红外传感器...

发表于 2018-11-14 16:38 83次阅读
PIC12F675单片机用于热释红外传感器中的应...

探讨STC单片机烧写时出现的情况

MAX232转换板出口接三条线到STC单片机RXD,TXD和GND,单片机未通电,但这时RXD上有电...

发表于 2018-11-14 16:34 187次阅读
探讨STC单片机烧写时出现的情况

单片机最小系统的组成及其原理解析

单片机最小系统主要由电源、复位、振荡电路以及扩展部分等部分组成。

发表于 2018-11-14 16:06 146次阅读
单片机最小系统的组成及其原理解析

嵌入式开发为什么选择C语言

面向过程就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候一个一个依次调用...

发表于 2018-11-13 15:53 247次阅读
嵌入式开发为什么选择C语言

如何用C语言实现自己的PIC16 serial ...

Serial bootloader是一种非常方便使用并且低成本的程序烧写的方法。一般情况,每次烧写M...

发表于 2018-11-12 16:03 90次阅读
如何用C语言实现自己的PIC16 serial ...

单片机采用串行方式对LCD12864的驱动

#i nclude #i nclude sbit SCLK =P1^3 //E s...

发表于 2018-11-12 15:19 98次阅读
单片机采用串行方式对LCD12864的驱动

如何测试单片机的数据类型字节数

i = sizeof(char);//char是一字节的变量 if(i == 1) { ...

发表于 2018-11-12 15:13 85次阅读
如何测试单片机的数据类型字节数

递归指的是在函数的定义中使用函数自身的方法

C语言支持递归,即一个函数可以调用其自身。但在使用递归时,程序员需要注意定义一个从函数退出的条件,...

发表于 2018-11-12 15:06 178次阅读
递归指的是在函数的定义中使用函数自身的方法

强制类型转换是把变量从一种类型转换为另一种数据类...

类型转换可以是隐式的,由编译器自动执行,也可以是显式的,通过使用强制类型转换运算符来指定。在编程时...

发表于 2018-11-12 14:59 160次阅读
强制类型转换是把变量从一种类型转换为另一种数据类...

C语言中程序员编写的头文件和编译器自带的头文件

#include 指令会指示 C 预处理器浏览指定的文件作为输入。预处理器的输出包含了已经生成...

发表于 2018-11-12 14:55 242次阅读
C语言中程序员编写的头文件和编译器自带的头文件

C语言中一个简单的实例,检查命令行是否有提供参数

多个命令行参数之间用空格分隔,但是如果参数本身带有空格,那么传递参数的时候应把参数放置在双引号 ""...

发表于 2018-11-12 14:49 129次阅读
C语言中一个简单的实例,检查命令行是否有提供参数

C语言中的动态内存管理

但是,如果您预先不知道需要存储的文本长度,例如您向存储有关一个主题的详细描述。在这里,我们需要定义一...

发表于 2018-11-12 14:46 131次阅读
C语言中的动态内存管理

Verilog和VHDL之间如何互转

当然阶段四纯属个人的对未来的推测,但是,近年来,FPGA也高速发展,明显有当年汇编语言开发到C高...

发表于 2018-11-12 14:23 177次阅读
Verilog和VHDL之间如何互转

单片机中断源情况大汇总 嵌入式时代已经到来

嵌入式时代已经来了,不要纠结要不要踏入嵌入式的领域了,

发表于 2018-11-12 10:44 245次阅读
单片机中断源情况大汇总 嵌入式时代已经到来

如何在C语言中使用随机数

通常情况下,使用最多的方法的就是使用rand函数随机生成伪随机数来完成随机数的生成工作。注意这里的伪...

发表于 2018-11-09 16:46 213次阅读
如何在C语言中使用随机数

如何提高单片机系统的可靠性

提高单片机系统可靠性的方法与措施很多。一般地,应根据系统所面临的具体的可靠性问题,针对引起或影响系统...

发表于 2018-11-09 15:20 111次阅读
如何提高单片机系统的可靠性

单片机中如何实现多线程

整个项目需要控制16台步进电机,21个电磁阀,3个泵,1个直流电机,系统要求全部执行时间为6秒钟,系...

发表于 2018-11-08 16:21 174次阅读
单片机中如何实现多线程

C语言中提供了许多内置的输入输出函数

stdio.h 是一个头文件 (标准输入输出头文件) and #include 是一个预处理命令,用...

发表于 2018-11-08 14:44 183次阅读
C语言中提供了许多内置的输入输出函数

C程序员如何创建、打开、关闭文本文件或二进制文件

如果这个函数在读取最后一个字符之前就遇到一个换行符 '\n' 或文件的末尾 EOF,则只会返回读取到...

发表于 2018-11-08 14:38 175次阅读
C程序员如何创建、打开、关闭文本文件或二进制文件

STM32F103试用体验:水共震准备材料中的过...

我这次要做的东东是一个水共震系统,说明:水共震系统是指在一个水盆里,有一个执行单元,通过电机和皮带,...

发表于 2018-11-08 10:38 294次阅读
STM32F103试用体验:水共震准备材料中的过...

一文了解逻辑分析仪当中的高级参数

对于快速高效的调试,选择逻辑分析仪解决方案时,需要重点评估仪器各方面参数,逻辑分析仪在数字电路的前期...

发表于 2018-11-08 09:07 63次阅读
一文了解逻辑分析仪当中的高级参数

比较逻辑分析仪与示波器之间的区别

目前电路的发展从抽象类似向着数字化发展,因此这些测量仪器的开发也正在朝着这种条件方法迈进。 现在,在...

发表于 2018-11-08 08:55 109次阅读
比较逻辑分析仪与示波器之间的区别

浅析C语言中typedef关键字的作用

C 语言提供了 typedef 关键字,您可以使用它来为类型取一个新的名字。

发表于 2018-11-08 08:42 216次阅读
浅析C语言中typedef关键字的作用

C语言结构体之位域位段

所谓"位域"是把一个字节中的二进位划分为几个不同的区域,并说明每个区域的位数。每个域有一个域名,允许...

发表于 2018-11-08 08:38 178次阅读
C语言结构体之位域位段

C语言基础语法之结构体

C语言中数组允许定义可存储相同类型数据项的变量,结构是 C 编程中另一种用户自定义的可用的数据类型。

发表于 2018-11-08 08:35 181次阅读
C语言基础语法之结构体

C语言程序运行流程包含哪些环节

C语言并不能直接被计算机所理解,需要将C语言转变成可执行代码,即二进制代码。在C语言转变成二进制可执...

发表于 2018-11-07 15:05 68次阅读
C语言程序运行流程包含哪些环节

浅析单片机、ARM、FPGA 、嵌入式的特点

自带廉价的程序存储器(FLASH)和非易失的数据存储器(EEPROM)。这些存储器可多次电擦写,使程...

发表于 2018-11-07 09:54 487次阅读
浅析单片机、ARM、FPGA 、嵌入式的特点

嵌入式开发之C语言的指针

学习 C 语言的指针既简单又有趣。通过指针,可以简化一些 C 编程任务的执行。

发表于 2018-11-06 17:09 238次阅读
嵌入式开发之C语言的指针

如何系统地入门学习stm32?老司机筒子们有自己...

arm 官方也开始推这种通用库了。而此时st发现一剑走天涯的方法的确有很多弊端,开始了stmcube...

发表于 2018-11-06 17:07 566次阅读
如何系统地入门学习stm32?老司机筒子们有自己...

单片机无线传输系统的设计及nRF905无线收发模...

nRF905片内集成了电源管理、晶体振荡器、低噪声放大器、频率合成器、功率放大器等模块,曼彻斯特编码...

发表于 2018-11-06 16:00 93次阅读
单片机无线传输系统的设计及nRF905无线收发模...

五花八门的关于单片机的开发经验

AT89C51我认为是一个非常标准的51单片机了,4个P口,1个串口,RAM只有标准的128Byte...

发表于 2018-11-06 15:58 418次阅读
五花八门的关于单片机的开发经验

浅析单片机中断处理过程

中断处理过程可分为中断响应、中断处理和中断返回三个阶段。

发表于 2018-11-06 14:31 246次阅读
浅析单片机中断处理过程

如何使用可编程斜坡发生器外设创建参考信号和时序源

可编程斜坡发生器(PRG)(在Microchip最近推出的几款8位PIC 单片机上提供)是一种高度灵...

发表于 2018-11-06 09:15 190次阅读
如何使用可编程斜坡发生器外设创建参考信号和时序源

单片机中的定时计数器的四种工作方式解析

在单片机中有两个特殊功能寄存器与定时/计数有关,这就是TMOD和TCON。,TMOD和TCON是名称...

发表于 2018-11-05 16:11 154次阅读
单片机中的定时计数器的四种工作方式解析

借助Vivado来学习FPGA的各种配置模式

单片机是基于FLASH结构的,所以单片机上电直接从本地FLASH中运行。但SRAM 架构的FPGA是...

发表于 2018-11-05 15:12 399次阅读
借助Vivado来学习FPGA的各种配置模式

单片机IO口另外三种状态

标准 51 单片机的P0 口默认就是开漏输出,如果要用的时候外部需要加上拉电阻。而强推挽输出就是有比...

发表于 2018-11-05 11:40 570次阅读
单片机IO口另外三种状态

上拉电阻应用很多,都可以起到什么作用呢?

加大普通 IO 口的驱动能力。标准 51 单片机的内部 IO 口的上拉电阻,一般都是在几十 K 欧,...

发表于 2018-11-05 11:35 473次阅读
上拉电阻应用很多,都可以起到什么作用呢?

为何不在单片机上实现PLC的逻辑呢?

内存规划,包括堆栈区的设置,定时器,计数器的累加值和预设值地址等等,目前初步定义8个计数器的当前计数...

发表于 2018-11-05 11:31 519次阅读
为何不在单片机上实现PLC的逻辑呢?

开发单片机时需掌握的四个基本技巧

在单片机应用开发中,代码的使用效率问题、单片机抗干扰性和可靠性等问题仍困扰着。现归纳出单片机开发中应...

发表于 2018-11-05 11:21 389次阅读
开发单片机时需掌握的四个基本技巧