用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)”,退出仿真调试状态。
四、程序固化
当程序通过了仿真调试,就可以利用编程器把它固化到单片机,并插入做好的线路板上,欣赏你的劳动成果了。