单片机程序设计实践教程_第05章_Keil_C51程序设计基础
单片机Keil C51编程入门(49页)
平凡单片机工作室 Copyright 2003 pingfan's mcustudio All rights Reserved 作者:周坚 dddl.c 单灯点亮程序 *************************************************/
本书共分六章,每章一个专题,以一些待完成的任务为中心,围绕该任务介绍 C 语言 的一些知识,每一个任务都是可以独立完成的,每完成一个任务,都能掌握一定的知识,等 到所有的任务都完成后,即可以完成 C 语言的入门工作。
第 1 章 C 语言概述及其开发环境的建立
学习一种编程语言,最重要的是建立一个练习环境,边学边练才能学好。Keil 软件是目 前最流行开发 80C51 系列单片机的软件,Keil 提供了包括 C 编译器、宏汇编、连接器、库 管理和一个功能强大的仿真调试器等在内的完整开发方案,通过一个集成开发环境 (µVision)将这些部份组合在一起。
如果 P1.0 是高电平,取反后,P1.0 就是低电平,这条指令被反复地执行,接在 P1.0 上灯就
会不断“亮”、“灭”。
该条指令会被反复执行的关键就在于 main 中的第一行程序:for(;;),这里不对此作详细 的介绍,读者暂时只要知道,这行程序连同其后的一对大括号“{}”构成了一个无限循环语
《C51单片机程序设计》教学大纲
《C51单片机程序设计》课程教学大纲课程编码:AL042330课程性质:专业选修课适用专业:电气工程及其自动化、自动化学时学分:32学时2学分(其中讲课16学时,实验16学时)所需先修课:大学物理、电路原理、模拟电子技术、数字电子技术、计算机语言(C)、单片机原理及应用一、课程说明1.课程简介本课程是电气工程及其自动化专业和自动化的一门任意选修课,主要讲授如何利用C51进行编程设计,主要针对基于51单片机的测控系统的硬件软件设计与开发技术进行深入学习。
学习液晶显示、串口通信、1-wire、SPI、I2C等常用接口模块在单片机测控系统的扩展技术。
本课程以大学物理、电路原理、模拟电子技术、数字电子技术、计算机语言(C)、单片机原理及应用等课程为先修基础课,主要为后期的计算机控制系统、单片机原理及应用课程设计、单片机原理及应用课程实习、毕业设计等课程打下坚实的基础。
对于单片机原理及应用学时偏少的情况,可在本门课程中将串行口通信,串行接口的扩展与应用作为重点内容进行教学。
本课程以MCS-51单片机为典型机讲述。
2.教学目标要求本课程主要采用项目教学法,以工程实训的形式使学生掌握MCS-51单片机应用系统的硬、软件开发方法。
课程开设的目的主要是让学生掌握利用高级语言C51进行单片机测控系统的程序设计与开发技术,能熟练运用于实践设计。
结合专业能利用C51高级语言进行单片机应用系统软件硬件开发开发设计。
3.教学重点难点1)掌握C51高级语言编程技巧;2)掌握通用型液晶与单片机的接口,典型应用;3)掌握51单片机串行口的基本概念,常用的一对一,一对多的串行通信,从而学习通信网络的基本知识;4)熟练各种串行总线标准,常用接口芯片的功能及操作时序。
包括单总线18B20,I2C总线AT24C04,SPI总线等;5)掌握利用C51高级语言进行单片机应用系统的开发环境和开发流程。
4.学时分配表本课程的课内教学学时为32学时,其中课堂理论16学时,实验16学时。
单片机C51语言及程序设计
贰
壹
叁
C51编译器在头文件“REG51.H”中定义了全部sfr/sfr16和sbit变量。 用一条预处理命令#include <REG51.H>把这个头文件包含到C51程序中,无需重新定义即可直接使用它们的名称。
应用举例:
片内数据存储器,片外数据存储器和程序存储器。
通常下划线开头的标识符是编译系统专用的,因此在编写C语言源程序时一般不使用以下划线开头的标识符,而将下划线用作分段符。C51编译器规定标识符最长可达255个字符,但只有前32个字符在编译时有效,因此标识符的长度一般不要超过32个字符。
关键字是一种已被系统使用过的具有特定含义的标识符。用户不得再用关键字给变量等命名。C语言关键字较少,ANSI C标准一共规定了32个关键字,见表
变量名具有字母大小写的敏感性,如SUM和sum代表不同的变量。
【存储类别】 数据类型 【存储器类型】 变量名
变量名不得使用标准C语言和C51语言的关键字。
unsigned char data system_status = 0;
//定义system_status为无符号字符型自动变量,该变量位于data区中且初值为0。
sfr或sfr16型 51MCU中有21个SFR,如何定义与这些单元相关的变量?
例如,sfr P0 = 0x80; //定义P0口地址80H sfr PCON = 0x87; //定义PCON地址87H sfr16 DPTR=0x82; //定义DPTR的低端地址82H
单精度浮点数
for
程序语句
构成for循环结构
goto
程序语句
构成goto转移结构
if
程序语句
单片机C51程序设计基础-2012
bdata idata xdata pdata
BDATA IDATA XDATA PDATA
code
CODE
程序存储区,内容只读,使用DPTR寻址。
一、C51变量定义格式
C51: [存储属性] 数据类型 [存储类型] 变量名表
2)存储类型—确定变量存储区 显式声明: auto unsigned char data x;
3. 循环结构及其流程图
(1)while型循环结构 (当量型)
(2)do while型循环结构 (直到型)
三、C51流程控制语句语言
二、选择语句
选择语句有三种:if语句、switch/case语句和条件表达式 If 语句 三种形式:1、 if (表达式) { 语句1;}//if 表达式true,执行 语句1 2、 if (表达式) { 语句1;} else { 语句2;} 3、 if(表达式1){ 语句1;}//级联选择 else if (表达式2){ 语句2;} else if (表达式3){ 语句3;} …… else {语句 n+1;} //所有表达式均不满足时
?:
= += -= *= /= %= &= ^= |= <<= >>= 最低 ,
自右向左
自右向左 自左向右
二、C51运算符、表达式及规则
9、运算符优先级和结合性 单目运算符高于双目运算符 算术运算符高于关系运算符 关系运算符高于逻辑运算符
* 尽可能加括号明确指定操作优先级
三、C51流程控制语句语言
(extern) (static) 固定地址。始终存在,若为多文件程序,仅在
所定义的模块文件可访问
一、C51变量定义格式
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语言文件名,然后在如上图所示的菜单中选择带有红色方框的选项在弹出的对话框中,将上图中红色方框选中的两项打上勾(默认的情况下,前面的勾是灰色的,要让这两项前的勾变为黑色的),点击确定。
No.5C51程序设计
– 指定存储区的指针
• 指定存储区的指针在指针的声明中经常包含一个 存储类型标识符指向一个确定的存储区。 • 例如: char data *str; int xdata *ptr; long code *tab;
• 指定存储区指针存放时不再像通用指针那样需 要保存存储类型,指向idata、data 、bdata 和pdata存储区的指针只需要一个字节存放, 而code和xdata指针也才需要两字节。从而减 少了指针长度,节省了存储空间。
– 如:sfr16 TL0=0x8A;
– 特殊功能寄存器中特定位的定义
• 在C51中可以利用关键字sbit定义可独立寻址访问 的位变量
• 对一般位变量的定义
– 当位变量位于内部RAM的可位寻址区(20H~2FH 单元)时,可以利用C51编译器提供的bdata存储器 类型进行访问 – 带有bdata类型的变量可以进行字节或位寻址,用 sbit指定bdata变量的相应位后就可以进行位寻址。
– 考虑存储器结构 – 正确使用片内外RAM、特殊功能寄存器 – 正确处理接口芯片收发数据 – 不需要具体组织和分配存储器资源 – 结构模块化,思路与思维相同 – 但要与单片机结构相关联,否则不能正确映射
• C程序:
• C51:
– – – –
自动完成存储单元分配(内定义) 可编制常见接口芯片通用驱动函数 可采用模块化设计应用程序 加快开发速度
var=XBYTE[0x8000]; 头文件内定义的函数 XBYTE[0x8000]=0x21;
P71
– 例如:unchared xdta xram[0x8000]_at_0x1000; //在外部RAM1000H开始定义了一个一维数组
单片机C51语言程序设计基础
3.1 C51程序的基本结构
• 单片机C51语言继承了C语言的特点,其程序结构 与一般C语言的程序结构没有差别。C51源程序文 件的扩展名为“.c”,如Test.c、Function.c等。 每个C51源程序中包含一个名为“main()”的主函 数,C51程序的执行总是从main()函数开始的。当 主函数中所有语句执行完毕,则程序执行结束。
•
•
• •
3.3 C51的标识符与关键字
• 标识符和关键字是一种编程语言最基本的组成部 分,C51语言同样支持自定义的标识符以及系统保 留的关键字。在进行C51程序设计时,需要了解标 识符和关键字的使用规则。
3.3.1 标识符
• 标识符常用来声明某个对象的名称,如变量和常量的声明、 数组和结构的声明、自定义函数的声明以及数据类型的声 明等。示例如下。 • int count; • void Function1(); • 在上面的例子中,count为整型变量的标识符,Function1 为自定义函数的标识符。 • 在C51语言中,标识符可以由字母、数字(0~9)和下划线 “_”组成,最多可支持32个字符。并且,C51标识符第一 个字符必须是字母或者下划线“_”。例如“ut1”、 “ch_1”等,都是正确的。而“5count”则是错误的标识 符。另外,C51的标识符区分大小写,例如“count1”和 “COUNT1”代表两个不同的标识符。
3.3.2 关键字
• 关键字是C51语言重要的组成部分,是C51编译器 已定义保留的专用特殊标识符,有时也称为保留 字。这些关键字通常有固定的名称和功能,如int、 float、if、for、do、while、case等。
3.4 C51的变量类型
• 数据类型是C51语言最基本的组成部分。在C51中, 每个变量在使用之前必须定义其数据类型。C51语 言中的数据类型分为基本数据类型和聚合数据类 型,这里首先介绍基本数据类型。
第5章单片机C51程序设计
字节地址
0
1
2
3
浮点数内容 SEEEEEEE EMMMMMMM MMMMMMMM MMMMMMMM 符号和阶码 尾数高位 尾数低位
14
字节地址
0
1
2
3
浮点数内容 SEEEEEEE EMMMMMMM MMMMMMMM MMMMMMMM 符号和阶码 尾数高位 符号位S:1表示负数,0表示正数。 尾数低位
data
bdata
idata
pdata xdata code
用Ri间接访问的片内扩展RAM或片外扩展RAM低 256B
用DPTR间接访问的片内扩展RAM或片外扩展RAM (64KB) 程序存储器ROM空间(64KB)
20
5.2.3 常量和变量
数据有常量和变量之分。
1.常量
常量就是在程序运行过程中其值不能被改变的量,可以为 字符,字符串,转义字符,十进制数或十六进制数(用0x打头 表示)、浮点数等直接常量,也可以定义符号型常量,定义方 式如下: 用宏定义语句定义常量,例如: #define PI 3.1415926 //定义PI为常量3.1415926
长整型
浮点型 位类型
特殊位类型 8位特殊功能寄存器型
16位特殊功能寄存器型Fra biblioteksbit sfr
sfr16
1位 8位
16位
0或1 0-255
0-65535
11
1、字符型char
长度为1个字节。默认为signed char。 “1”表示负数,补码表示,所能表示的数值范围是-128~+127。 对于unsigned char,其取值范围为0~255。也可以存放西文 字符,在计算机内部用ASCII码存放。
51单片机C语言程序设计-图文
/* 名称:8 只 LED 左右来回点亮 说明:程序利用循环移位函数_crol_和_cror_形成来回滚动的效果
*/ #include<reg51.h> #include<intrins.h> #define uchar unsigned char #define uint unsigned int //延时 void DelayMS(uint x) {
case 2: //东西向黄灯闪烁,绿灯关闭 DelayMS(300); YELLOW_A=~YELLOW_A;GREEN_A=1; if(++Flash_Count!=10) return; //闪烁 5 次 Flash_Count=0; Operation_Type=3; break;
case 3: //东西向红灯,南北向绿灯亮 RED_A=0;YELLOW_A=1;GREEN_A=1; RED_B=1;YELLOW_B=1;GREEN_B=0; DelayMS(2000); Operation_Type=4; break;
3 Ykcsh 呈献
0x00,0xff,0x00,0xff,0x00,0xff,0x00,0xff }; //延时 void DelayMS(uint x) {
uchar i; while(x--) {
for(i=0;i<120;i++); } } //主程序 void main() { uchar i; while(1) { //从数组中读取数据送至 P0 和 P2 口显示
uchar i; while(x--) {
for(i=0;i<120;i++); } } //主程序 void main() { uchar i; P2=0x01; while(1) {
C51单片机程序设计
2
第五章 C51程序设计基础
5.1 C程序设计的基本概念 • C语言是一种通用的计算机程序设计语言,在国际上十分
流行,它既可用来编写计算机的系统程序,也可用来编写 一般的应用程序。 • C5l是在5l系列单片机上使用的C语言。 • C51程序结构与一般C语言没有什么差别。一个C5l程序大 体上是一个函数定义的集合,在这个集合中仅有一个名为 main的函数(主函数)。主函数是程序的入口,主函数中 的所有语句执行完毕,则程序执行结束。 • C51中使用的编译器主要是Keil C5l。Keil C51完全支持C 的标准指令,并有很多用来优化805l指令结构的C的扩展 指令。
(2)浮点型常量可分为十进制和指数表示形式 。十进制由 数字和小数点组成,如:0.0,.25,5.789,0.13,5.0, 300.,-267.8230等均为合法的实数,整数或小数部分为 0,能省略但必须有小数点。指数形式由十进制数加阶码 标志“e”或“E”以及阶码(只能为整数,可以带符号) 组成。其一般形式为aEn(a为十进制数,n为十进制整数) 其值为a*10n,如:2.1E5 (等于2.1*105)。
3
5.1.1 主函数(C51的程序结构)
预处理命令 函数说明
功能函数1
#include<reg51.h> long funl(); float fun2(); fun1()
{
函数体
….
主函数
}
main()
{
函数体
……
}
功能函数2 fun2()
函数体
{ ……..
}
4
5.1.2 标识符和关键字
• 包括c语言ANSI C标准规定的32个关键字: Auto,break,case,char,const, continue,default,do,double,else, enum,extern,float,for,goto,if,int, long,register,return,short,signed, sizeof,static,struct,switch,typedef, union,unsigned,void,volatile,while
第5章 Keil C51-单片机原理与应用及C51程序设计(第4版)-谢维成-清华大学出版社
5.1 Keil C51简介 5.2 Keil uVision4 IDE的使用方法 5.3 Keil C51的调试技巧
3
第5章 Keil C51集成环境的使用
第5章 Keil C51集成环境的使用
一、 Keil µVision IDE界面
窗口标题栏 菜单栏 工具栏
项目管理器窗口 编辑窗口
命令窗口和 输出信息窗口
8
第5章 Keil C51集成环境的使用
(3) 选择好单片机芯片后,单击【确定】按钮,这时弹出如图5.4所 示的Copy Standard 8051 Startup Code to Project Folder and Add File to Project确认框,问是否把启动代码文件拷贝到项目文件夹并添加到项 目中。如果程序用C51语言编写要选择【是】,汇编语言编写选择 【否】,单击后,项目文件就创建好了。
12
第5章 Keil C51集成环境的使用
(4) 弹出如图所示的Add Files to Group 'SourceGroup1' 对话框。在对话框中选择需要添加的程序文件,单击Add按 钮,把所选文件添加到项目文件中。
注意:在该对话框中 文件类型默认为*.C, 如果是汇编程序,需 在文件类型选择框选 择*.a*才看得到,如 果文件添加得不对, 可在项目管理器的 Source Group1下面 选中对应的文件,用 右键菜单中的 Remove File命令把 它移出去。
第5章 Keil C51集成环境的使用
5.2.1 建立项目文件
uVision4采用项目方式管理,一个项目用一个文件夹存放, 建项目时要先建一文件夹,文件夹建好后,启动uVision4, 通过用Project菜单下的New uvision Project命令建立项目文 件,过程如下:
Keil C51基础教程
Keil C51开发系统基本知识1. 第一节系统概述Keil C51是美国Keil Software公司出品的51系列兼容单片机C语言软件开发系统,与汇编相比,C语言在功能上、结构性、可读性、可维护性上有明显的优势,因而易学易用。
用过汇编语言后再使用C来开发,体会更加深刻。
Keil C51软件提供丰富的库函数和功能强大的集成开发调试工具,全Windows界面。
另外重要的一点,只要看一下编译后生成的汇编代码,就能体会到Keil C51生成的目标代码效率非常之高,多数语句生成的汇编代码很紧凑,容易理解。
在开发大型软件时更能体现高级语言的优势。
下面详细介绍Keil C51开发系统各部分功能和使用。
2. 第二节Keil C51单片机软件开发系统的整体结构C51工具包的整体结构,如图(1)所示,其中uVision与Ishell分别是C51 for Windows和for Dos的集成开发环境(IDE),可以完成编辑、编译、连接、调试、仿真等整个开发流程。
开发人员可用IDE本身或其它编辑器编辑C或汇编源文件。
然后分别由C51及A51编译器编译生成目标文件(.OBJ)。
目标文件可由LIB51创建生成库文件,也可以与库文件一起经L51连接定位生成绝对目标文件(.ABS)。
ABS文件由OH51转换成标准的Hex文件,以供调试器dScope51或tScope51使用进行源代码级调试,也可由仿真器使用直接对目标板进行调试,也可以直接写入程序存贮器如EPROM中。
图(1) C51工具包整体结构图3. 第三节Keil C51工具包的安装1. 1. C51 for Dos在Windows下直接运行软件包中DOS\C51DOS.exe然后选择安装目录即可。
完毕后欲使系统正常工作须进行以下操作(设C:\C51为安装目录):修改Autoexec.bat,加入path=C:\C51\BinSet C51LIB=C:\C51\LIBSet C51INC=C:\C51\INC然后运行Autoexec.bat2. 2. C51 for Windows的安装及注意事项:在Windows下运行软件包中WIN\Setup.exe,最好选择安装目录与C51 for Dos相同,这样设置最简单(设安装于C:\C51目录下)。
第5章-MCS-51单片机C51程序设计
signed int 表 示 的 数 值 范 围 是 -2147483648~ +2147483647,字节中最高位表示数据的符号,0表示 正数,1表示负数。
unsigned long表示的数值范围是0~4294967295。
17:03
单片机原理与接口技术(第2版).李晓林.电子工业出版社
返回目录
17:03
单片机原理与接口技术(第2版).李晓林.电子工业出版社
返回目录
6
5.1 C51概述
使用具有C51编译扩展功能的C语言进行MCS-51单片机应用 系统的开发编程,简称C51编程。C51编程具有以下特点。
1) 可管理内部寄存器和存储器的分配,编程时,无需考虑 不同存储器的寻址和数据类型等细节问题;
单片机原理与接口技术(第2版).李晓林.电子工业出版社
返回目录
7
5.1 C51概述
C51编程和汇编语言编程过程一样。单片机C语言源程 序经过编辑、编译、连接后生成目标程序(.BIN和.HEX) 文件,然后运行即可。调试51单片机C语言程序可用Keil C51编译器。
注意,使用C51编程可以取代繁琐的汇编语言编程, 但仍需要了解MCS-51单片机的硬件结构。所以对于单片 机系统的开发应采用汇编语言与C51混合编程的方法更为 有效。
对C51编译器来说,short类型和int类型相 同,double类型和float类型相同。
17:03
单片机原理与接口技术(第2版).李晓林.电子工业出版社
返回目录
14
5.2.2 数据类型
----C51的数据类型
除此之外,为了更加有利地利用MCS-51的结构,C51
还增加了一些特殊的数据类型,包括bit、sbit、sfr、sfr16。 数据类型如表5-2所示。
单片机程序设计实践教程_第05章_Keil_C51程序设计基础
1
Keil C51程序设计基础 C51程序设计基础
单片机程序既可以用汇编语言也可以用C 单片机程序既可以用汇编语言也可以用C语言进行 编写,两者都可以在C51的环境下进行开发,这两者之间 编写,两者都可以在C51的环境下进行开发,这两者之间 既有区别也有联系。 C51是一种特殊的C编译器,它扬弃了C C51是一种特殊的C编译器,它扬弃了C语言的一些 不适合MCS-51单片机的特性,针对MCS-51单片机的特 不适合MCS-51单片机的特性,针对MCS-51单片机的特 性做了适应性保留,使其更适合对单片机底层硬件进行直 接控制。 汇编语言则是一种用文字助记符来表示机器指令的 符号语言,是最接近机器码的一种语言。其主要优点是占 用资源少、程序执行效率高。但是,不同的CPU其汇编语 用资源少、程序执行效率高。但是,不同的CPU其汇编语 言可能有所差异,所以不易相互之间进开发接口 )、C C语言是一种编译型程序设计语言,它兼顾了多种高级语言 的特点,并具备汇编语言的功能,可以实现结构更为复杂的单片机 系统功能。C 系统功能。C语言有功能丰富的库函数,运算速度快、编译效率高、 有良好的可移植性,而且可以直接实现对系统硬件的控制。 C语言是一种结构化程序设计语言,它支持当前程序设计中 广泛采用的由顶向下结构化程序设计技术。此外,C 广泛采用的由顶向下结构化程序设计技术。此外,C语言程序还具 有完善的模块程序结构,从而为软件开发中采用模块化程序设计方 法提供了有力的保障。 因此,使用C 因此,使用C语言进行程序设计已成为软件开发的一个主流。 用C语言来编写目标系统软件,会大大缩短开发周期,并且明显地 增加软件的可读性,便于对已编制好的程序进行改进和扩充,从而 研制出规模更大、性能更完备的系统。
C51单片机应用与C语言程序设计第五章 (2)
/
测试步骤
• 把左胡须按到3-pin转接头上,注意显示为:“右边胡须的状态:1 左边 胡须的状态:0”,如下图:
左胡须碰到
© 2008 Open-Tech. All rights reserved.
© 2008 Open-Tech. All rights reserved.
/
任务一 安装并测试机器人胡须
• 本任务是通过搭建简单电路的测试触须的作用和工作原理。要求学生能 学会触须导航的硬件搭建和简单电路测试。
• 要准备的元器件: 1、金属丝2根 2、平头M3×22盘头螺钉2个 3、13mm圆形立柱2个 4、M3尼龙垫圈2个 5、3-pin公-公接头2个 6、220Ω电阻2个 7、10kΩ电阻2个
/
任务三 机器人进入死区后的人工智能决策
• 例程EscapingCorners.c是怎样工作的
int型变量counter用来存储交替探测的次数。例程中,设定的交替探 测的最大值为4。int型变量old2、old3存储胡须旧的状态值。 程序赋counter初值为1,当机器人卡在墙角此值累计到4时, counter复位为1。old2和old3必须赋值以至于看起来好像两根胡须的其 中一根在程序开始之前被触动了。这些工作之所以必须做,是因为探测 墙角的程序总是对比交替触动的部分,或者P1_4state()==0,或者 P2_3state()==0。与之对应,old2和old3的值也相互不同。
任务2 通过胡须导航
本任务中将根据检测到的胡须是否被触动的信息对机器 人进行运动导航。在机器人行走过程中,如果有胡须被触动, 那就意味着碰到了什么。导航程序需要接受这些输入信息, 判断它的意义,调用一系列使机器人倒退、旋转朝不同方向 行走的动作子函数以避开障碍物。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
表5-1 1 的基本数据类型
10
5.2.1整型 5.2.1整型(int) 整型(int) 5.2.1.1整型常量 5.2.1.1整型常量
整型常量就是整常数。在C51中,使用的整常数有八进制、 整型常量就是整常数。在C51中,使用的整常数有八进制、 十六进制和十进制三种。 十进制整常数:十进制整常数没有前缀。其数码为0 1、十进制整常数:十进制整常数没有前缀。其数码为0~9。 八进制整常数:八进制整常数必须以0开头,即以0 2、八进制整常数:八进制整常数必须以0开头,即以0作为八进 制数的前缀。数码取值为0 制数的前缀。数码取值为0~7。八进制数通常是无符号数。 如以下各数是八进制数:015(十进制为13)、0101(十进制为 如以下各数是八进制数:015(十进制为13)、0101(十进制为 65)、0177777(十进制为65535); 65)、0177777(十进制为65535); 3、十六进制整常数:十六进制整常数的前缀为0X或0x。其数码 十六进制整常数:十六进制整常数的前缀为0X或0x。其数码 取值为0~9,A~F或a~f。 取值为0~9,A~F或a~f。 如以下各数是十六进制整常数:0X2A(十进制为42)、 如以下各数是十六进制整常数:0X2A(十进制为42)、0XA0 (十进制为160)、0XFFFF (十进制为65535)。 十进制为160)、 (十进制为65535)。
4
针对汇编语言可以更好的针对硬件进行控制的特点,很多单 片机设计和生产公司开发了MCS-51单片机的增强型衍生产品,这 片机设计和生产公司开发了MCS-51单片机的增强型衍生产品,这 些产品在内部的主要功能部件上未作出任何变化,只是增加了程序 存储器Flash和数据存储器RAM的容量,使其更适合运用C 存储器Flash和数据存储器RAM的容量,使其更适合运用C语言开 发代码更长的复杂程序。如,表4 给出的STC单片机RC/RD+ 发代码更长的复杂程序。如,表4-1给出的STC单片机RC/RD+ (+5V)系列选型一览表中,就是根据这两个因素进行型号区分的。 (+5V)系列选型一览表中,就是根据这两个因素进行型号区分的。 因此,用C 因此,用C语言进行单片机程序设计是单片机开发与应用的 必然趋势。所以,作为一个致力于单片机系统开发的开发人员来说, 最好能够掌握基本的C 最好能够掌握基本的C语言编程。 基于以上原因,本书的所有项目都是采用Keil C51下的C 基于以上原因,本书的所有项目都是采用Keil C51下的C语 言进行开发的,本章就对C51的一些基本知识进行简要介绍,读者 言进行开发的,本章就对C51的一些基本知识进行简要介绍,读者 可以结合后面的具体项目,加深对这部分知识的理解和掌握。关于 MCS-51单片机利用汇编进行编程方面的知识,有兴趣的读者也可 MCS-51单片机利用汇编进行编程方面的知识,有兴趣的读者也可 以查阅相关的资料自行学习。 5
8
5.2 C51的数据类型 C51的数据类型
在C语言中,每个变量在使用之前必须先定义其数据 类型。C语言中有以下几种数据类型:整型(int)、浮点型 类型。C语言中有以下几种数据类型:整型(int)、浮点型 (float)、字符型(char)、指针型(*)、无值型 (void)以及结 (float)、字符型(char)、指针型(*)、无值型 (void)以及结 构(struct)和联合(union)。为了充分利用MCS-51单片机 (struct)和联合(union)。为了充分利用MCS-51单片机 的资源特点,C51 的资源特点,C51 在C语言的数据类型基础上增设了位型 变量sbit,取消了布尔变量,其实两者的使用方法基本类 变量sbit,取消了布尔变量,其实两者的使用方法基本类 似。表5 列出了C51 似。表5-1列出了C51 的基本数据类型。
3
(2)、C语言可以提供良好的人机开发接口 )、C C语言是一种编译型程序设计语言,它兼顾了多种高级语言 的特点,并具备汇编语言的功能,可以实现结构更为复杂的单片机 系统功能。C 系统功能。C语言有功能丰富的库函数,运算速度快、编译效率高、 有良好的可移植性,而且可以直接实现对系统硬件的控制。 C语言是一种结构化程序设计语言,它支持当前程序设计中 广泛采用的由顶向下结构化程序设计技术。此外,C 广泛采用的由顶向下结构化程序设计技术。此外,C语言程序还具 有完善的模块程序结构,从而为软件开发中采用模块化程序设计方 法提供了有力的保障。 因此,使用C 因此,使用C语言进行程序设计已成为软件开发的一个主流。 用C语言来编写目标系统软件,会大大缩短开发周期,并且明显地 增加软件的可读性,便于对已编制好的程序进行改进和扩充,从而 研制出规模更大、性能更完备的系统。
11
5.2.1.2整型变量 5.2.1.2整型变量
根据表5 ,加上不同的修饰符, 根据表5-1,加上不同的修饰符, 整型数有以下几种类型: signed int(有符号短整型数)、signed long(有符号长整型数 int(有符号短整型数)、signed long(有符号长整型数 说明)、unsigned int(无符号短整型数)和unsigned long(无 说明)、unsigned int(无符号短整型数)和unsigned long(无 符号长整型数),字长和数的取值范围已在表5 符号长整型数),字长和数的取值范围已在表5-1中列出。 整型数在内存中是以补码方式存放的,应遵循以下原则: ·正数的补码和原码相同。 ·负数的补码应将该数的绝对值的二进制形式按位取反再加1。 负数的补码应将该数的绝对值的二进制形式按位取反再加1 例如,101的原码为1100101B,反码为 例如,101的原码为1100101B,反码为 1111111110011010B,补码为1111111110011011B,由反码 1111111110011010B,补码为1111111110011011B,由反码 加1求得。
5.1 标识符和关键字
C语言中的标识符是设计人员在程序中自己定义的一种字符 序列,用来命名程序中需要辨认的对象,包括符号常量、变量、数 组及函数等对象。标识符具有以下一些特征: (1)、由字母、数字、下划线构成。 (1)、由字母、数字、下划线构成。 (2)、开头必须是字母或下划线。 (2)、开头必须是字母或下划线。 (3)、长度不得大于32个字符,而通常是前8 (3)、长度不得大于32个字符,而通常是前8个字符有效。 (4)、区分大、小写字母。 (4)、区分大、小写字母。 例如,以下标识符是合法的: A,x,x_3,BOOK 1,sum5 x_3, 1, 以下标识符是非法的: 3s(以数字开头),s*T(出现非法字符*),-3x(以减号开 3s(以数字开头),s*T(出现非法字符*),-3x(以减号开 头),bowy- (出现非法字符-(减号) 头),bowy-1(出现非法字符-(减号))
第五讲Keil C51程序 第五讲Keil C51程序 设计基础
1
Keil C51程序设计基础 C51程序设计基础
单片机程序既可以用汇编语言也可以用C 单片机程序既可以用汇编语言也可以用C语言进行 编写,两者都可以在C51的环境下进行开发,这两者之间 编写,两者都可以在C51的环境下进行开发,这两者之间 既有区别也有联系。 C51是一种特殊的C编译器,它扬弃了C C51是一种特殊的C编译器,它扬弃了C语言的一些 不适合MCS-51单片机的特性,针对MCS-51单片机的特 不适合MCS-51单片机的特性,针对MCS-51单片机的特 性做了适应性保留,使其更适合对单片机底层硬件进行直 接控制。 汇编语言则是一种用文字助记符来表示机器指令的 符号语言,是最接近机器码的一种语言。其主要优点是占 用资源少、程序执行效率高。但是,不同的CPU其汇编语 用资源少、程序执行效率高。但是,不同的CPU其汇编语 言可能有所差异,所以不易相互之间进行移植。
7
例如,C语言语句int 例如,C语言语句int double; 是错误的,因为 double 是关键字,不能做变量名。下面列出了C语言的 是关键字,不能做变量名。下面列出了C 所有关键字,读者在使用中应慎用这些关键字,不要将其 作为标识符来使用。 Auto、enum、restrict、 Auto、enum、restrict、unsigned 、break、 break、 extern、return、void、case、float、 extern、return、void、case、float、short volatile、char、for、signed、while、const、goto、 volatile、char、for、signed、while、const、goto、 sizeof、Bool、continue、if、 static、default、inline、 sizeof、Bool、continue、if、 static、default、inline、 struct、_Imaginary、do、int、switch、double、 struct、_Imaginary、do、int、switch、double、 long、typedef、else、register和union等。 long、typedef、else、register和union等。
数的范围 即-215~(215-1) 即0~(216-1)
-2147483648~2147483647即-231~ (231-1) 0~4294967295 即0~(232-1) 10-37~1038 10-307~10308 10-4931~104932 -128~+127 1 0~255 0,1
6
在使用标识符时还必须注意以下几点: (1)、标准C语言不限制标识符的长度,但它受各种版本的C (1)、标准C语言不限制标识符的长度,但它受各种版本的C语言 编译系统的限制,同时也受到具体机器的限制。例如,在某版本C 编译系统的限制,同时也受到具体机器的限制。例如,在某版本C 语言中规定标识符前八位有效,当两个标识符前八位相同时,则被 认为是同一个标识符。 (2)、在标识符中,大小写是有区别的。例如,SEA和sea是两个 (2)、在标识符中,大小写是有区别的。例如,SEA和sea是两个 不同的标识符。 (3)、标识符虽然可由程序员随意定义,但标识符是用于标识某个 (3)、标识符虽然可由程序员随意定义,但标识符是用于标识某个 量的符号。因此,命名应尽量有相应的意义,以便于理解。 (4)、不应该使用C (4)、不应该使用C语言中的保留标识符来做自定义的变量或者函 数等的标识符。使用保留标识符来做自定义变量或者函数等的标识 符不是语法错误,可以通过编译,因为保留标识符是合法的标识符, 符合标识符命名法则。但是,因为这些标识符已经被C 符合标识符命名法则。但是,因为这些标识符已经被C语言使用或 者保留了,所以使用保留标识符来做自定义变量或者函数等的标识 符可能会引起意想不到的问题。