C51入门
- 格式:doc
- 大小:802.50 KB
- 文档页数:40
MCS-51单片机--C51基础陈茜茹Email:vickychenqian@ Email:vickychenqian@163com¾C51与标准C¾C51的数据类型和运算量¾C51的运算符¾程序结构¾函数¾其它数据类型•C语言是一种编译型程序设计语言,它兼顾了多种高级语言的特点,并具备汇编语言了多种高级语言的特点并具备汇编语言的功能针对的语言日趋成熟成为的功能。
针对8051C语言日趋成熟,成为了专业化的实用高级语言。
很多硬件开发都用C语言编程,如:各种单片机、DSP、ARM等。
(1)C51中定义的库函数和标准C语言定义的库函数不同。
标准的C语言定义的库函数是按通用微型计算机来定义的,而C51中的库函数是按MCS-51单片机相应情况来定义的;(2)C51中的数据类型与标准C的数据类型也有一定的区别,在C51中还增加了几种针对MCS51单片机特有的数据类型;MCS-51(3)C51变量的存储模式与标准C中变量的存储模式不一样,C51中变量的存储模式是与MCS-51单片机的存储器紧密相关;MCS51)与标准的输入输出处理不一样,中的输入输出是(4C51C C51通过MCS-51串行口来完成的,输入输出指令执行前必须要对串行口进行初始化;(5)C51与标准C在函数使用方面也有一定的区别,C51中有专门的中断函数。
基本数据类型类型符号关键字数的表示范围所占位数(signed)int 3276832767有(signed) int 16-32768~32767(signed) short 16-32768~32767(i d)l 3221474836482147483647整型(signed) long -2147483648~214748364716unsigned int 0~65535065535无320~4294967295unsigned long int unsigned short int 160~65535fl t 34383438实型有float 32 3.4e-38~3.4e38有double 64 1.7e-308~1.7e308h128127字符型有char 8-128~127无unsigned char80~255¾长度根据其所指向的变量有所变化,1~3字节¾存放的是另外一个数据的地址g¾定义方法:unsigned int *da;sfr:特殊功能寄存器定义sfr16:sfr的16位数据定义sbit:可位寻址字节或sfr中位的定义bit:位变量定义例:sfr SCON = 0X98;sfr16 T2 = 0xCC;sbit OV = PSW^2;sbit OV=PSW^2;定义变量例:数据类型变量名unsigned int var1; unsigned intbit flags;unsigned char vector[10];用typedef或#define定义数据类型别名例1:typedef unsigned int uint;typedef unsigned int uint;uint var;uint var;例2:#define uchar unsigned char;uchar temp;说明变量所处单片机的存储区域名存储空间位置长度数据范围data直接寻址片内RAM低128B8位0~255 data 直接寻址片内RAM低128B 8位0~255bdata 可位寻址片内RAM(20-2FH) 1位0/1idata 间接寻址片全部内RAM 8位0~255pdata片外RAM低256B8位pdata 片外RAM低256B 8位0~255xdata片外RAM全部64K16位0~65535 xdata 片外RAM全部64K 16位code 程序ROM64K 16位0~65535定义变量例:数据类型[存储类型]变量名unsigned int data var1; unsigned intbit bdata flags;unsigned char code vector[10];不同的存储模式对变量默认的存储器类型不一样1.SMALL模式:小编译模式。
Keil C51软件入门1、新建一个文件夹,用来存放本次操作的文件。
2、启动Keil C51,进入Keil C51开发环境。
图1 启动Keil C51时的屏幕3、点击Project(工程)→New Project(新建工程),进入“Create New Project(创建新工程)”对话框。
图2 新建工程4、在“文件名”栏输入程序项目名称zdx,单击“保存”按钮,即保存一个zdx.uv2文件。
进入选择芯片对话框(Select Device for Target …Target 1‟)。
图3 保存工程5、进入选择芯片对话框(Select Device for Target …Target 1‟)。
在对话框中找到Atmel(Intel)公司,点击下来菜单找到AT89C51(8051AH)。
单击确定,弹出“启动代码选择”对话框,单击“是”,添加启动代码,单击“否”则以后需要再添加,一般选择“否”。
图4 选择单片机芯片6、点击Project(工程)→Options for Target…Target 1‟(项目选项)或在Target 1(目标1)上右击鼠标,出现“Options for Target…Target 1‟”对话框。
选择“Target(项目)”页面,将Xtal(时钟)栏的时钟改为12MHz。
再选择Output(输出)页面,勾选Create Hex File(输出十六进制文件)复选框。
(文件编译后可生成Hex 文件,在Proteus中可直接加载),其他默认,单击确认按钮。
7、点击File (文件)→New (新建),即新建“Text1(文本)”文件,在该文件编辑栏编写汇编程序。
完成后,点击File (文件)→Save As (保存为),在弹出的对话框的文件名栏输入“zdx.asm”(汇编程序)或”zdx.c”(C 程序)(必须输入后缀名)。
8、回到Keil C51开发环境,单击Target 1的下拉菜单,在Source Croup 1(源程序)上右击,选择“Add File to Group …Source Croup1‟(添加文件到源程序)命令,在弹出的“Add File to Group …Source Croup1‟”对话框的文件类型栏,选择Asm Source file (汇编源程序) 或C Source file (C 源程序),查找““zdx.asm”文件,单击Add 按钮,将源程序添加到Source Croup 1。
C51单片机基础学习教程C51单片机是一种常用的8位单片机,广泛应用于工业控制、家用电器和电子产品等领域。
若想学习C51单片机,首先需要掌握C语言的基础知识。
以下是一个C51单片机基础学习教程,介绍了C语言的相关内容,并给出了一个简单的例子。
一、C语言基础1.数据类型:C语言中主要有整型、字符型、浮点型等数据类型。
可以使用关键字来定义变量并赋值。
示例:int num = 10;char ch = 'A';float f = 3.14;2.运算符:C语言中有算术运算符、逻辑运算符、关系运算符等。
可以用于对变量进行运算和比较。
示例:int a = 10, b = 5;int sum = a + b;int result = (a > b) ? a : b;3.控制语句:C语言中有顺序结构、分支结构和循环结构。
可以用于控制程序的执行流程。
示例:if (num > 0)printf("The number is positive.");} else if (num < 0)printf("The number is negative.");} elseprintf("The number is zero.");4.函数:C语言中可以使用函数将代码模块化,并且可以通过参数和返回值传递数据。
示例:int add(int a, int b)return a + b;二、C51单片机入门2. 创建新项目:在Keil软件中创建一个新的项目,并选择C51单片机作为目标芯片。
3. 编写程序:在新建的项目中打开main.c文件,编写C语言程序。
可以使用C语言的代码编写方式。
示例:#include <reg51.h>//定义LED端口sbit LED = P1^0;void mai//设置LED口为输出LED=0;while (1)//LED闪烁LED=~LED;//延时for (int j = 0; j < 100; j++)}}}5. 调试程序:在Keil软件中打开调试窗口,可以对程序进行单步调试,查看程序的执行流程和变量的值。
单片机C51基础知识汇总目录1、标识符2、数据类型3、变量4、常量5、二进制、八进制、十进制、十六进制6、运算符7、语句8、注释9、if语句10、switch--case语句11、for循环12、while循环13、do—while循环14、循环控制15、一维数组16、二维数组17、字符数组与字符串数组18、函数19、函数重入与递归20、预处理21、宏22、条件编译指令23、指针(*)24、结构(struct)25、联合(union)26、枚举(enum)主要内容1 .标识符标识符就是编程时使用的表示某个事情名称的符号,如函数名、变量名、引脚名、特殊功能寄存器名等。
标识符有系统标识符和用户自定义标识符之分。
标识符的命名规则:(1) 标识符第一个字符必须是字母或下划线。
(2) 标识符只能由字母、数字和下划线三类字符组成。
(3) 标识符是区分大小写的。
如A 和a 是两个不同的标识符。
(4) 标识符有效长度不超过32 个字符。
(5) 标识符不能是C51 的关键字。
2 .数据类型char有符号字符型,一字节,值域-128~127。
int 有符号整型,两字节,值域-32768~32767。
long有符号长整型,四字节,值域-2147483648~2147483647 unsigned char无符号字符型,一字节,值域0~255unsigned int无符号整型,两字节,值域0~65535unsigned long无符号长整型,四字节,值域0~4294967295float浮点型(都是有符号的),四字节,±1.175494E-38~±3.402823E+38bit位变量,一个二进制位,值域0~1。
sbit51 单片机特殊功能寄存器位,值域0~1。
Sfr 51 单片机特殊功能寄存器,值域0~255。
sfr1651 单片机特殊功能寄存器,如DPTR,值域0~65535。
bit,sbit,sfr,sfr16不是标准C 的内容,是51 单片机及C51 编译器特有的,不能用指针对它们进行操作。
C51单片机是一种基于C语言的微控制器,具有强大的处理能力和灵活的编程特性。
以下是一些关于C51单片机的基础知识:
硬件结构:C51单片机采用冯·诺依曼结构,由运算器、控制器、存储器、输入输出设备等组成。
存储器:C51单片机内部有一个程序存储器(Flash ROM)、一个数据存储器(RAM)和一个特殊功能寄存器(SFR)。
程序存储器用于存储程序,数据存储器用于存储变量和临时数据,特殊功能寄存器用于控制各种外设和功能。
指令系统:C51单片机的指令系统类似于C语言,包括算术指令、逻辑指令、数据传输指令、程序控制指令等。
外设:C51单片机有多种外设,如定时器/计数器、串行通信接口、中断控制器、I/O端口等。
这些外设可以通过特殊功能寄存器进行配置和控制。
开发环境:C51单片机的开发环境通常包括编译器、调试器和集成开发环境(IDE)。
编译器将C语言代码转换为单片机可执行的机器码,调试器用于在单片机上进行程序调试和仿真,IDE提供了代码编写、编译、调试和下载的一体化环境。
应用领域:C51单片机广泛应用于各种嵌入式系统,如智能仪表、家电控制、通信设备、工业自动化等领域。
总之,C51单片机是一种功能强大、易于编程的微控制器,通过学习和掌握其基础知识,可以开发出各种高效的嵌入式应用系统。
C51单片机编程基本知识C51单片机编程是指使用C语言对C51系列单片机进行编程的过程。
这种编程方式广泛应用于嵌入式系统开发中,具有灵活性高、可靠性强的特点。
本文将介绍C51单片机编程的基本知识,包括单片机结构、编程语言、编译器以及编程流程等。
一、单片机结构C51单片机是由Intel公司开发的一种嵌入式微控制器,由中央处理器、存储器、输入输出接口和外设等部分组成。
其中,中央处理器用于执行程序指令,存储器用于存储程序和数据,输入输出接口用于与外部设备进行交互。
了解单片机的基本结构对于进行C51单片机编程至关重要。
二、编程语言C语言是一种高级编程语言,广泛应用于嵌入式系统开发中。
C语言具备结构化编程的特点,能够提高程序的可读性和可维护性。
在C51单片机编程中,使用C语言可以更加方便地编写程序,并且兼容性强,可以在不同的平台上使用。
三、编译器编译器是将C语言源代码转换为机器语言的工具。
在C51单片机编程中,常用的编译器有Keil C51、SDCC等。
不同的编译器具有不同的特点和使用方法,开发人员需要选择适合自己需求的编译器,并且熟悉其使用方法。
四、编程流程C51单片机编程的流程一般包括以下几个步骤:1. 确定需求:根据实际应用需求,明确单片机的功能和性能要求。
2. 掌握硬件特性:了解单片机的硬件特性,包括引脚功能、外设接口和中断等。
3. 编写代码:使用C语言编写单片机的程序代码,包括初始化设置、主程序和中断服务程序等。
4. 编译代码:使用编译器将C语言源代码编译为可执行的机器语言文件。
5. 烧录程序:将机器语言文件通过烧录工具烧录到单片机的存储器中。
6. 调试测试:连接单片机和外部设备,进行功能测试和调试,确保程序的正确性和稳定性。
7. 优化改进:根据实际运行情况,对程序进行优化和改进,提高性能和效率。
五、常见问题与解决方法在C51单片机编程的过程中,常常会遇到一些问题,下面介绍几个常见问题及其解决方法:1. 编译错误:根据编译器给出的错误提示信息,检查代码语法和逻辑错误,并进行相应的修正。
单片机的C51语言基础在现代电子技术领域,单片机的应用可谓无处不在。
从智能家居设备到工业自动化控制系统,从医疗仪器到汽车电子,单片机都发挥着至关重要的作用。
而要让单片机按照我们的意愿工作,就需要使用合适的编程语言对其进行编程。
C51 语言就是其中一种广泛应用于单片机编程的语言。
C51 语言是在标准 C 语言的基础上发展而来的,专门针对 8051 系列单片机进行了优化和扩展。
它继承了 C 语言简洁、高效、灵活的特点,同时又具备了与单片机硬件直接交互的能力。
要学习 C51 语言,首先得了解它的数据类型。
C51 语言中的数据类型包括基本数据类型和扩展数据类型。
基本数据类型有整型(int)、字符型(char)、浮点型(float)等。
而扩展数据类型则是针对单片机的特殊需求而定义的,比如位类型(bit)、特殊功能寄存器类型(sfr)、特殊功能寄存器位类型(sbit)等。
整型数据用于表示整数,其长度和取值范围根据不同的类型有所不同。
字符型数据通常用来存储单个字符,占用一个字节的存储空间。
浮点型数据则用于表示带有小数部分的数值,但在单片机中,由于资源有限,使用浮点运算可能会比较耗费资源,所以要谨慎使用。
位类型可以用来操作单个二进制位,这在控制单片机的引脚状态等方面非常有用。
特殊功能寄存器类型和特殊功能寄存器位类型则用于直接访问单片机内部的特殊功能寄存器,从而实现对单片机各种硬件功能的控制。
变量和常量也是 C51 语言中的重要概念。
变量是在程序运行过程中其值可以改变的量,而常量则是在程序运行过程中其值保持不变的量。
在定义变量时,需要指定其数据类型和名称,例如:`int num;`这里定义了一个整型变量`num` 。
常量可以用宏定义来实现,比如:`define PI 314159` ,这样在程序中使用`PI` 就相当于使用了`314159` 。
C51 语言的运算符与标准 C 语言类似,包括算术运算符(如+、、、/等)、关系运算符(如>、<、==等)、逻辑运算符(如&&、||、!等)等。
C51培训教程1. 前言1.1为什么使用C语言而放弃汇编?好些年之前,每个单片机开发人员都为自己写了几万行汇编代码而骄傲。
然而几年之后的今天,却要劝说后来学习者一定要舍弃汇编而学习C语言,是否很好笑。
首先说说C的优点:直观,可读性强:这点很重要。
对于一个产品,周期是很长的,即使出第一台产品之后,还有很长的维护时间。
这中间维护人员可能经常变动,如果可读性强,将给维护工作省下很大的成本。
即使是在开发,可读性强的程序也便于查错。
模块化可以做的很好:这点也是很重要的。
模块化做得好,当然程序得重用性就高。
对于公司来说,这一点是关系到公司长远发展的。
程序可以重用,说明下一次开发的投入就可以减少,时间也可以加快,多好的事呀。
还有很多有点,当然也就是高级语言相对于汇编语言的优点,这里就不一一列举了。
再来看看汇编的优点,汇编语言操作硬件直观,对于硬件非常熟悉的人来说,直接操作很方便。
“汇编语言操作硬件直观”,这是在代码编写阶段,对于整个产品周期来说,应该是要避免使用汇编语言的,这个在C语言的优点中已经说明。
效率要高。
目前C语言的编译器优化也做的很好,对于一个汇编不是很熟练的来说,C编出来的程序应该不会效率比汇编低。
当然这样就对开发人员的要求降低了很多,人员的限制也就没有那么严格。
另外是否真的是效率问题呢。
我觉得应该是一个整体效率和局部效率的均衡问题。
需要提高的是整体的效率。
一个好的软件架构,远远比一个好的函数效率要高的多。
因此主要的精力应该放在软件的架构上。
另外现在CPU的速度不停的往上提,CPU越来越快,这点应该也可以弥补程序的效率吧。
当然,不是不学习汇编。
汇编对于熟悉硬件有很大的好处,应此汇编语言在学习初期一定是要学习的。
在基本的硬件熟悉之后,就可以转向C了。
1.2C51的编程规范现在单片机的程序设计,C51已经得到广泛的推广和应用,算是单片机的主流设计程序,甚至可以说作为单片机开发人员必须要掌握的一门语言了。
作为一门工具,最终的目的就是实现功能。
在满足这个前提条件下,我们希望我们的程序能很容易地被别人读懂,或者能够很容易地读懂别人的程序,在团体合作开发中就能起到事半功倍之效。
在网上请求帮助时,如能以规范的写法贴出程序,网友会比较容易地明白你的问题,则会比较快的得到网友的帮助,否则让人看上半天也不明所以然,这样就达不到预期的效果了。
因此,为了便于源程序的交流,减少合作开发中的障碍,需要形成良好的编程规范。
一、注释1,采用中文;2,开始的注释:文件(模块)注释内容:公司名称、版权、作者名称、修改时间、模块功能、背景介绍等,复杂的算法需要加上流程说明;比如:/*********************************************************************//*公司名称: *//*模块名:LCD 模块LCD 型号:HD44780 *//*创建人:zhaojunjie 日期:2001-06-08 *//*修改人:日期:2001-06-08 *//*功能描述:*//*其他说明:*//*版本:/***************************************/函数开头的注释内容:函数名称、功能、说明输入、返回、函数描述、流程处理、全局变量、调用样例等,复杂的函数需要加上变量用途说明;/******************************************* 函数名: v_LcdInit* 功能描述: LCD初始化* 函数说明: 初始化命令:0x3c, 0x08, 0x01, 0x06, 0x10, 0x0c* 调用函数: v_Delaymsec(),v_LcdCmd()* 全局变量:* 输入: 无* 返回: 无* 设计者:zhao 日期:2001-12-09* 修改者:zhao 日期:2001-12-09* 版本:*************************************/3、程序中的注释内容:修改时间和作者、方便理解的注释等。
注释内容应简炼、清楚、明了,一目了然的语句不加注释。
二、命名:命名必须具有一定的实际意义。
1、常量的命名:全部用大写。
2、变量的命名:变量名加前缀,前缀反映变量的数据类型,用小写,反映变量意义的第一个字母大写,其他小写。
其中变量数据类型:unsigned char 前缀uc signed char 前缀scunsigned int 前缀ui signed int 前缀siunsigned long 前缀ul signed long 前缀slbit 前缀b 指针前缀p例:ucReceivData 接收数据3、结构体命名:4、函数的命名:函数名首字大写,若包含有两个单词的每个单词首字母大写。
函数原型说明包括:引用外来函数及内部函数,外部引用必须在右侧注明函数来源:模块名及文件名, 内部函数,只要注释其定义文件名;三、编辑风格1、缩进:缩进以Tab 为单位,一个Tab 为四个空格大小。
预处理语句、全局数据、函数原型、标题、附加说明、函数说明、标号等均顶格书写。
语句块的“{”“}”配对对齐,并与其前一行对齐;2、空格:数据和函数在其类型,修饰名称之间适当空格并据情况对齐。
关键字原则上空一格,如:if ( ... ) 等,运算符的空格规定如下:“->”、“[”、“]”、“++”、“--”、“~”、“!”、“+”、“-”(指正负号),“&”(取址或引用)、“*”(指使用指针时)等几个运算符两边不空格(其中单目运算符系指与操作数相连的一边),其它运算符(包括大多数二目运算符和三目运算符“?:”两边均空一格,“(”、“)”运算符在其内侧空一格,在作函数定义时还可据情况多空或不空格来对齐,但在函数实现时可以不用。
“,”运算符只在其后空一格,需对齐时也可不空或多空格,对语句行后加的注释应用适当空格与语句隔开并尽可能对齐。
3、对齐:原则上关系密切的行应对齐,对齐包括类型、修饰、名称、参数等各部分对齐。
另每一行的长度不应超过屏幕太多,必要时适当换行,换行时尽可能在“,”处或运算符处,换行后最好以运算符打头,并且以下各行均以该语句首行缩进,但该语句仍以首行的缩进为准,即如其下一行为“{”应与首行对齐。
4、空行:程序文件结构各部分之间空两行,若不必要也可只空一行,各函数实现之间一般空两行5、修改:版本封存以后的修改一定要将老语句用/* */ 封闭,不能自行删除或修改,并要在文件及函数的修改记录中加以记录。
6、形参:在定义函数时,在函数名后面括号中直接进行形式参数说明,不再另行说明2. 流水灯实验图1.1 流水灯实验电路图1.八盏灯闪烁实验:#include <reg51.h> //预处理命令,定义SFR的头文件,一般的C51程序都有void main(void) //主函数名{//这是第一种注释方式unsigned int a; //定义变量a为int类型/*这是第二种注释方式*/do{ //do while组成循环for (a=0; a<50000; a++); //这是一个循环P1 = 0x00; //设P1口全为低电平,点亮LEDfor (a=0; a<50000; a++); //这是一个循环P1 = 0xff; //设P1口全高电平,点亮熄灭LED}while(1);}知识点:一、C51程序结构#include <reg51.h> //预处理命令,定义SFR的头文件,一般的C51程序都有void main(void) //主函数名{//这是第一种注释方式unsigned int a; //定义变量a为int类型/*这是第二种注释方式*/do{//do while组成循环for (a=0; a<50000; a++); //这是一个循环P1 = 0x00; //设P1口全为低电平,点亮LEDfor (a=0; a<50000; a++); //这是一个循环P1 = 0xff; //设P1口全高电平,点亮熄灭LED}while(1);}二、C51数据类型表1KEIL uVision2 C51编译器所支持的数据类型char类型的长度是一个字节,通常用于定义处理字符数据的变量或常量。
分无符号字符类型unsigned char和有符号字符类型signed char,默认值为signed char类型。
unsigned char类型用字节中所有的位来表示数值,所可以表达的数值范围是0~255。
signed char类型用字节中最高位字节表示数据的符号,"0"表示正数,"1"表示负数,负数用补码表示。
所能表示的数值范围是-128~+127。
unsigned char常用于处理ASCII字符或用于处理小于或等于255的整型数。
正数的补码与原码相同,负二进制数的补码等于它的绝对值按位取反后加1。
2,int整型int整型长度为两个字节,用于存放一个双字节数据。
分有符号int整型数signed int和无符号整型数unsigned int,默认值为signed int类型。
signed int表示的数值范围是-32768~+32767,字节中最高位表示数据的符号,"0"表示正数,"1"表示负数。
unsigned int表示的数值范围是0~65535。
好了,先停一下吧,我们来写个小程序看看unsigned char和unsigned int用于延时的不同效果,说明它们的长度是不同的,呵,尽管它并没有实际的应用意义,这里我们学习它们的用法就行。
依旧用我们上一课的最小化系统做实验,不过要加多一个电阻和LED,如图1.1。
实验中用DS8的点亮表明正在用unsigned int数值延时,用DS7点亮表明正在用unsigned char 数值延时。
2.数据类型比较实验:我们把这个项目称为TwoLED,实验程序如下:#include <reg51.h> //预处理命令void main(void) //主函数名{unsigned int a; //定义变量a为unsigned int类型unsigned char b; //定义变量b为unsigned char类型do{ //do while组成循环for (a=0; a<65535; a++)P1_0 = 0; //65535次设P1.0口为低电平,点亮LEDP1_0 = 1; //设P1.0口为高电平,熄灭LEDfor (a=0; a<30000; a++); //空循环for (b=0; b<255; b++)P1_1 = 0; //255次设P1.1口为低电平,点亮LEDP1_1 = 1; //设P1.1口为高电平,熄灭LEDfor (a=0; a<30000; a++); //空循环}while(1);}同样编译烧写,上电运行您就可以看到结果了。