首页 > 编程知识 正文

五一单片机流水灯程序,8个流水灯c语言程序

时间:2023-05-03 12:26:18 阅读:45304 作者:4620

用c语言编写的单片机流水灯程序

一.硬件电路

电路由单片机控制,所以电路非常简洁。 电路图如下图所示,印刷电路板如下图所示。

电路的中心部分是AT89C2051单片机,如上所述,有Pl和P3两组I/O端口,但这里只有到Pl端口的8针。 图中的Cl、R9构成典型的上电复位(即接通电源时单片机复位)电路,XTAL、C2、C3和AT89C2051芯片内振荡电路构成时钟振荡器。 请注意,C2、C3的容量不要太大程度地偏离图中的数值。 否则,振动和振动可能会变得不稳定。 XTAL的频率可以在4-20MHz之间,但是当频率变化时,程序的执行速度发生变化,需要调整延迟子函数的参数。 实际上,可以不调整参数,但在这种情况下,延迟时间不再是1秒,其延迟时间随XTAL频率的降低而增加。

二.软件部分

该程序包含两个函数:主函数和延迟子函数。 源程序如下。 为了便于说明,对各行的程序进行了编号。

程序各行的作用如下。

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

01行:具有无符号整数参数k的Delay ) )声明延迟子函数,函数前面的void指示函数不返回函数值。

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

但是,请注意,在这里,与上一个程序类似,下面的行不是单独编写表示函数开头的“{”。 事实上,写c程序的时候,可以把多行写成一行。 c编译器只要遇到分号就认为是一行句子的结尾。

当然,我们不能因为c程序有这个特征就随便多行合作一行写。 实际写C程序的时候,还是要养成良好的程序写作习惯,按照约定写。

03行: for ) )声明循环。 该循环的初始条件为i=0,结束条件为i<; k,循环计数在每循环用手计数的变量I上加1。 因此,该循环的循环数为k次。 这样,只要改变k的值,即,改变Delay (延迟子函数的参数k的值,就可以容易地控制循环次数,获得不同的延迟时间。

04行:嵌套在03循环中的新for (声明循环。 此循环与上一个循环类似,循环次数为120次。 本循环与上一个循环嵌套后,总循环次数达到120k次。

第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行:在第01行声明的Delay ) )调用参数值为1000的延迟子函数,并执行该程序将延迟1000毫秒(即1秒)。

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

简而言之,第10-41行的作用是依次点亮8个发光二极管: LEDl-LED8。

42行: 09行结束标志,程序运行到此为止时,自动返回09行。 09行的for ) )循环是无条件循环,因此程序将立即移动到10行并继续运行。

三.软件模仿

首先,用前面的方法启动新项目,用前面的方法输入并保存上面的步骤。 然后用以下方法进行模拟调试。

1 .将编写的c方案添加到项目中

在左侧项目窗口中,双击Target1,展开Target1文件夹,右键单击SourceGroupl,然后选择“将文件添加到组”

2 .编制目标程序

请在编辑之前设置目标的输出属性。 否则,编辑的目标程序不包含用于固化为单片机的十六进制文件。

可以使用以下方法设置目标输出属性:

单击以选择工程窗口中的Target1,然后从“工程”菜单中选择“目标属性(OptionsfortargetTargetl )”,然后单击“系统”弹出窗口

设置

置好目标属性后,按“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)”,退出仿真调试状态。

四、程序固化

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

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。