《例说51单片机(C语言版)(第3版)》——1-6 实例演练

简介:

本节书摘来异步社区《例说51单片机(C语言版)(第3版)》一书中的第1章,第1.6节,作者:张义和,王敏男,许宏昌,余春长,更多章节内容可以访问云栖社区“异步社区”公众号查看

1-6 实例演练

例说51单片机(C语言版)(第3版)
单片机系统的设计中,软件与硬件息息相关,不同的电路设计,程序可能就不太一样。因此,在编写程序之前,必须确定电路的连接状态,例如,要利用89S51的P2来控制8个LED,让这8个LED分成两组(高4位与低4位)交替闪烁,其设计步骤如下。

图像说明文字首先把电路连接妥当,如图1-26所示。当P2的引脚输出低电压(0)时,其所连接的LED呈现正向偏压而发亮;若将引脚输出高电压(1)时,其所连接的LED不导通而不亮。因此,我们的程序设计就要让P2输出为“00001111”,以十六进制数字表示为“0f”,使左边4个LED亮,右边4个LED不亮;而在Keil C的程序里十六进制数字是以“0x”为前缀。所以,在程序里应表示为“0x0f”。隔一段时间后,再将输出反相(在Keil C里可利用“~”操作符),即左边4个LED不亮,右边4个LED亮,如此周而复始。

5e69fd5f251fa8f684e2a33661247db5b2e01a07

图像说明文字有了电路和思路后,随即将思路画成流程图,如图1-27所示,其中的延迟函数只是一个“0~x-1”的计数程序而已。

a24f7d53c65cd044e51a0b4866126d5a44b17412

图像说明文字除非是很简单的程序,否则,根据流程图来编写程序还是一个比较容易且保险的方法。程序如下。

/* ch01.c -   LED 高低电平交替闪烁程序 */
//==声明区===============================================
#include  <reg51.h>       // 定义 8051 寄存器的头文件
#define  LED   P2        // 定义 LED 接至 P2
void delay(int);         // 声明延迟函数
//==主程序===============================================
main()               // 主程序开始
{  LED=0x0f;          // 初值=0000 1111,状态为左边 4 个亮、右边 4 个灭(共阳)
   while(1)           // 无穷循环
   {   delay(10000);     // 调用延迟函数
       LED=~LED;      // LED 反相输出
   }                 // while 循环结束
}                    // 主程序结束
//==延迟函数===========================================
void delay(int x)         // 延迟函数开始,x=延迟次数
{  int i;             // 声明整型变量 i
   for(i=0;i<x;i++);      // 计数 x 次
}                     // 延迟函数结束

ch01.c
说明:

若使用本书所推荐的89S51在线刻录实验板,请将程序中的“#define  LED  P2”,改为“#define LED P1”。
图像说明文字紧接着单击图片 100按钮(以Windows XP为例),在随即弹出的“开始”菜单里选择“程序”→Keil uVision3选项,即可开启Keil C,如图1-28所示。当然,若桌面上有图片 101图标,则指向这个图标,双击鼠标左键一样可以进入Keil μVision 3环境。

6a35845b6f9c285e0f6098ee6ab1acc0f6f9dc98

图像说明文字首先打开一个项目,启动Project菜单下的New Project命令,屏幕出现如图1-29所示的对话框。

7b09bd4f98d4ad0f92df3d0ef44f35e5c58c05cf

图像说明文字在“文件名”栏中指定所要新增的项目名称(如ch01),再单击图片 106按钮,屏幕出现如图1-30所示的对话框。

5f87310e6ea253f19ebc1811230876c6222ca0bb

图像说明文字在Data base栏中选择所要使用的CPU芯片,例如Atmel半导体公司的AT89S51,再单击图片 109按钮关闭对话框,屏幕出现如图1-31所示的对话框。

29e2e1f02b90bc42665945f6be1bc2baa9df7699

图像说明文字这时系统询问我们要不要将8051汇编语言的启动代码放入我们所编辑的项目文件夹里,在此单击图片 112按钮关闭此对话框,则在左边将产生“Target 1”项目,如图1-32所示。

438e1afb24bd5706a1cdbbde8b9b493a1add91d7

图像说明文字单击按钮设置此芯片的选项,屏幕出现如图1-33所示的对话框。

39c2d6fa4dae4dee814f1a3a92fb079343d723a0

图像说明文字在这个对话框里设置此芯片的工作频率与所要输出的文件名。首先在Target选项卡的Xtal(MHz)栏中输入12,指定此芯片的工作频率为12MHz。然后切换到Output选项卡,如图1-34所示。

293375f4c32542ba2d9a8f2739868a64def39542

选择Create HEX File选项,如此才会产生十六进制文件,单击图片 120按钮关闭对话框即可完成设置。

单击左上方的图片 122按钮,编辑区里将打开一个全新的编辑窗口,再单击图片 123按钮,然后在随即出现的对话框里的文件名称栏中输入所要保存的文件名称(ch01.c),再单击图片 124按钮关闭对话框。

在编辑窗口中输入程序内容(即ch01.c),其中的缩排是单击制表键图片 126所产生的,不用按空格键产生。程序编辑完成后,在编辑窗口的左侧选择Target 1节点下面的Sourc Group 1项,单击鼠标右键,弹出快捷菜单,如图1-31所示。选择Add Files to Group Source Group 1项,然后在随即出现的对话框里指定刚才编辑的ch01.c文件,再单击图片 127按钮;最后,单击图片 128按钮关闭对话框,即可将 ch01.c文件加入Source Group 1。

4930223cf9f9e92d25f8c8fb0d1b3a0c342c9bb3

图像说明文字紧接着进行编译与连接,单击左上方的图片 131按钮即可进行编译与连接,而其过程将记录在下方的输出窗口中,如图1-36所示。

813f4d9ebc56a3abb9577cc75d2bd5607e7429e5

图像说明文字图中的“0 Error(s), 0 Warnning(s).”表示没有错误,因此就可继续进行调试/仿真。单击图片 134按钮打开调试工具栏,屏幕出现确认对话框,如图1-37所示。

图像说明文字单击图片 136按钮关闭对话框,即进入调试状态。若左下方没有出现监视窗口,可单击图片 137按钮打开,如图1-38所示。

6d245506d700697c24bd7078be18f1f9a61ff13f

图像说明文字单击监视窗口底部的Watch #1标签,切换到Watch #1页。再指向Name栏里的项,单击鼠标左键,再单击快捷键图片 141即可输入所要监视的信号名称,在此要跟踪P2,所以输出P2,如图1-39所示。

08618e4badbe301f13a22c4757befc8808a329b2

图像说明文字选择View菜单下的Periodic Window Update命令(若已打勾就不用再选择),让窗口随程序运行而变动。再单击图片 144按钮即开始执行程序,监视窗口中,P2的值也在0x0F与0xF0之间交替变化。表示连接在P2的LED将分为高4位与低4位交替闪烁。若要停止程序的进行,可单击图片 145按钮。

图像说明文字如果监视窗口还不能满足要求的话,可打开Peripherals菜单中的I/O-Ports命令,再选择P2选项,即可打开P2窗口,如图1-40所示。

8485db6dc9f4176627b99b3955838ebfa03df42e

图像说明文字若要继续运行程序,可单击图片 149按钮,则监视窗口与P2窗口的内容都将随程序的进行而变化。若想从头开始,则单击图片 150按钮停止程序,单击图片 151按钮复位CPU,再单击图片 152按钮。若要关闭此专案,则先单击图片 153按钮离开调试状态,再启动Project菜单下的Close Project命令。最后,启动File菜单下的Exit命令,即可关闭Keil C程序。

图像说明文字在本项目所存储的文件夹里可找到ch01.hex文件,这个文件就是可执行文件,使用ICE加载此文件即可进行在线仿真,至于在线仿真的操作,可参阅附录。

相关文章
|
5月前
|
存储 数据处理 C语言
C语言高级应用探讨与实例
C语言高级应用探讨与实例
49 1
|
7天前
|
C语言
【总结】单片机重点知识总结记录之C语言条件编译(五)
【总结】单片机重点知识总结记录之C语言条件编译(五)
|
5月前
|
C语言
C语言循环结构程序设计详解及代码实例
C语言循环结构程序设计详解及代码实例
100 0
|
5月前
|
存储 C语言 索引
C语言一维数组与二维数组详解及代码实例
C语言一维数组与二维数组详解及代码实例
53 0
|
5月前
|
程序员 C语言
使用指针变量作为函数参数的C语言程序实例
使用指针变量作为函数参数的C语言程序实例
61 0
|
5月前
|
存储 C语言 索引
C语言字符数组深入解析与应用实例
C语言字符数组深入解析与应用实例
65 0
|
10天前
|
C语言 C++
C语言 之 内存函数
C语言 之 内存函数
23 3
|
4天前
|
存储 编译器 C语言
C语言函数的定义与函数的声明的区别
C语言中,函数的定义包含函数的实现,即具体执行的代码块;而函数的声明仅描述函数的名称、返回类型和参数列表,用于告知编译器函数的存在,但不包含实现细节。声明通常放在头文件中,定义则在源文件中。
|
10天前
|
C语言
c语言回顾-函数递归(上)
c语言回顾-函数递归(上)
27 2