keilc教程,以及程序例子
写出keilc软件的使用流程
写出Keil C软件的使用流程简介Keil C是一款嵌入式开发工具,用于编写和调试嵌入式C语言代码。
本文将介绍Keil C软件的使用流程,包括安装、项目创建、编写代码和调试等方面的内容。
安装Keil C1.下载安装包:从Keil官方网站下载Keil C的安装包。
2.运行安装程序:双击安装包,按照提示完成安装过程。
3.激活许可证:根据Keil官方提供的步骤激活软件的许可证。
创建项目1.打开Keil C:双击桌面上的Keil C图标,打开软件。
2.新建项目:点击工具栏上的“Project”菜单,选择“New Project”。
3.选择目标设备:在弹出的对话框中选择适合的目标设备,点击“OK”。
4.配置项目选项:根据需要配置项目选项,例如输出文件夹、连接器设置等。
5.添加源文件:右键点击“Source Group”,选择“Add New Item”,添加需要编译的源文件。
编写代码1.打开源文件:在Keil C的项目视图中找到需要编辑的源文件,双击打开。
2.编写代码:使用Keil C集成的代码编辑器编写C语言代码。
3.保存代码:按下“Ctrl + S”快捷键保存代码。
编译代码1.点击工具栏上的“Build”按钮,或者按下“F7”键,编译代码。
2.查看编译结果:在编译输出窗口中查看编译过程中的输出信息和错误提示。
调试代码1.连接目标设备:将开发板通过调试器与计算机连接。
2.设置调试选项:点击工具栏上的“Debug”按钮,选择“Options forTarget”。
3.配置调试器:根据目标设备的类型选择合适的调试接口,点击“OK”。
4.启动调试会话:点击工具栏上的“Start/Stop Debugging”按钮或按下“Ctrl + F5”快捷键,开始调试会话。
5.设置断点:在代码中选择需要设置断点的行,右键点击选择“ToggleBreakpoint”。
6.运行代码:按下“F5”键,或点击工具栏上的“Go”按钮,启动代码的执行。
keilC中嵌入汇编程序的方法
keilC中嵌入汇编程序的方法1. C语言中直接嵌入汇编程序段1、在 C 文件中要嵌入汇编代码片以如下方式加入汇编代码:#pragma ASM; Assembler Code Here#pragma ENDASM2、在Project 窗口中包含汇编代码的C 文件上右键,选择“Options for ...”,点击右边的“Generate Assembler SRC File”和“Assemble SRC File”,使检查框由灰色变成黑色(有效)状态;3、根据选择的编译模式,把相应的库文件(如Small 模式时,是Keil\C51\Lib\C51S.Lib)加入工程中, 该文件必须作为工程的最后文件;4、这点也是本人要重要说明的!即一定要将c:\keil\C51下的STARTUP.A51文件加入项目4、编译,即可生成目标代码。
来个实例吧:#i ncludevoid main(void){P2=1;#pragma asmMOV R7,#10DEL:MOV R6,#20DJNZ R6,$DJNZ R7,DEL#pragma endasmP2=0;}2 . 无参数传递的函数调用C51调用汇编函数1.无参数传递的函数调用先来个例子:其中example.c和example.a51为项目中的两个文件***********************example.c***************************** ******************extern void delay100();main(){delay100;}***********************example.a51*************************** ********************PR?DELAY100 SEGMENT CODE; // 在程序存储区中定义段PUBLIC DELAY100; //声明函数RSEG ?PR?DELAY100; //函数可被连接器放置在任何地方DELAY100:MOV R7,#10DEL:MOV R6,#20DJNZ R6,$DJNZ R7,DELRETEND在example.c文件中,先声明外部函数,然后直接在main中调用即可。
keil软件的使用方法
Keil 软件的使用随着单片机开发技术的不断发展,目前已有越来越多的人从普遍使用汇编语言到逐渐使用高级语言开发,其中主要是以C 语言为主,市场上几种常见的单片机均有其C 语言开发环境。
这里以最为流行的80C51单片机为例来学习单片机的C 语言编程技术。
大家都有C 语言基础,但是编单片机程序,大家还得找专门的书来学习一下。
这里我们只介绍Keil 这种工具软件的用法。
学习一种编程语言,最重要的是建立一个练习环境,边学边练才能学好。
Keil 软件是目最流行开发80C51系列单片机的软件,Keil 提供了包括C 编译器、宏汇编、连接器、库管理和一个功能强大的仿真调试器等在内的完整开发方案,通过一个集成开发环境(µVision )将这些部份组合在一起。
下面我以一个实验举一个例子,一步一步学习Keil 软件的使用。
首先我们看硬件原理图:很明显,要点亮使发光二极管,必须使单片机的I/O 口P1.0输出低电平。
于是我们的任务就是编程序使P1.0输出地电平。
1. 使用Keil 前必须先安装。
安装过程简单,这里不在叙述。
2. 安装好了Keil 软件以后,我们打开它。
打开以后界面如下:3.我们先新建一个工程文件,点击“Project->New Project…”菜单,如下图,:3.选择工程文件要存放的路径,输入工程文件名LED, 最后单击保存.4.在弹出的对话框中选择CPU 厂商及型号5. 选择好Atmel 公司的AT89S52 后, 单击确定1.在接着出现的对话框中选择“是”。
5.新建一个C51 文件, 单击左上角的New File 如下图所示:6.保存新建的文件,单击SA VE如下图:2.在出现的对话框中输入保存文件名MAIN.C(注意后缀名必须为.C),再单击“保存”,如下图;7.保存好后把此文件加入到工程中方法如下: 用鼠标在Source Group1 上单击右键, 然后再单击Add Files to Group …Source Group 1'如下图:8.选择要加入的文件 , 找到 MAIN.C 后 , 单击 Add, 然后单击 Close9.在编辑框里输入如下代码 :10.到此我们完成了工程项目的建立以及文件加入工程 , 现在我们开始编译工程如下图所示 : 我们先单击编译, 如果在错误与警告处看到 0 Error(s) 表示编译通过;11.生成 .hex 烧写文件,先单击Options for Target,如图;12.在下图中,我们单击 Output, 选中 Create HEX F。
Keil C51例子:Hello.c(第六章)
Hello位于\C51\excmples\Hello\目录,其功能是向串口输出“Hello,world”整个程序如下:#pragma DB OE CD#indule <reg51.h>#include<stdio.h>void main(void){SCOn=0x50;TMOD=0x20TH1=0xf3;Tri=1;TI=1;printf(“Hello,world \n”);while(1) { }}第一节uVision for Windows的使用步骤(1) file_new新建一个hello.c文件,输入如上内容或直接用目录下源文件。
(2) file_save或工具栏将文件存盘。
(3) project_new project创建一个project名为hello,并在其中加入hello.c。
这时该project已是打开状态,或用open project打开已存在的project。
(4) option_C51 compiler中选出至少包括两项DB OE。
(5) option_dscope Debugger选中hello\DS51.INI查看DS51.INI看其是否为:“load…\…\BIN\8051.DLLmap 0, 0xffff”否则修改。
(6) 在option_make选make文件顺序。
(7) project选Build project,看是否有语法错误,若无则生成HEX文件,若有则修改源文件后重复以上部分步骤。
(8) run_dScope debugger进入dScope51后装入hello则可用go直接运行看serial窗口有无输出,正常每系统运行一次,serial窗口均出现一个“Hello,world”表明运行无误。
第二节Ishell for Dos使用步骤(1) 进入Ishell 用Setup editer选择编辑器。
然后单击Edit或用Edit命令编辑hello.c源文件,存盘,也可以在files窗口中直接选中hello.c。
Keil实例教程
Keil 工程文件的建立、设置与目标文件的获得单片机开发中除必要的硬件外,同样离不开软件,我们写的汇编语言源程序要变为CPU 可以执行的机器码有两种方法,一种是手工汇编,另一种是机器汇编,目前已极少使用手工汇编的方法了。
机器汇编是通过汇编软件将源程序变为机器码,用于MCS-51单片机的汇编软件有早期的A51,随着单片机开发技术的不断发展,从普遍使用汇编语言到逐渐使用高级语言开发,单片机的开发软件也在不断发展,Keil软件是目前最流行开发MCS-51系列单片机的软件,这从近年来各仿真机厂商纷纷宣布全面支持Keil即可看出。
Keil提供了包括C 编译器、宏汇编、连接器、库管理和一个功能强大的仿真调试器等在内的完整开发方案,通过一个集成开发环境(uVision)将这些部份组合在一起。
运行Keil软件需要Pentium或以上的CPU,16MB或更多RAM、20M以上空闲的硬盘空间、WIN98、NT、WIN2000、WINXP 等操作系统。
掌握这一软件的使用对于使用51系列单片机的爱好者来说是十分必要的,如果你使用C语言编程,那么Keil几乎就是你的不二之选(目前在国内你只能买到该软件、而你买的仿真机也很可能只支持该软件),即使不使用C语言而仅用汇编语言编程,其方便易用的集成环境、强大的软件仿真调试工具也会令你事半功倍。
我们将通过一些实例来学习Keil软件的使用,在这一部份我们将学习如何输入源程序,建立工程、对工程进行详细的设置,以及如何将源程序变为目标代码。
图1所示电路图使用89C51单片机作为主芯片,这种单片机性属于MCS-51系列,其内部有4K的FLASH ROM,可以反复擦写,非常适于做实验。
89C51的P1引脚上接8个发光二极管,P3.2~P3.4引脚上接4个按钮开关,我们的第一个任务是让接在P1引脚上的发光二极管依次循环点亮。
一、Keil工程的建立首先启动Keil软件的集成开发环境,这里假设读者已正确安装了该软件,可以从桌面上直接双击uVision的图标以启动该软件。
keilc详细中文手册
Keil C51使用详解V1.0第一章 Keil C51开发系统基本知识 (6)第一节系统概述 (6)第二节Keil C51单片机软件开发系统的整体结构 (6)第三节Keil C51工具包的安装 (7)1. C51 for Dos 72. C51 for Windows的安装及注意事项: (7)第四节Keil C51工具包各部分功能及使用简介 (7)1. C51与A51. 72. L51和BL51. 83. DScope51,Tscope51及Monitor51. 84. Ishell及uVision. 9第二章 Keil C51软件使用详解 (10)第一节Keil C51编译器的控制指令 (10)1. 源文件控制类 (10)2. 目标文件(Object)控制类: (10)3. 列表文件(listing)控制类: (10)第二节dScope51的使用 (11)1. dScope51 for Dos 112. dScope for Windows 12第三节Monitor51及其使用 (13)1. Monitor51对硬件的要求 (13)2. Mon51的使用 (13)3. MON51的配置 (13)4. 串口连接图: (13)5. MON51命令及使用 (14)第四节集成开发环境(IDE)的使用 (14)1. Ishell for Dos的使用 (14)2. uVision for windows的使用 (15)第三章 Keil C51 vs 标准C.. 15第一节Keil C51扩展关键字 (15)第二节内存区域(Memory Areas): (16)1. Pragram Area: (16)2. Internal Data Memory: 163. External Data Memory. 164. Speciac Function Register Memory. 16 第三节存储模式 (16)1. Small模式 (16)2. Compact模式 (17)3. large模式 (17)第四节存储类型声明 (17)第五节变量或数据类型 (17)第六节位变量与声明 (17)1. bit型变量 (17)2. 可位寻址区说明20H-2FH.. 18第七节Keil C51指针 (18)1. 一般指针 (18)2. 存储器指针 (18)3. 指针转换 (18)第八节Keil C51函数 (19)1. 中断函数声明: (19)2. 通用存储工作区 (19)3. 选通用存储工作区由using x声明,见上例。
Keil C51精确延时程序(C语言)
Keil C51精确延时程序程序说明如下:振荡频率:12MHz机器周期=12/振荡频率=12/12000000=1us#include <reg52.h>void delay1(unsigned char i){ while(--i);}说明:delay1程序为:延时时间=(2*i+2)*机器周期。
i=1~255。
void delay2(unsigned char i){ while(i--);}说明:delay2程序为:延时时间=(6*i+2)*机器周期。
i=1~255。
void main (void){unsigned char m;delay1(10); //赋值并调延时程序delay1说明:本句为赋值并调用Delayus1:延时时间=(1+2)*机器周期。
全部延时时间为:延时时间=(1+2+2*i+2)*机器周期。
i=1~255。
本例:延时时间=(1+2+2*10+2)*1us=25usdelay2(10); //赋值并调延时程序delay2说明:本句为赋值并调用Delayus2:延时时间=(1+2)*机器周期。
全部延时时间为:延时时间=(1+2+6*i+2)*机器周期。
i=1~255。
本例:延时时间=(1+2+6*10+2)*1us=65usm=10; //赋值,m=1~255while(--m) ; //计算,延时时间=2*m*机器周期说明:本两句为赋值并计算。
全部延时时间为:延时时间=(1+2*m)*机器周期。
m=1~255。
本例:延时时间=(1+2*10)*1us=25uswhile(1);}。
(完整版)用keilc编译单片机C程序的方法
用keilc编译单片机C程序的方法
1、打开keilc,新建一个工程
2、点击后,弹出对话框,找到C程序所在文件夹,输入工程名,然后保存。
3、点保存后,又弹出一个对框,选择单片机型号,选AT89S52,点OK。
再点是
4、加载C程序
在新建的工程的左边窗口,点鼠标右键,见下图
点加源程序项,即蓝条上。
又弹出下面的对话框,找到C程序双击,程序就被加载到工程中了,左边多了C程序。
5、打开C程序,双击左边工程中的C程序,右边窗口就出现了C程序了。
6、设置编译选项,在左边工程上点鼠标右键,点蓝条项
7、在弹出的对话框后,选Output标签,在刨建HEX文件上打勾,HEX代码文件名可以改,也可以不用改,只要在这个文件夹里能找到这个HEX文件就行,点OK。
HEX代码文件名
或者点击下图中所示的项目选顶按钮,也能弹出上面的选项对话框。
点这个按钮
8、编译C程序,最后一步,点编译按钮,就完成了,下面的窗口会提示编译成功的,如果有错误,就会提法有错误几条,就要找程序中的错误了。
KeilC软件使用介绍
软件更新
更新方式:在线 更新或手动下载
更新包
更新频率:根据 软件版本和需求, 定期或不定期更
新
பைடு நூலகம்
更新内容:修复 已知问题,优化 性能,增加新功
能
注意事项:更新 前备份重要数据, 避免更新过程中
出现意外情况
KeilC软件使用教程
创建新项目
打开KeilC软件,选择"Project"菜单,点击 "New Project"选项。
完成安装后, 启动KeilC软件, 进行必要的配 置
配置完成后, 即可开始使用 KeilC软件进行 编程和调试
配置环境
01
安装KeilC 软件
02
配置编译 器选项
03
配置调试 器选项
04
配置链接 器选项
05
配置库文 件选项
06
配置项目 选项
07
配置用户 自定义选
项
08
保存配置 并关闭设
置窗口
09
验证配置 是否正确
KeilC软件使用介绍
演讲人
目录
01. KeilC软件简介 02. KeilC软件安装与配置 03. KeilC软件使用教程 04. KeilC软件常见问题与解决方
案
KeilC软件简介
软件功能
01
编写、编译和调试C语言 程序
02
支持多种硬件平台,如 ARM、AVR、PIC等
03
提供代码优化和性能分 析工具
04
集成了调试器和仿真器, 方便调试和测试程序
05
支持实时操作系统和嵌 入式系统开发
06
提供丰富的示例代码和教 程,帮助用户快速上手
(完整版)C51单片机C语言程序100例_Keil
目录目录 (1)函数的使用和熟悉********************************/ (4)实例3:用单片机控制第一个灯亮 (4)实例4:用单片机控制一个灯闪烁:认识单片机的工作频率 (4)实例5:将P1口状态分别送入P0、P2、P3口:认识I/O口的引脚功能 (5)实例6:使用P3口流水点亮8位LED (5)实例7:通过对P3口地址的操作流水点亮8位LED (6)实例8:用不同数据类型控制灯闪烁时间 (7)实例9:用P0口、P1口分别显示加法和减法运算结果 (8)实例10:用P0、P1口显示乘法运算结果 (9)实例11:用P1、P0口显示除法运算结果 (9)实例12:用自增运算控制P0口8位LED流水花样 (10)实例13:用P0口显示逻辑"与"运算结果 (10)实例14:用P0口显示条件运算结果 (11)实例15:用P0口显示按位"异或"运算结果 (11)实例16:用P0显示左移运算结果 (11)实例17:"万能逻辑电路"实验 (11)实例18:用右移运算流水点亮P1口8位LED (12)实例19:用if语句控制P0口8位LED的流水方向 (13)实例20:用swtich语句的控制P0口8位LED的点亮状态 (13)实例21:用for语句控制蜂鸣器鸣笛次数 (14)实例22:用while语句控制LED (16)实例23:用do-while语句控制P0口8位LED流水点亮 (16)实例24:用字符型数组控制P0口8位LED流水点亮 (17)实例25:用P0口显示字符串常量 (18)实例26:用P0口显示指针运算结果 (19)实例27:用指针数组控制P0口8位LED流水点亮 (19)实例28:用数组的指针控制P0口8位LED流水点亮 (20)实例29:用P0、P1口显示整型函数返回值 (21)实例30:用有参函数控制P0口8位LED流水速度 (22)实例31:用数组作函数参数控制流水花样 (23)实例32:用指针作函数参数控制P0口8位LED流水点亮 (23)实例33:用函数型指针控制P1口灯花样 (25)实例34:用指针数组作为函数的参数显示多个字符串 (26)实例35:字符函数ctype.h应用举例 (27)实例36:内部函数intrins.h应用举例 (27)实例37:标准函数stdlib.h应用举例 (28)实例38:字符串函数string.h应用举例 (29)实例39:宏定义应用举例2 (29)1/192实例40:宏定义应用举例2 (30)实例41:宏定义应用举例3 (30)中断、定时器************************************************ (31)实例42:用定时器T0查询方式P2口8位控制LED闪烁 (31)实例43:用定时器T1查询方式控制单片机发出1KHz音频 (31)实例44:将计数器T0计数的结果送P1口8位LED显示 (32)实例45:用定时器T0的中断控制1位LED闪烁 (33)实例46:用定时器T0的中断实现长时间定时 (34)实例47:用定时器T1中断控制两个LED以不同周期闪烁 (34)实例48:用计数器T1的中断控制蜂鸣器发出1KHz音频 (36)实例49:用定时器T0的中断实现"渴望"主题曲的播放 (36)实例50-1:输出50个矩形脉冲 (39)实例50-2:计数器T0统计外部脉冲数 (40)实例51-2:定时器T0的模式2测量正脉冲宽度 (40)实例52:用定时器T0控制输出高低宽度不同的矩形波 (41)实例53:用外中断0的中断方式进行数据采集 (42)实例54-1:输出负脉宽为200微秒的方波 (43)实例54-2:测量负脉冲宽度 (43)实例55:方式0控制流水灯循环点亮 (44)实例56-1:数据发送程序 (45)实例56-2:数据接收程序 (47)实例57-1:数据发送程序 (47)实例57-2:数据接收程序 (49)实例58:单片机向PC发送数据 (50)实例59:单片机接收PC发出的数据 (51)*********************************数码管显示 (52)实例60:用LED数码显示数字5 (52)实例61:用LED数码显示器循环显示数字0~9 (52)实例62:用数码管慢速动态扫描显示数字"1234" (53)实例63:用LED数码显示器伪静态显示数字1234 (54)实例64:用数码管显示动态检测结果 (54)实例65:数码秒表设计 (56)实例66:数码时钟设计 (58)实例67:用LED数码管显示计数器T0的计数值 (62)实例68:静态显示数字“59” (63)*****************************键盘控制2/192*****************************************************/ (63)实例69:无软件消抖的独立式键盘输入实验 (64)实例70:软件消抖的独立式键盘输入实验 (64)实例71:CPU控制的独立式键盘扫描实验 (65)实例72:定时器中断控制的独立式键盘扫描实验 (68)实例73:独立式键盘控制的4级变速流水灯 (71)实例74:独立式键盘的按键功能扩展:"以一当四" (73)实例75:独立式键盘调时的数码时钟实验 (75)实例76:独立式键盘控制步进电机实验 (79)实例77:矩阵式键盘按键值的数码管显示实验 (82)//实例78:矩阵式键盘按键音 (85)实例79:简易电子琴 (86)实例80:矩阵式键盘实现的电子密码锁 (92)**************************************************************************液晶显示LCD*********液晶显示LCD*****液晶显示LCD************************************************************************/ (95)实例81:用LCD显示字符'A' (96)实例82:用LCD循环右移显示"Welcome to China" (99)实例83:用LCD显示适时检测结果 (102)实例84:液晶时钟设计 (106)******************************************一些芯片的使用*****24c02........ DS18B20X5045ADC0832DAC0832DS1302红外遥控**********************************************/ (112)实例85:将数据"0x0f"写入AT24C02再读出送P1口显示 (112)实例86:将按键次数写入AT24C02,再读出并用1602LCD显示 (117)实例87:对I2C总线上挂接多个AT24C02的读写操作 (124)实例88:基于AT24C02的多机通信读取程序 (129)实例88:基于AT24C02的多机通信写入程序 (133)实例90:DS18B20温度检测及其液晶显示 (144)实例91:将数据"0xaa"写入X5045再读出送P1口显示 (153)实例92:将流水灯控制码写入X5045并读出送P1口显示 (157)实例93:对SPI总线上挂接多个X5045的读写操作 (161)实例94:基于ADC0832的数字电压表 (165)实例95:用DAC0832产生锯齿波电压 (171)实例96:用P1口显示红外遥控器的按键值 (171)实例97:用红外遥控器控制继电器 (174)实例98:基于DS1302的日历时钟 (177)实例99:单片机数据发送程序 (185)实例100:电机转速表设计 (186)模拟霍尔脉冲 (192)/********************************************************* ***函数的使用和熟悉***************************************************************///实例3:用单片机控制第一个灯亮#include<reg51.h>//包含51单片机寄存器定义的头文件void main(void){P1=0xfe;//P1=11111110B,即P1.0输出低电平}//4//实例4:用单片机控制一个灯闪烁:认识单片机的工作频率#include<reg51.h>//包含单片机寄存器的头文件/****************************************函数功能:延时一段时间*****************************************/void delay(void)//两个void意思分别为无需返回值,没有参数传递{unsigned int i;//定义无符号整数,最大取值范围65535for(i=0;i<20000;i++)//做20000次空循环;//什么也不做,等待一个机器周期}/*******************************************************函数功能:主函数(C语言规定必须有也只能有1个主函数)********************************************************/void main(void){while(1)//无限循环{P1=0xfe;//P1=11111110B,P1.0输出低电平delay();//延时一段时间P1=0xff;//P1=11111111B,P1.0输出高电平delay();//延时一段时间// 5 P1 P0 P2 P3 I/O //实例 5:将 #include<reg51.h> P1 口状态分别送入 P0、P2、P3 口:认识 I/O口 的引脚功能//包含单片机寄存器的头文件/*******************************************************函数功能:主函数 (C 语言规定必须有也只能有 1个主函数)********************************************************/ void main(void){while(1) //无限循环{P1=0xff; // P1=1111 1111B,熄灭 LEDP0=P1; // 将 P1 口状态送入 P0 口P2=P1; // 将 P1 口状态送入 P2 口P3=P1; // 将 P1 口状态送入 P3口}}//实例 6:使用 P3 口流水点亮 8 位LED #include<reg51.h> //包含单片机寄存器的头文件/****************************************函数功能:延时一段时间*****************************************/void delay(void){unsigned char i,j;for(i=0;i<250;i++)for(j=0;j<250;j++);}/*******************************************************函数功能:主函数********************************************************/ voidmain(void){while(1){P3=0xfe; delay(); P3=0xfd; delay(); P3=0xfb; delay(); P3=0xf7; delay(); P3=0xef; //第一个灯亮//调用延时函数//第二个灯亮//调用延时函数//第三个灯亮//调用延时函数//第四个灯亮//调用延时函数//第五个灯亮delay(); //调用延时函数P3=0xdf; delay(); P3=0xbf;//第六个灯亮//调用延时函数//第七个灯亮delay(); //调用延时函数P3=0x7f; //第八个灯亮} }delay(); //调用延时函数//实例7:通过对P3口地址的操作流水点亮8位LED#include<reg51.h>//包含单片机寄存器的头文件sfr x=0xb0;//P3口在存储器中的地址是b0H,通过sfr可定义8051内核单片机//的所有内部8位特殊功能寄存器,对地址x的操作也就是对P1口的操作/****************************************函数功能:延时一段时间*****************************************/void delay(void){unsigned char i,j;for(i=0;i<250;i++)for(j=0;j<250;j++);//利用循环等待若干机器周期,从而延时一段时间}/*****************************************函数功能:主函数******************************************/void main(void){while(1){x=0xfe;//第一个灯亮delay();//调用延时函数x=0xfd;//第二个灯亮delay();//调用延时函数x=0xfb;//第三个灯亮delay();//调用延时函数x=0xf7;//第四个灯亮delay();//调用延时函数x=0xef;//第五个灯亮delay();//调用延时函数x=0xdf;//第六个灯亮delay();//调用延时函数x=0xbf;//第七个灯亮delay();//调用延时函数x=0x7f;//第八个灯亮delay();//调用延时函数}}//实例8:用不同数据类型控制灯闪烁时间#include<reg51.h>//包含单片机寄存器的头文件/******************************************************函数功能:用整形数据延时一段时间******************************************************/void int_delay(void)//延时一段较长的时间{unsigned int m;//定义无符号整形变量,双字节数据,值域为0~65535 for(m=0;m<36000;m++);//空操作}/******************************************************函数功能:用字符型数据延时一段时间******************************************************/void char_delay(void)//延时一段较短的时间{unsigned char i,j;//定义无符号字符型变量,单字节数据,值域0~255 for(i=0;i<200;i++)for(j=0;j<180;j++);//空操作}/******************************************************函数功能:主函数******************************************************/void main(void){unsigned char i;while(1){for(i=0;i<3;i++){P1=0xfe;//P1.0口的灯点亮int_delay();//延时一段较长的时间P1=0xff;//熄灭int_delay();//延时一段较长的时间}for(i=0;i<3;i++){P1=0xef;//P1.4口的灯点亮char_delay();//延时一段较长的时间P1=0xff;//熄灭char_delay();//延时一段较长的时间}}}//实例9:用P0口、P1口分别显示加法和减法运算结果#include<reg51.h>void main(void){unsigned char m,n;m=43; //即十进制数2x16+11=43n=60;P1=m+n; //即十进制数3x16+12=60//P1=103=01100111B,结果P1.3、P1.4、P1.7 口的灯被点亮}P0=n-m; //P0=17=00010001B,结果P0.0、P0.4的灯被熄灭//实例10:用P0、P1口显示乘法运算结果#include<reg51.h>//包含单片机寄存器的头文件void main(void){unsigned char m,n;unsigned int s;m=64;n=71;s=m*n;//s=64*71=4544,需要16位二进制数表示,高8位送P1口,低8位送P0口//由于4544=17*256+192=H3*16*16*16+H2*16*16+H1*16+H0//两边同除以256,可得17+192/256=H3*16+H2+H1*16+H0)/256//因此,高8位16进制数H3*16+H2必然等于17,即4544除以256的商//低8位16进制数H1*16+H0必然等于192,即4544除以256的余数P1=s/256;//高8位送P1口,P1=17=11H=00010001B,P1.0和P1.4口灭,其余亮P0=s%256;//低8位送P0口,P3=192=c0H=11000000B,P3.1,P3.6,P3.7口灭,其余亮}//实例11:用P1、P0口显示除法运算结果#include<reg51.h>//包含单片机寄存器的头文件void main(void){P1=36/5;//求整数P0=((36%5)*10)/5;//求小数while(1); //无限循环防止程序“跑飞”}//实例12:用自增运算控制P0口8位LED流水花样#include<reg51.h>//包含单片机寄存器的头文件/******************************************************函数功能:延时一段时间******************************************************/void delay(void){unsigned int i;for(i=0;i<20000;i++);}/******************************************************函数功能:主函数******************************************************/void main(void){unsigned char i;for(i=0;i<255;i++)//注意i的值不能超过255{P0=i;//将i的值送P0口delay();//调用延时函数}}//实例13:用P0口显示逻辑"与"运算结果#include<reg51.h>//包含单片机寄存器的头文件void main(void){P0=(4>0)&&(9>0xab);//将逻辑运算结果送P0口while(1);//设置无限循环,防止程序“跑飞”}//14P0//实例14:用P0口显示条件运算结果#include<reg51.h>//包含单片机寄存器的头文件void main(void){P0=(8>4)?8:4;//将条件运算结果送P0口,P0=8=00001000B while(1);//设置无限循环,防止程序“跑飞”}//实例15:用P0口显示按位"异或"运算结果#include<reg51.h>//包含单片机寄存器的头文件void main(void){P0=0xa2^0x3c;//将条件运算结果送P0口,P0=8=00001000B while(1);//设置无限循环,防止程序“跑飞”}//16P0//实例16:用P0显示左移运算结果#include<reg51.h>//包含单片机寄存器的头文件void main(void){P0=0x3b<<2;//将左移运算结果送P0口,P0=11101100B=0xec while(1);//无限循环,防止程序“跑飞”}#include<reg51.h> //实例17:"万能逻辑电路"实验//包含单片机寄存器的头文件sbit X=P1^5; sbit Y=P1^6; sbit Z=P1^7; void main(void) {while(1){ //将X位定义为//将Y位定义为//将Z位定义为P1.5P1.6P1.7} }F=((~X)&Y)|Z;//将逻辑运算结果赋给F;//实例18:用右移运算流水点亮P1口8位LED#include<reg51.h>//包含单片机寄存器的头文件/*****************************函数功能:延时一段时间*****************************/void delay(void){unsigned int n;for(n=0;n<30000;n++);}/*****************************函数功能:主函数*****************************/void main(void){unsigned char i;while(1){P1=0xff;delay();for(i=0;i<8;i++)//设置循环次数为8{P1=P1>>1;//每次循环P1的各二进位右移1位,高位补0delay();//调用延时函数}}}//19iff P08LED//实例19:用iff语句控制P0口8位LED的流水方向#include<reg51.h>//包含单片机寄存器的头文件sbit S1=P1^4;//将S1位定义为P1.4sbit S2=P1^5;//将S2位定义为P1.5/*****************************函数功能:主函数*****************************/void main(void){while(1){if(S1==0)//如果按键S1按下P0=0x0f;//P0口高四位LED点亮if(S2==0)//如果按键S2按下P0=0xf0;//P0口低四位LED点亮}}//实例20:用swtich语句的控制P0口8位LED的点亮状态#include<reg51.h>//包含单片机寄存器的头文件sbit S1=P1^4;//将S1位定义为P1.4/*****************************函数功能:延时一段时间*****************************/void delay(void){unsigned int n;for(n=0;n<10000;n++);}/*****************************函数功能:主函数*****************************/void main(void){unsigned char i;i=0;while(1){//将i初始化为0if(S1==0) {delay();//如果S1键按下//延时一段时间} if(S1==0)//如果再次检测到S1键按下i++;//i自增1if(i==9)//如果i=9,重新将其置为1 i=1;} switch(i)}{}//使用多分支选择语句case1:P0=0xfe;//第一个LED亮break;case2:P0=0xfd;//第二个LED亮break;case3:P0=0xfb;//第三个LED亮break;case4:P0=0xf7;//第四个LED亮break;case5:P0=0xef;//第五个LED亮break;case6:P0=0xdf;//第六个LED亮break;case7:P0=0xbf;//第七个LED亮break;case8:P0=0x7f;//第八个LED亮break;default://缺省值,关闭所有LEDP0=0xff;//21for//实例21:用for语句控制蜂鸣器鸣笛次数#include<reg51.h>//包含单片机寄存器的头文件sbit sound=P3^7;//将sound位定义为P3.7/**************************************** 函数功能:延时形成1600Hz音频****************************************/ void delay1600(void){unsigned char n;for(n=0;n<100;n++);}/**************************************** 函数功能:延时形成800Hz音频****************************************/ void delay800(void){unsigned char n;for(n=0;n<200;n++);}/**************************************** 函数功能:主函数****************************************/ void main(void){unsigned int i;while(1){for(i=0;i<830;i++){sound=0;//P3.7输出低电平delay1600();sound=1;//P3.7输出高电平delay1600();}for(i=0;i<200;i++){sound=0;//P3.7输出低电平delay800();sound=1;//P3.7输出高电平delay800();}}}//实例22:用whille语句控制LED#include<reg51.h> //包含单片机寄存器的头文件/****************************************函数功能:延时约60ms(3*100*200=60000μs)****************************************/void delay60ms(void){unsigned char m,n;for(m=0;m<100;m++)for(n=0;n<200;n++);}/****************************************函数功能:主函数****************************************/void main(void){unsigned char i;while(1)//无限循环{i=0;//将i初始化为0while(i<0xff)//当i小于0xff(255)时执行循环体{P0=i;//将i送P0口显示delay60ms();//延时i++;//i自增1}}}//实例23:用do-whiile语句控制P0口8位LED流水点亮#include<reg51.h>//包含单片机寄存器的头文件/****************************************函数功能:延时约60ms(3*100*200=60000μs)****************************************/void delay60ms(void){unsigned char m,n;for(m=0;m<100;m++)for(n=0;n<200;n++);}/****************************************函数功能:主函数****************************************/void main(void){do{P0=0xfe;//第一个LED亮delay60ms();P0=0xfd;//第二个LED亮delay60ms();P0=0xfb;//第三个LED亮delay60ms();P0=0xf7;//第四个LED亮delay60ms();P0=0xef;//第五个LED亮delay60ms();P0=0xdf;//第六个LED亮delay60ms();delay60ms();P0=0xbf;//第七个LED亮delay60ms();P0=0x7f;//第八个LED亮delay60ms();}while(1);//无限循环,使8位LED循环流水点亮}//实例24:用字符型数组控制P0口8位LED流水点亮#include<reg51.h>//包含单片机寄存器的头文件/****************************************函数功能:延时约60ms(3*100*200=60000μs)****************************************/void delay60ms(void){unsigned char m,n;for(m=0;m<100;m++)} for(n=0;n<200;n++);/****************************************函数功能:主函数****************************************/void main(void){unsigned char i;unsigned char code Tab[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//定义无符号字符型数组while(1){for(i=0;i<8;i++){P0=Tab[i];//依次引用数组元素,并将其送P0口显示delay60ms();//调用延时函数}}}//25P0//实例25:用P0口显示字符串常量#include<reg51.h> //包含单片机寄存器的头文件/*************************************************函数功能:延时约150ms(3*200*250=150000μs=150ms*************************************************/void delay150ms(void){unsigned char m,n;for(m=0;m<200;m++)for(n=0;n<250;n++);}/*************************************************函数功能:主函数*************************************************/void main(void){unsigned char str[]={"Now,Temperature is:"};//将字符串赋给字符型全部元素赋值unsigned char i;while(1){i=0; //将i初始化为0,从第一个元素开始显示} }while(str[i]!='\0')//只要没有显示到结束标志'\0'{P0=str[i];//将第i个字符送到P0口显示delay150ms();//调用150ms延时函数i++;//指向下一个待显字符}//实例26:用P0#include<reg51.h>void main(void){口显示指针运算结果unsigned char*p1,*p2; //定义无符号字符型指针变量p1,p2 unsigned char i,j; //定义无符号字符型数据i=25; j=15;p1=&i ;p2=&j ; //给i赋初值25//使指针变量指向i//使指针变量指向j,对指针初始化,对指针初始化P0=*p1+*p2; //*p1+*p2相当于i+j,所以P0=25+15=40=0x28}//则P0=00101000B,结果P0.3、P0.5引脚LED熄灭,其余点亮while(1);//无限循环,防止程序“跑飞”//27P08LED//实例27:用指针数组控制P0口8位LED流水点亮#include<reg51.h>/************************************************* 函数功能:延时约150ms(3*200*250=150000μs=150ms *************************************************/ void delay150ms(void){} for(n=0;n<250;n++) ;/*************************************************函数功能:主函数*************************************************/void main(void){unsigned char code Tab[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; unsigned char*p[]={&Tab[0],&Tab[1],&Tab[2],&Tab[3],&Tab[4],&Tab[5],&Tab[6],&Tab[7]};unsigned char i;//定义无符号字符型数据while(1){for(i=0;i<8;i++){P0=*p[i];delay150ms();}}}//28P08LED//实例28:用数组的指针控制P0#include<reg51.h>口8位LED流水点亮/*************************************************函数功能:延时约150ms(3*200*250=150000μs=150ms*************************************************/void delay150ms(void){unsigned char m,n;for(m=0;m<200;m++)for(n=0;n<250;n++);}/*************************************************函数功能:主函数*************************************************/void main(void){} unsigned char i;unsigned char Tab[]={0xFF,0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F,0xBF,0xDF,0xEF,0xF7,0xFB,0xFD,0xFE,0xFE,0xFC,0xFB,0xF0,0xE0,0xC0,0x80,0x00,0xE7,0xDB,0xBD,0x7E,0x3C,0x18,0x00,0x81,0xC3,0xE7,0x7E,0xBD,0xDB,0xE7,0xBD,0xDB};//流水灯控制码unsigned char*p;//定义无符号字符型指针p=Tab;//将数组首地址存入指针pwhile(1){for(i=0;i<32;i++)//共32个流水灯控制码{P0=*(p+i);//*(p+i)的值等于a[i]delay150ms();//调用150ms延时函数}}//29P0P1//实例29:用P0#include<reg51.h>、P1口显示整型函数返回值/*************************************************函数功能:计算两个无符号整数的和*************************************************/unsigned int sum(int a,int b){unsigned int s;s=a+b;return(s);}/*************************************************函数功能:主函数*************************************************/void main(void){unsigned z;z=sum(2008,2009);P1=z/256;//取得z的高8位P0=z%256;//取得z的低8位while(1);}//实例30:用有参函数控制P0口8位LED流水速度#include<reg51.h>/*************************************************函数功能:延时一段时间*************************************************/void delay(unsigned char x){unsigned char m,n;for(m=0;m<x;m++)for(n=0;n<200;n++);}/*************************************************函数功能:主函数*************************************************/void main(void){unsigned char i;unsigned char code Tab[]={0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F};//流水灯控制码while(1){//快速流水点亮LEDfor(i=0;i<8;i++)//共8个流水灯控制码{P0=Tab[i];delay(100);//延时约60ms,(3*100*200=60000μs)}//慢速流水点亮LEDfor(i=0;i<8;i++)//共8个流水灯控制码{P0=Tab[i];delay(250);//延时约150ms,(3*250*200=150000μs)}}}22/192//31//实例31:用数组作函数参数控制流水花样#include<reg51.h>/*************************************************函数功能:延时约150ms*************************************************/void delay(void){unsigned char m,n;for(m=0;m<200;m++)for(n=0;n<250;n++);}/*************************************************函数功能:流水点亮P0口8位LED*************************************************/void led_flow(unsigned char a[8]){unsigned char i;for(i=0;i<8;i++){P0=a[i];delay();}}/*************************************************函数功能:主函数*************************************************/void main(void){unsigned char code Tab[]={0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F};//流水灯控制码led_flow(Tab);}//32P08LED//实例32:用指针作函数参数控制P0口8位LED流水点亮/*************************************************函数功能:延时约150ms*************************************************/void delay(void){unsigned char m,n;for(m=0;m<200;m++)for(n=0;n<250;n++);}/*************************************************函数功能:流水点亮P0口8位LED*************************************************/void led_flow(unsigned char*p)//形参为无符号字符型指针{unsigned char i;while(1){i=0;//将i置为0,指向数组第一个元素while(*(p+i)!='\0')//只要没有指向数组的结束标志{P0=*(p+i);//取的指针所指变量(数组元素)的值,送P0口delay();//调用延时函数i++;//指向下一个数组元素}}}/*************************************************函数功能:主函数*************************************************/void main(void){unsigned char code Tab[]={0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F,0x7F,0xBF,0xDF,0xEF,0xF7,0xFB,0xFD,0xFE, 0xFF,0xFE,0xFC,0xFB,0xF0,0xE0,0xC0,0x80,0x00,0xE7,0xDB,0xBD,0x7E,0xFF,0xFF,0x3C,0x18,0x0,0x81,0xC3,0xE7,0xFF, 0xFF,0x7E};//流水灯控制码unsigned char*pointer;224/192} pointer=Tab;led_flow(pointer);//33P1//实例33:用函数型指针控制P1口灯花样#include<reg51.h>//包含51单片机寄存器定义的头文件unsigned char code Tab[]={0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F}; //流水灯控制码,该数组被定义为全局变量/************************************************************** 函数功能:延时约150ms**************************************************************/ void delay(void){unsigned char m,n;for(m=0;m<200;m++)for(n=0;n<250;n++);}/************************************************************** 函数功能:流水灯左移**************************************************************/ void led_flow(void){unsigned char i;for(i=0;i<8;i++)//8位控制码{P0=Tab[i];delay();}}/************************************************************** 函数功能:主函数**************************************************************/ void main(void){void(*p)(void);//定义函数型指针,所指函数无参数,无返回值p=led_flow;//将函数的入口地址赋给函数型指针pwhile(1)(*p)(); //通过函数的指针p调用函数led_flow()}//34//实例34:用指针数组作为函数的参数显示多个字符串#include<reg51.h>//包含51单片机寄存器定义的头文件unsigned char code str1[]="Temperature is tested by DS18B20";//C语言中,字符串是作为字符数组来处理的unsigned char code str2[]="Now temperature is:";//所以,字符串的名字就是字符串的首地址unsigned char code str3[]="The Systerm is designed by Zhang San";unsigned char code str4[]="The date is2008-9-30";unsigned char*p[]={str1,str2,str3,str4};//定义p[4]为指向4个字符串的字符型指针数组/**************************************************************函数功能:延时约150ms**************************************************************/ void delay(void){unsigned char m,n;for(m=0;m<200;m++)for(n=0;n<250;n++);}/**************************************************************函数功能:流水点亮P0口8位LED**************************************************************/ void led_display(unsigned char*x[])//形参必须为指针数组{unsigned char i,j;for(i=0;i<4;i++)//有4个字符串要显示{j=0;//指向待显字符串的第0号元素while(*(x[i]+j)!='\0')//只要第i个字符串的第j号元素不是结束标志{P0=*(x[i]+j);//取得该元素值送到P0口显示delay();//调用延时函数j++;//指向下一个元素}}}/************************************************************** 函数功能:主函数**************************************************************/ void main(void){unsigned char i;while(1){for(i=0;i<4;i++)led_display(p);//将指针数组名作实际参数传递}}//实例35:字符函数ctype.h应用举例#include<reg51.h>//包含51单片机寄存器定义的头文件#include<ctype.h>void main(void){while(1){P3=isalpha('_')?0xf0:0x0f;//条件运算,若'_'是英文字母,P3=0xf0 }}//实例36:内部函数intrins..h应用举例#include<reg51.h>//包含51单片机寄存器定义的头文件#include<intrins.h>//包含函数isalpha()声明的头文件/*************************************************函数功能:延时约150ms*************************************************/void delay(void){unsigned char m,n;for(m=0;m<200;m++)for(n=0;n<250;n++);}227/192/*************************************************函数功能:主函数*************************************************/void main(void){P3=0xfe;//P3=11111110Bwhile(1){P3=_crol_(P3,1);//将P3的二进制位循环左移1位后再赋给P3 delay();//调用延时函数}}//37stdlib.h//实例37:标准函数stdliib.h应用举例#include<reg51.h>//包含51单片机寄存器定义的头文件#include<stdlib.h>//包含函数isalpha()声明的头文件/*************************************************函数功能:延时约150ms*************************************************/void delay(void){unsigned char m,n;for(m=0;m<200;m++)for(n=0;n<250;n++);}/*************************************************函数功能:主函数*************************************************/void main(void){unsigned char i;while(1){for(i=0;i<10;i++)//产生10个随机数{P3=rand()/160;//将产生的随机数缩小160倍后送P3显示delay();}}}//实例 38:字符串函数 striing.h应用举例 #include<reg51.h> //包含 51 单片机寄存器定义的头文件 #include<string.h> //包含函数 isalpha ()声明的头文件 void main(void){unsigned char str1[ ]="Now, The temperature is :";unsigned char str2[ ]="Now, The temperature is 36 Centgrade:"; unsigned char i;i=strcmp(str1,str2); //比较两个字符串,并将结果存入i if(i==0) //str1=str2P3=0x00;elseif(i<0) //str1<str2P3=0xf0;else //str1>str2P3=0x0f;while(1); //防止程序“跑飞”}// 39 2 #include<reg51.h> //实例 39:宏定义应用举例2 //包含 51 单片机寄存器定义的头文件 # define F(a,b) (a)+(a)*(b)/256+(b) void main(void){unsigned char i,j,k;i=40;j=30;k=20;//带参数的宏定义,a 和 b 为形参 参} P3=F(i,j+k); while(1);//i 和 j+k分别为实参,宏展开时,实参将替代宏定义中的形//实例40:宏定义应用举例2 #include<AT89X51.h>#include<ctype.h>void main(void){P3_0=0;//将P3.0引脚置低电平,LED点亮P3_1=0;//将P3.0引脚置低电平,LED点亮P3_2=0;//将P3.0引脚置低电平,LED点亮P3_3=0;//将P3.0引脚置低电平,LED点亮P3_4=1;//将P3.4引脚置高电平,LED熄灭P3_5=1;//将P3.5引脚置高电平,LED熄灭P3_6=1;//将P3.7引脚置高电平,LED熄灭P3_7=1;//将P3.7引脚置高电平,LED熄灭while(1);}//实例41:宏定义应用举例3#include<reg51.h >#define MAX100 void main(void) {#if MAX>80P3=0xf0;#elseP3=0x0f;#endif}//包含51单片机寄存器定义的头文件//将MAX宏定义为字符串100//如果字符串100大于80//P3口低四位LED点亮//否则,P3口高四位LED点亮//结束本次编译/***************************************************** ************中断、定时器********中断、定时器*********************中断、定时器*********中断、定时器****************************************************************** **///实例42:用定时器T0查询方式P2口8位控制LED闪烁#include<reg51.h>//包含51单片机寄存器定义的头文件/**************************************************************函数功能:主函数**************************************************************/void main(void){//EA=1;//开总中断//ET0=1;//定时器T0中断允许TMOD=0x01;//使用定时器T0的模式1TH0=(65536-46083)/256;//定时器T0的高8位赋初值TL0=(65536-46083)%256;//定时器T0的高8位赋初值TR0=1;//启动定时器T0TF0=0;P2=0xff;while(1)//无限循环等待查询{while(TF0==0);TF0=0;P2=~P2;TH0=(65536-46083)/256;//定时器T0的高8位赋初值TL0=(65536-46083)%256;//定时器T0的高8位赋初值}}//实例43:用定时器T1查询方式控制单片机发出1KHz音频/************************************************************** 函数功能:主函数**************************************************************/ void main(void){//EA=1;//开总中断//ET0=1;//定时器T0中断允许TMOD=0x10;//使用定时器T1的模式1TH1=(65536-921)/256;//定时器T1的高8位赋初值TL1=(65536-921)%256;//定时器T1的高8位赋初值TR1=1;//启动定时器T1TF1=0;while(1)//无限循环等待查询{while(TF1==0);TF1=0;sound=~sound;//将P3.7引脚输出电平取反TH1=(65536-921)/256;//定时器T0的高8位赋初值TL1=(65536-921)%256;//定时器T0的高8位赋初值}}//44T0P18LED //实例44:将计数器T0计数的结果送P1口8位LED显示#include<reg51.h>//包含51单片机寄存器定义的头文件sbit S=P3^4;//将S位定义为P3.4引脚/************************************************************** 函数功能:主函数**************************************************************/ void main(void){//EA=1;//开总中断//ET0=1;//定时器T0中断允许TMOD=0x02;//使用定时器T0的模式2TH0=256-156;//定时器T0的高8位赋初值TL0=256-156;//定时器T0的高8位赋初值TR0=1;//启动定时器T0while(1)//无限循环等待查询{while(TF0==0)//如果未计满就等待。
KeilC51使用教程
Keil C语言程序设计示例教程(开发C8051F310)使用汇编语言或C语言要使用编译器,以便把写好的程序编译为机器码,才能把HEX可执行文件写入单片机内。
KEIL uVISION是众多单片机应用开发软件中最优秀的软件之一,它支持众多不同公司的MCS51架构的芯片,甚至ARM,它集编辑,编译,仿真等于一体,它的界面和常用的微软VC++的界面相似,界面友好,易学易用,在调试程序,软件仿真方面也有很强大的功能。
因此很多开发51应用的工程师或普通的单片机爱好者,都对它十分喜欢。
在这里以51单片机并结合C程序为例(汇编操作方法类似,唯一不同的是汇编源程序文件名后缀为“.ASM ”),图文描述工程项目的创建和使用方法。
1.首先我们要养成一个习惯:最好先建立一个空文件夹,把您的工程文件放到里面,以避免和其他文件混合,如下图, 创建了一个名为“PRJ_C8051”文件夹2.点击桌面上的Keil uVision4图标,出现启动画面:3.点击“project --- New uVision Project”新建一个工程:4.在对话框,选择放在刚才建立的“PRJ_C8051”文件夹下,给这个工程取个名为Test_C8051F310, 然后保存,工程的后缀为uvporj。
5.弹出一个框,在CPU类型下我们找到并选中“Silicon Laboratories. Inc.”下的C8051F3106.加入C8051起动码7.建立一个源程序文本8.在下面空白区别写入或复制一个完整的C程序:9.输入源程序文件名名称,示例输入“Test_C8051F310.c”,然后保存:10.把刚创建的源程序文件加入到工程项目文件中。
11.设置---目标(第1步~ 第4步)15.工程项目创建和设置全部完成!点击保持并编译16.在C8051F310中的C语言程序示例//-----------------------------------------------------------------------------// Includes// 在c8051f310.h在头文件中定义了C8051F310的寄存器、输入/输出的端口//-----------------------------------------------------------------------------#include <c8051f310.h> // SFR declarations//-----------------------------------------------------------------------------// 16-bit SFR Definitions for 'F30x//-----------------------------------------------------------------------------sfr16 TMR2RL = 0xca; // Timer2 reload valuesfr16 TMR2 = 0xcc; // Timer2 counter//-----------------------------------------------------------------------------// Global CONSTANTS//-----------------------------------------------------------------------------#define SYSCLK 24500000 / 8 // SYSCLK frequency in Hzsbit LED = P0^0; // LED='1' means ON//-----------------------------------------------------------------------------// Function PROTOTYPES//-----------------------------------------------------------------------------void SYSCLK_Init (void);void PORT_Init (void);void Timer2_Init (int counts);void Timer2_ISR (void);//-----------------------------------------------------------------------------// MAIN Routine//-----------------------------------------------------------------------------void main (void){// disable watchdog timerPCA0MD &= ~0x40; // WDTE = 0 (clear watchdog timer// enable)SYSCLK_Init (); // Initialize system clock to// 24.5MHzPORT_Init (); // Initialize crossbar and GPIOTimer2_Init (SYSCLK / 12 / 10); // Init Timer2 to generate// interrupts at a 10Hz rate.EA = 1; // enable global interruptswhile (1) // spin forever{}}//-----------------------------------------------------------------------------// SYSCLK_Init//-----------------------------------------------------------------------------//// This routine initializes the system clock to use the internal 24.5MHz / 8// oscillator as its clock source. Also enables missing clock detector reset.//void SYSCLK_Init (void){OSCICN = 0x80; // configure internal oscillator for// its lowest frequency RSTSRC = 0x04; // enable missing clock detector }//-----------------------------------------------------------------------------// PORT_Init//-----------------------------------------------------------------------------//// Configure the Crossbar and GPIO ports.// P3.3 - LED (push-pull)//void PORT_Init (void){// assignmentsXBR0 = 0x00; // no digital peripherals selectedXBR1 = 0x40; // Enable crossbar and weak pull-ups//P3MDOUT |= 0x08;P0MDOUT |= 0x03; // enable LED as a push-pull output}//-----------------------------------------------------------------------------// Timer2_Init//-----------------------------------------------------------------------------//// Configure Timer2 to 16-bit auto-reload and generate an interrupt at// interval specified by <counts> using SYSCLK/48 as its time base.//void Timer2_Init (int counts){TMR2CN = 0x00; // Stop Timer2; Clear TF2;// use SYSCLK/12 as timebase CKCON &= ~0x60; // Timer2 clocked based on T2XCLK;TMR2RL = -counts; // Init reload valuesTMR2 = 0xffff; // set to reload immediatelyET2 = 1; // enable Timer2 interruptsTR2 = 1; // start Timer2}//-----------------------------------------------------------------------------// Interrupt Service Routines//-----------------------------------------------------------------------------//-----------------------------------------------------------------------------// Timer2_ISR//-----------------------------------------------------------------------------// This routine changes the state of the LED whenever Timer2 overflows.//void Timer2_ISR (void) interrupt 5{TF2H = 0; // clear Timer2 interrupt flagLED = ~LED; // change state of LED}17.KEIL C语言与汇编语言的混合编程方法C语言中加入汇编语言模块的方法:例子:void func(){C语言代码……#pragma asmMOV R6,#23DELAY2: MOV R7,#191DELAY1: DJNZ R7,DELAY1DJNZ R6,DELAY2RET#pragma endasmC语言代码……}汇编部分需要用#pragma asm和#pragma endasm包起来18.KEIL C混合编程中的错误与解决方法1)Keil提示“asm/endasm”出错的解决方法如果只是像1中那样直接加入汇编代码的话,编译将会报错,错误如下:compiling sendata.c...sendata.c(81): error C272: 'asm/endasm' requires src-control to be active sendata.c(87): error C272: 'asm/endasm' requires src-control to be active Target not created解决方法如下:首先project workspace窗口右键单击包含有汇编部分的c语言文件名,然后在如上图所示的菜单中选择带有红色方框的选项在弹出的对话框中,将上图中红色方框选中的两项打上勾(默认的情况下,前面的勾是灰色的,要让这两项前的勾变为黑色的),点击确定。
如何在KEIL中编写模块化的C程序
如何在KEIL中编写模块化的C程序
一、概述
KEIL是一个用于嵌入式微控制器的开发环境,他可以支持C语言的开发。
KEIL的C语言编程可以分为模块化编程和非模块化编程,通过模块化编程可以有效的提高程序的可读性和可维护性,本文就KEIL中模块化的C程序的编写做一些简单的介绍。
二、KEIL中模块化C程序的编写
1、准备C文件和头文件
在项目编译之前,我们首先需要准备C文件和头文件,C文件用来定义数据和函数,头文件是将C文件中的函数包装起来,比如把功能定义在一个或多个函数当中,头文件通过#include语句将这些函数导入到当前文件中。
2、编写C文件
在KEIL中,我们需要使用#inclue语句将所有的头文件导入,并将C 文件中的函数声明在头文件中,然后再编写C文件,在C文件中,我们可以定义一些全局变量,函数,宏定义等,然后为每个函数分别编写相应的程序代码,在编写完成之后,我们可以调用这些函数来实现程序的功能,例如:
#include "myheader.h"
int global_var;
void functionA(void)
//functionA code
void functionB(void)
//functionB code
void main(void)
functionA(;
//other code
functionB(;
//other code
3、编译程序
当我们准备好所有的C文件和头文件之后,我们就可以开始编译程序了,KEIL提供了专业的编译器,可以把源代码编译成可执行的可移植二进制文件。
keil C的操作
3.1 Keil C软件的操作在前面我们介绍了Keil C软件,那么怎样操作这一软件呢?下面我们以任务2为例介绍操作步骤。
Keil C51 软件是众多单片机应用开发的优秀软件之一,它集编辑,编译,仿真于一体,支持汇编,PLM语言和 C 语言的程序设计,界面友好,易学易用。
下面介绍Keil C51 软件的使用方法进入 Keil C51 后,屏幕如下图所示。
几秒钟后出现编辑界图3.1 启动Keil C51 时的屏幕图3.2 进入Keil C51 后的编辑界面简单程序的调试学习程序设计语言、学习某种程序软件,最好的方法是直接操作实践。
下面通过简单的编程、调试,引导大家学习Keil C51 软件的基本使用方法和基本的调试技巧。
1)建立一个新工程单击Project 菜单,在弹出的下拉菜单中选中New Project 选项图3.3 新建一个项目2)然后选择你要保存的路径,输入工程文件的名字,比如保存到C51 目录里,工程文件的名字为C51。
如下图3.4所示,然后点击保存.图3.4 保存一个项目3)这时会弹出一个对话框,要求你选择单片机的型号,你可以根据你使用的单片机来选择,keil c51 几乎支持所有的51 核的单片机,我这里还是以大家用的比较多的Atmel 的89C51 来说明,如下图所示,选择89C51 之后,右边栏是对这个单片机的基本的说明,然后点击确定.图3.5 选择一个器件4)完成上一步骤后,屏幕如下图3.6所示图3.6 项目建立完毕到现在为止,我们还没有编写一句程序,下面开始编写我们的第一个程序。
5)在下图中,单击“File”菜单,再在下拉菜单中单击“New”选项图3.7 新建一个文件新建文件后屏幕如下图3.8所示图3.8 新建一个文件后的界面此时光标在编辑窗口里闪烁,这时可以键入用户的应用程序了,但笔者建议首先保存该空白的文件,单击菜单上的“File”,在下拉菜单中选中“Save As”选项单击,屏幕如下图所示,在“文件名”栏右侧的编辑框中,键入欲使用的文件名,同时,必须键入正确的扩展名。
keil .c .h 用法
keil .c .h 用法Keil是一款非常流行的集成开发环境(IDE),被广泛地应用于嵌入式系统的软件开发。
本文将介绍Keil中C语言和C标准库的使用方法,以及Keil的常用头文件。
一、Keil中的C语言在Keil中编写C语言程序,需要新建一个C文件,并添加到工程中。
然后在文件中编写C语言代码,如下所示:```c#include <stdio.h>从代码所示,我们可以看出Keil能够完全支持C语言标准库,包括stdio.h、stdlib.h、string.h等标准头文件中的所有函数和宏定义。
Keil中的C标准库是指ANSI C Standard Library,它提供了大量的函数和宏,支持所有C语言标准库中的功能。
下面是几个常用的函数和宏:1. `printf`函数`printf`函数是用于格式化输出的函数,它可以将格式化字符串和参数输出到标准输出流(stdout)。
该函数的语法格式如下:```cint printf(const char *format, ...);````format`是一个占位符字符串,用于指定输出的格式,如`%d`表示输出一个十进制整数,`%s`表示输出一个字符串。
`...`表示可选参数列表,可以是任意数量和类型的参数。
3. `malloc`和`free`函数`malloc`函数用于动态分配内存,`free`函数用于释放动态分配的内存。
它们的语法格式如下:`size`是要分配的字节数,`ptr`是要释放的内存块的指针。
4. `assert`宏`assert`宏用于在代码中添加断言,用于验证程序的假设,并在断言失败时终止程序运行。
它的语法格式如下:`expression`是要断言的表达式。
三、Keil中的常用头文件Keil中的头文件可以用于声明函数原型、定义常量、定义结构体和枚举类型、定义宏等。
下面是一些常用的头文件:1. `stdio.h``stdio.h`是标准输入输出头文件,包含了输入输出函数的定义,如`printf`、`scanf`、`puts`等。
02-Keil C单片机程序设计教学课件
包含到库中, 共享-
新的快
名称 4
firstplg _] firstuvopt
卿 firstuvproj
_] first_uvopt.bak
〕first_uvprqj.bak
1/
Y修改日期
▼|» II捜索…了
□O
冒 11.
察
2 C\Users\Andy\Desktop\ [Realplay]浙软• 4 0\Kei^51\Examples\Hello^ello.uvproj 5D:\Keil\C51\Eiample$\Me8sure',Mea$ure.UVi 6 D:\Keif\C51伽Tiny心mp 厨血 IfWr砒(.UV2 Z D:\KeM51\Eiamples\BhnmBlin 切 UV2
te an empty document 一
'
口 〔Tg
finclude <reg51.h> fInclude <stdio.h>
一2.输入代码
▼X
1.新建文件
02 ^include <intrins.b> #define uint
03 unsigned Inc #define uchar unsigned
Database: |Generic CPU Data Base
Vendor Atmel
Device AT89C51
Toolset C51
□ □ □ □ □ □ □ □ □ □ □ □ □
n
, L
AT83C5135
AT8X5136 AT83FR5114 AT85C51SND3 AT87F51 AT87F51RC AT87F52 AT87F55WD AT89C1051 AT89C1051U AT89C2051 AT89C4051
KeilC编程教程
KeilC编程教程原创翻译,转载注明作者:小楼听雨来源:/Keil C 编程教程:引言引言用c语言为微控制器编程正在变的越来越普通,通常用汇编建立一个应用比用c语言要难的多,因此掌握嵌入式c编程是非常重要的。
由于我们使用Keil C51编译器,也常常称之为Keil C。
关键字Keil C 编译器添加的一些关键字:_at_ far sbitalien idata sfrbdata interrupt sfr16bit large smallcode pdata _task_compact _priority_ usingdata reentrant xdatadata/idata:描述: 变量将被存储在控制器内部ram中。
example:CODE:unsigned char data x;//orunsigned char idata y;bdata:描述:变量被存储在可位寻址的内部ram中。
CODE:unsigned char bdata x;//变量x的每一位可按以下的方式存取x ^1=1;//设置x的第一位x ^0=0;//清除x的第零位xdata:描述: 变量将被存储在控制器外部ram中。
example:CODE:unsigned char xdata x;code:描述:这个关键字是用来将常量存储在rom中。
假设你有一个大的字符串,而且这个字符串在程序中不会再被改变,为这个字符串浪费ram是很愚蠢的事,因此我们要像下面的例子一样运用code关键字。
example:CODE:unsigned char code str="this is a constant string";pdata:描述:这个关键字将会使变量存储在分页寻址ram中,它运用不是很频繁。
example:CODE:unsigned char pdata x;_at_:描述:用来将变量存储在ram的指定位置。
C51单片机C语言程序100例-Keil
C51单片机C语言程序100例-Keil目录目录1函数的使用和熟悉********************************/.4实例3:用单片机控制第一个灯亮.4实例4:用单片机控制一个灯闪烁:认识单片机的工作频率.4实例5:将P1口状态分别送入P0、P2、P3口:认识I/O 口的引脚功能5实例6:使用P3口流水点亮8位LED.5实例7:通过对P3口地址的操作流水点亮8位LED.6实例8:用不同数据类型控制灯闪烁时间.7实例9:用P0口、P1口分别显示加法和减法运算结果.8实例10:用P0、P1口显示乘法运算结果9实例11:用P1、P0口显示除法运算结果9实例12:用自增运算控制P0口8位LED流水花样10实例13:用P0口显示逻辑“与“运算结果.10实例14:用P0口显示条件运算结果.11实例15:用P0口显示按位“异或“运算结果.11实例16:用P0显示左移运算结果.11实例17:“万能逻辑电路“实验.11实例18:用右移运算流水点亮P1口8位LED.12实例19:用if语句控制P0口8位LED的流水方向13实例20:用swtich语句的控制P0口8位LED 的点亮状态13实例21:用for语句控制蜂鸣器鸣笛次数14实例22:用while语句控制LED.16实例23:用do-while语句控制P0口8位LED流水点亮16实例24:用字符型数组控制P0口8位LED流水点亮17实例25:用P0口显示字符串常量.18实例26:用P0口显示指针运算结果19实例27:用指针数组控制P0口8位LED流水点亮19实例28:用数组的指针控制P0口8位LED流水点亮20实例29:用P0、P1口显示整型函数返回值21实例30:用有参函数控制P0口8位LED流水速度22实例31:用数组作函数参数控制流水花样.23实例32:用指针作函数参数控制P0口8位LED流水点亮23实例33:用函数型指针控制P1口灯花样.25实例34:用指针数组作为函数的参数显示多个字符串.26实例35:字符函数ctype.h应用举例.27实例36:内部函数intrins.h 应用举例.27实例37:标准函数stdlib.h应用举例.28实例38:字符串函数string.h应用举例29实例39:宏定义应用举例2291/192实例40:宏定义应用举例230实例41:宏定义应用举例330中断、定时器************************************************.31实例42:用定时器T0查询方式P2口8位控制LED闪烁31实例43:用定时器T1查询方式控制单片机发出1KHz音频.31实例44:将计数器T0计数的结果送P1口8位LED显示32实例45:用定时器T0的中断控制1位LED闪烁.33实例46:用定时器T0的中断实现长时间定时.34实例47:用定时器T1中断控制两个LED以不同周期闪烁.34实例48:用计数器T1的中断控制蜂鸣器发出1KHz音频.36实例49:用定时器T0的中断实现“渴望“主题曲的播放.36实例50-1:输出50个矩形脉冲.39实例50-2:计数器T0统计外部脉冲数.40实例51-2:定时器T0的模式2测量正脉冲宽度.40实例52:用定时器T0控制输出高低宽度不同的矩形波.41实例53:用外中断0的中断方式进行数据采集.42实例54-1:输出负脉宽为200微秒的方波.43实例54-2:测量负脉冲宽度.43实例55:方式0控制流水灯循环点亮.44实例56-1:数据发送程序.45实例56-2:数据接收程序.47实例57-1:数据发送程序.47实例57-2:数据接收程序.49实例58:单片机向PC发送数据50实例59:单片机接收PC发出的数据51*********************************数码管显示.52实例60:用LED数码显示数字552实例61:用LED数码显示器循环显示数字0~952实例62:用数码管慢速动态扫描显示数字“1234“.53实例63:用LED数码显示器伪静态显示数字1234.54实例64:用数码管显示动态检测结果.54实例65:数码秒表设计.56实例66:数码时钟设计.58实例67:用LED数码管显示计数器T0的计数值.62实例68:静态显示数字“59”.63*****************************键盘控制2/192**************************************************** */.63实例69:无软件消抖的独立式键盘输入实验.64实例70:软件消抖的独立式键盘输入实验.64实例71:CPU控制的独立式键盘扫描实验.65实例72:定时器中断控制的独立式键盘扫描实验.68实例73:独立式键盘控制的4级变速流水灯.71实例74:独立式键盘的按键功能扩展:“以一当四“.73实例75:独立式键盘调时的数码时钟实验.75实例76:独立式键盘控制步进电机实验.79实例77:矩阵式键盘按键值的数码管显示实验.82//实例78:矩阵式键盘按键音85实例79:简易电子琴.86实例80:矩阵式键盘实现的电子密码锁.92************************************************** ************************液晶显示LCD*********液晶显示LCD*****液晶显示LCD*************************************************** *********************/.95实例81:用LCD显示字符A96实例82:用LCD循环右移显示“WelcometoChina“.99实例83:用LCD显示适时检测结果102实例84:液晶时钟设计.106******************************************一些芯片的使用*****24c02DS18B20X5045ADC0832DAC0832DS1302红外遥控**********************************************/112实例85:将数据“0x0f“写入AT24C02再读出送P1口显示112实例86:将按键次数写入AT24C02,再读出并用1602LCD显示.117实例87:对I2C总线上挂接多个AT24C02的读写操作.124实例88:基于AT24C02的多机通信读取程序129实例88:基于AT24C02的多机通信写入程序133实例90:DS18B20温度检测及其液晶显示.144实例91:将数据“0xaa“写入X5045再读出送P1口显示153实例92:将流水灯控制码写入X5045并读出送P1口显示157实例93:对SPI总线上挂接多个X5045的读写操作161实例94:基于ADC0832的数字电压表165实例95:用DAC0832产生锯齿波电压171实例96:用P1口显示红外遥控器的按键值.171实例97:用红外遥控器控制继电器.174实例98:基于DS1302的日历时钟177实例99:单片机数据发送程序.185实例100:电机转速表设计.186模拟霍尔脉冲1923/192/*************************************************** *********函数的使用和熟悉******************************************************* ********///实例3:用单片机控制第一个灯亮#include//包含51单片机寄存器定义的头文件voidmain(void){P1=0xfe;//P1=11111110B,即P1.0输出低电平}//4//实例4:用单片机控制一个灯闪烁:认识单片机的工作频率#include//包含单片机寄存器的头文件/****************************************函数功能:延时一段时间*****************************************/voiddelay(void)/ /两个void意思分别为无需返回值,没有参数传递{unsignedinti;//定义无符号整数,最大取值范围65535for(i=0;i<20000;i++)//做20000次空循环;//什么也不做,等待一个机器周期}/*************************************************** ****函数功能:主函数(C语言规定必须有也只能有1个主函数)******************************************************* */voidmain(void){while(1)//无限循环{P1=0xfe;//P1=11111110B,P1.0输出低电平delay();//延时一段时间P1=0xff;//P1=11111111B,P1.0输出高电平delay();//延时一段时间}}4/192//5I/O//实例5:将#includeP1口状态分别送入P0、P2、P3口:认识I/O口的引脚功能//包含单片机寄存器的头文件/****************************************************** *函数功能:主函数(C语言规定必须有也只能有1个主函数)******************************************************* */voidmain(void){while(1)//无限循环{P1=0xff;//P1=11111111B,熄灭LEDP0=P1;//将P1口状态送入P0口P2=P1;//将P1口状态送入P2口P3=P1;//将P1口状态送入P3口}}//实例6:使用P3口流水点亮8位LED#include//包含单片机寄存器的头文件/****************************************函数功能:延时一段时间*****************************************/voiddelay(void){ unsignedchari,j;for(i=0;i<250;i++)for(j=0;j<250;j++);}/********** *********************************************函数功能:主函数******************************************************* */voidmain(void){5/192while(1){P3=0xfe;delay();P3=0xfd;delay();P3=0xfb;delay();P3=0xf7;delay(); P3=0xef;//第一个灯亮//调用延时函数//第二个灯亮//调用延时函数//第三个灯亮//调用延时函数//第四个灯亮//调用延时函数//第五个灯亮delay();//调用延时函数P3=0xdf;delay();P3=0xbf;//第六个灯亮//调用延时函数//第七个灯亮delay();//调用延时函数P3=0x7f;//第八个灯亮}}delay();//调用延时函数//实例7:通过对P3口地址的操作流水点亮8位LED#include//包含单片机寄存器的头文件sfrx=0xb0;//P3口在存储器中的地址是b0H,通过sfr可定义8051内核单片机//的所有内部8位特殊功能寄存器,对地址x的操作也就是对P1口的操作/****************************************函数功能:延时一段时间*****************************************/voiddelay(void){ unsignedchari,j;for(i=0;i<250;i++)for(j=0;j<250;j++);//利用循环等待若干机器周期,从而延时一段时间}/*****************************************函数功能:主函数6/192******************************************/voidmain( void){while(1){x=0xfe;//第一个灯亮delay();//调用延时函数x=0xfd;//第二个灯亮delay();//调用延时函数x=0xfb;//第三个灯亮delay();//调用延时函数x=0xf7;//第四个灯亮delay();//调用延时函数x=0xef;//第五个灯亮delay();//调用延时函数x=0xdf;//第六个灯亮delay();//调用延时函数x=0xbf;//第七个灯亮delay();//调用延时函数x=0x7f;//第八个灯亮delay();//调用延时函数}}//实例8:用不同数据类型控制灯闪烁时间#include//包含单片机寄存器的头文件/******************************************************函数功能:用整形数据延时一段时间******************************************************/ voidint_delay(void)//延时一段较长的时间{unsignedintm;//定义无符号整形变量,双字节数据,值域为0~65535for(m=0;m<36000;m++);//空操作}/*************************************************** ***函数功能:用字符型数据延时一段时间******************************************************/ 7/192voidchar_delay(void)//延时一段较短的时间{unsignedchari,j;//定义无符号字符型变量,单字节数据,值域0~255for(i=0;i<200;i++)for(j=0;j<180;j++);//空操作}/*************************************************** ***函数功能:主函数******************************************************/ voidmain(void){unsignedchari;while(1){for(i=0;i<3;i++){P1=0xfe;// P1.0口的灯点亮int_delay();//延时一段较长的时间P1=0xff;//熄灭int_delay();//延时一段较长的时间}for(i=0;i<3;i++){P1=0xef;//P1.4口的灯点亮char_delay();//延时一段较长的时间P1=0xff;//熄灭char_delay();//延时一段较长的时间}}}//实例9:用P0口、P1#includevoidmain(void){unsignedcharm,n;口分别显示加法和减法运算结果m=43;//即十进制数2x16+11=438/192n=60;P1=m+n;//即十进制数3x16+12=60//P1=103=01100111B,结果P1.3、P1.4、P1.7口的灯被点亮}P0=n-m;//P0=17=00010001B,结果P0.0、P0.4的灯被熄灭//实例10:用P0、P1口显示乘法运算结果#include//包含单片机寄存器的头文件voidmain(void){unsignedcharm,n;unsignedints;m=64;n=71;s=m*n;/ /s=64*71=4544,需要16位二进制数表示,高8位送P1口,低8位送P0口//由于4544=17*256+192=H3*16*16*16+H2*16*16+H1*16+H0//两边同除以256,可得17+192/256=H3*16+H2+H1*16+H0)/256//因此,高8位16进制数H3*16+H2必然等于17,即4544除以256的商//低8位16进制数H1*16+H0必然等于192,即4544除以256的余数P1=s/256;//高。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第一章KEIL 编译器的安装KEIL(/home.html)编译器评估版本把目标代码长度限制在2KB以内,可以从网上下载使用。
而8051编译器正式版本由1张CD、1张有序列号码的1.44MB软盘和连接打印机端口的硬件锁定键组成。
利用评估版本(Evaluation)对源程序通过了便宜,也生成了HEX文件,但就是不能正常运行。
这是为什么?使用者可以随时从网上下载KEIL评估版本进行安装,但是编译长度小于2KB的目标代码,并且代码的起始(Start)地址自动设定为4000h,所以硬件组成也应予以支持。
免费获得的评估版还有别的限制,为了把所生成HEX文件下载到地址不是4000h的ROM中,就要利用hex2bin.exe实用程序把hex变成bin后下载到ROM,只有这样才能正常运行。
hex2bin.exe程序可以从网上下载。
下载KEIL C51安装程序后,双击Setup.exe文件约几秒后,在安装向导窗口上可以选择安装、更新、搬移程序三个选项,如图1 – 2 所示。
图1 – 1 安装项目的选择在默认(Install Support for Additional Microcontroller Architectures) 的情况下,点击Next>进入图1 – 2 所示画面。
Eval Version (Evaluation Version) 评估版本;Full Version 正式版本;Quit 退出安装;在安装过程中,键入写在软盘上的序列号码,选择驱动器路径,把软盘插入驱动器继续安装。
这时,在程序设置信息项目中出现“Last Name”项目,必须键入才能激活“Next”按钮,比如自己的“姓”或其他。
在安装盘上有序列号码和与安装有关的重要信息,因此有必要把安装盘进行备份以保护重要的信息。
若没有序列号的情况下请选择Eval Version (Evaluation Version) 评估版本进行安装。
图1 – 2 正式版与评估版的选择如果Keil uVision2的KEIL编译器安装结束,则会生成下列路径和图标:以最上层路径为C:\KEIL为假设予以罗列。
安装结束后若想运行,则双击屏幕上的Keil uVision2集成运行快捷按钮。
在Windows开始--> 程序菜单上也会发现同样的快捷按钮。
表1 – 1 文件夹的结构路径说明C51\ASM 汇编SFR(Special Function Register)定义和源程序样本文件C51\BIN 编译器的执行文件所位置C51\EXAMPLES 应用程序视图文件C51\RTX51 实时操作系统Full文件,255个任务C51\RTX_TINY 实时操作系统Tiny文件,16个任务C51\INC C语言中与8051有关的所有包含文件都在此处C51\LIB 库、开始代码、输入/输出源程序C51\MON51 监控目标硬件系统时所使用的HEX代码生成文件UV2 编译器集成执行文件KEIL编译器C51以ANSI(American National Standard Institute)规格为标准,所以使用C 语言的开发人员用ANSI编写程序就可以(使用Classic C语言也可以)。
第二章Keil uVision2快速入门为了能让使用者快速入门,先简单介绍8051。
8051单片机是一个具有40个引脚的长方形芯片,其中,有5V直流电源Vcc(因为内部有很多逻辑电路,应使用波纹系数小的直流电源)和电源地GND引脚。
还有至少保持2个机器周期(一个机器周期=12个振荡周期)为高电就复位的RESET引脚。
端口P0是由开漏(用作I/O口时需要外部接上拉电阻)的驱动器构成的8位双向I/O口,用作A0~A7,D0~D7;端口1是有内部上拉电阻的准双向I/O口;端口2是有内部上拉电阻的准双向I/O口,用作A8~A15;端口3是有内部上拉电阻的准双向I/O口,兼有串行通讯、外部中断、定时器、读/写的特殊功能;X1是振荡放大器的反向输入引脚,X2是反向输出引脚,因此,使用晶体时把晶振并联连接到X1和X2上,使用外部振荡器时只连接X1。
ALE/PROG(Address Latch Enable Output/Program Pulse Input)引脚的ALE,在访问外部存储器时用来锁存低8位地址,而PROG在编程EPROM时用来进行脉冲输入。
PSEN(Program Strobe Enable)引脚信号作为访问外部程序存储器的读选通,每个机器周期PSEN被激活2次,在ALE的下降沿将端口0的地址锁存到外部锁存器。
EA/Vpp(Exteral Access Enable)引脚连接到GND,则0~FFFFH地址都访问外部程序存储器;连接到Vcc,则访问内部程序存储趋。
Vpp是对8751编程电压输入端子,其电压为12.75~21V,具体值随不同型号芯片而有所不同。
双击Keil uVision2集成执行快捷按钮,将弹出如图2 – 1 所示的窗口。
这是一个初始开发集成窗口。
如果没有做过任何项目,则窗口上什么也没有。
窗口的上端有10个下拉菜单。
C51在管理程序时,采用所谓的项目(Project)文件来进行管理。
项目把程序的环境甚至和编图2 – 1 Keil uVision2的执行辑有关的全部信息都保存着,因此使用者可以把多个程序以项目为单位使用C51就可以了。
由于C51 8051 KEIL编译器变成集成环境,提供即使不知道汇编或不详细知道8051也能编写应用程序的环境。
这一章的内容可以使工程人员快速并正确地熟悉编译器环境。
执行集成环境C51,如图2 – 1所示,出现编辑、项目、输出等3个大窗口和File,Edit,View,Project,Debug,Flash,Peripherals,Tools,SVCS,Window,Help等11个下拉菜单。
为了开始新的项目,选择“Project New Project ”选项后,出现如图2 – 2 所示,然后选择源程序所在路径键入项目的名字并单击“保存”按钮。
项目的名字会立即出现在集成环境的左上端。
这个项目的名字最后为HEX文件的名字。
因此,项目的名字最好不超过8个英文字母,并且尽量不采用中文为好。
在这里采用的项目名字为“First_Project”。
图2 – 2建立一个新工程接着选择用8051开发的目标硬件系统的MPU选项,如图2 – 3 所示。
这个选项的是为了反映各个不同厂家生产的具有不同性能的8051而设计的,因此,只要正确选择自己要开发的目标硬件系统的MPU就可以了。
图2 – 3目标硬件系统的CPU的选择接着要进行“Option for Target”的设定,以修改跟编译器有关的信息和跟目标系统有关的事项。
如图2 –4 中,第一个选项“Target”设定目标系统的存储器、输出文件以及与源程序文件有关的事项。
在菜单栏中,选择“Project/Opintion for Target…”或者单击工具栏中的“Option for Target”快捷按钮就可以开始设定。
在这里,要输入系统的工作频率、ROM与RAM的开始地址和大小以及存储模式。
首先,正确输入目标系统的晶振的频率值后选择存储模式。
图2 – 4 Option for Target为了让8051的机器语言代码下载到ROM,需要产生HEX代码。
图2 – 5 的Option选项用来设定HEN文件的名字和要存放的文件夹(Select Folder for Object…)。
通常编译、调试到下载ROM需要进行多次编译才能完成。
如果不选择“Creat HEX File”,编译后不将产生HEX代码(即使不发生错误)。
这样可以避免不必要地反复写硬盘以保护硬盘的磁道和扇区。
图2 – 5 中右上端的“Name of Executable”表示HEX代码文件的名字,通常和项目文件同名,也可以指定别的名字。
编译完成后生成HEX代码文件,并存放在项目所在路径中。
因为8051的知识产权是Intel公司的,其命令语的处理也跟随Intel的结构,所以KEIL只支持Intel HEX文件的形式。
另外,为了在源代码层次上进行调试,最好选择“Debug Information”。
为了便于编译程序,最好选择“Browser Information”。
图2 – 5 Option for Target 输出文件设定在使用监控程序(Monitor)与目标硬件系统和KEIL编译器集成环境接口,能够监控变量的值和函数的执行。
监控程序把监控程序ROM移植到目标硬件系统后运行。
为了把监控程序和目标硬件系统接口,需要制作合适的硬件。
监控程序的监控原理是,把监控程序装入ROM区,把应用程序代码装入RAM以后,执行监控程序,则监控程序,调用应用程序执行。
这样,在RAM区域里代码存储区和数据存储区共存。
所以在使用监控程序调试应用程序的时候,需要在KEIL软件中修改以下参数,如图2 –6 所示将原来的“CSEG AT 0 ”修改成“CSEG AT 08000h”(不包括双引号)。
如果使用烧写器直接调试程序,则使用默认的“CSEG AT 0 ”即可。
图2 – 6 Startup.A51 文件修改同时将Option for Target 中BL51 Locate中的Code代码段的设定修改成如图2 – 7 所示图2 – 7 Option for Target 代码段的设定下面是可以驱动用于调试的仿真器和监控器的环境设定选项卡“Option for Target/Debug”,如图2 –8 所示。
主要有2个单选项:左侧有仅用软件来仿真8051的软件模拟仿真器单选项,右侧有与目标硬件系统边传送信息边进行调试的“KEIL Monitor –51 Driver”和“Triscend E5 Driver”单选项。
由于KEIL 8051集成开发环境综合了调试(Debug)和Scope功能,所以称之为dScope。
监控器的功能是把监控器的ROM移植到目标硬件系统,用RS – 232连接PC机和目标硬件系统,PC机的KEIL dScope和目标硬件系统互相传送信息。
可以下载代码,也可以查看目标硬件系统的变量。
图2 – 8 Option for Target/Debug第三章应用程序的调试经过上面的软件设置,下面将介绍一下,如何在KEIL软件中进行应用程序的调试、编译和连接。
首先单击“File”菜单,在下拉的菜单中单击“New”选项,屏幕图3 –1 所示,此时可以看到编辑窗口的标题栏是空的,而光标在编辑窗口闪烁。
这个时候就可以键入应用程序了。
图3 – 1 含有空白的编辑窗口的屏幕单击菜单条上的“File”菜单,在下拉菜单中选中“Save As”选项单击,屏幕如图3 – 2 所示。