51单片机基础剖析(基于C语言)

51单片机基础剖析(基于C语言)
51单片机基础剖析(基于C语言)

51单片机基础剖析(基于C语言)

"玩转单片机"公共主页好友司海瑞原创,转载请注明。

潜水在玩转单片机的人人主页已经有一段时间了。之前一直喜欢在CSDN和21IC发帖子,今天看到主页君发出征稿启事,遂投稿,并将长期投稿,将自己的单片机学习心得分享出来,以抛砖迎玉。

虽然接触51单片机有些年头,也跟导师做过几个项目,但深知高手出自民间,于是从不敢将自己写的东西称为“文章”,更倾向于“帖子”、“心得”这样的说法。由于知识点不足是硬伤,望各位轻喷,不吝赐教。特此留下邮箱以交流:shr5791@https://www.360docs.net/doc/009634355.html,

一、51单片机内存剖析(很重要,尤其在开发实际项目中)

在编写应用程序时,定义一个变量,一个数组,或是说一个固定表格,到底存储在什么地方;当定义变量大小超过MCU的内存范围时怎么办;如何控制变量定义不超过存储范围;

以及如何定义变量才能使得变量访问速度最快,写出的程序运行效率最高。以下将一一解答。

1.六类存储类型 code data idata xdata pdata bdata

code:程序存储器,也即只读存储器,用来保存常量或是程序,采用16位地址线编码,可以是在片内,或是片外,大小被限制在64KB。

作用:定义常量,如八段数码表或是编程使用的常,在定义时加上code或明确指明定义的常量保存到code memory(只读。)比如:

char code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};

此关键字的使用方法等同于const。

data:数据存储区,只能用于声明变量,不能用来声明函数,该区域位于片内,采用8位地址线编码,具有最快的存储速度,但是数量被限制在128byte或更少。

使用方法:unsigned char data fast_variable=0;

Idata:数据存储区,只能用于声明变量,不能用来声明函数。该区域位于片内,采用8位地址线编码,内存大小被限制在256byte或更少。该区域的低地址区与data区地址一致,高地址区域是52系列在51系列基础上扩展的并与特殊功能寄存器具有相同地址编码的区域。即:data memory是idata memory的一个子集。

xdata:只能用于声明变量,不能用来声明函数,该区域位于MCU外部,采用16位地址线进行编码,存储大小被限制在64KB以内。如:unsigned char xdata count=0;

pdata:只能用于声明变量,不能用来声明函数,该区域位于MCU外部,采用8位地址线进行编码。存储大小限制在256byte,是xdata memory的低256byte。为其子集。如:unsigned char pdata count=0;

bdata:只能用于声明变量,不能用来声明函数。该区域位于8051内部位数据地址。定义的量保存在内部位地址空间,可用位指令直接读写。使用方法:unsigned char bdata varab=0。

注:一般情况下,定义字符型变量时,在缺省unsigned的情况下,默认为无符号。但是本人在Keil uV3中遇到并非如此的案例。在缺省的情况下默认为有符号。要注意一下,或许不同的编译器规则不同。所以我们在写程序的时候,还是最好把unsigned signed加上。

2.函数的参数和局部变量的存储模式

C51 编译器允许采用三种存储器模式:SMALL,COMPACT 和LARGE。一个函数的存储器模式确定了函数的参数的局部变量在内存中的地址空间。处于SMALL模式下的函数参数和局部变量位于8051单片机内部RAM中,处于COMPACT和LARGE模式下的函数参数和局部变量则使用单片机外部RAM。在定义一个函数时可以明确指定该函数的存储器模式。方法是在形参表列的后面加上一存储模式。

示例如下:

#pragma large //此预编译必须放在所有头文前面

int func0(char x,y) small;

char func1(int x) large;

int func2(char x);

注:上面例子在第一行用了一个预编译命令#pragma,它的意思是告诉c51编译器在对程序进行编译时,按该预编译命令后面给出的编译控制指令LARGE进行编译,即本例程序编译时的默认存储模式为LARGE。随后定义了三个函数,第一个定义为SMALL存储模式,

第二个函数定义为LARGE第三个函数未指定,在用C51进行编译时,只有最后一个函数按LARGE存储器模式处理,其它则分别按它们各自指定的存储器模式处理。

本例说明,C51编译器允许采用所谓的存储器混合模式,即允许在一个程序中将一些函数使用一种存储模式,而其它一些则按另一种存储器模式,采用存储器混合模式编程,可以充分利用8051系列单片机中有限的存储器空间,同时还可以加快程序的执行速度。

3.绝对地址访问(头文件为:absacc.h(相当重要))

#define CBYTE ((unsigned char volatile code *) 0)

#define DBYTE ((unsigned char volatile data *) 0)

#define PBYTE ((unsigned char volatile pdata *) 0)

#define XBYTE ((unsigned char volatile xdata *) 0)

功能:CBYTE寻址CODE区

DBYTE寻址DATA区

PBYTE寻址XDATA(低256)区

XBYTE寻址XDATA区

例:如下指令在对外部存储器区域访问地址0x1000

xvar=XBYTE[0x1000];

XBYTE[0x1000]=20;

#define CWORD ((unsigned int volatile code *) 0)

#define DWORD ((unsigned int volatile data *) 0)

#define PWORD ((unsigned int volatile pdata *) 0)

#define XWORD ((unsigned int volatile xdata *) 0)

功能:与前面的一个宏相似,只是它们指定的数据类型为unsigned int。

通过灵活运用不同的数据类型,所有的8051地址空间都是可以进行访问。例如:

DWORD[0x0004]=0x12F8;// 即内部数据存储器中(0x08)=0x12; (0x09)=0xF8

注:用以上八个函数,可以完成对单片机内部任意ROM和RAM进行访问,非常方便。还有一种方法,那就是用指钟,后面会对C51的指针有详细的介绍。

4.寄存器变量(register)

为了提高程序的执行效率,C语言允许将一些频率最高的那些变量,定义为能够直接使用硬件寄存器的所谓的寄存器变量。定义一个变量时,在变量类型名前冠以“register” 即将该变量定义成为了寄存器变量。寄存器变量可以认为是一自动变量的一种。有效作用范围也自动变量相同。由于计算机寄存器中寄存器是有限的。不能将所有变量都定义成为寄存器变量,通常在程序中定义寄存器变量时,只是给编译器一个建议,该变量是否真正成为寄存器变量,要由编译器根据实际情况来确定。另一方面,C51编译器能够识别程序中使用频率最高的变量,在可能的情况下,即使程序中并未将该变量定义为寄存器变量,编译器也会自动将其作为寄存器变量处理。被定义的变量是否真正能成为寄存器变量,最终是由编译器决定的。

5.内存访问的实现

(1)指钟

指钟本身是一个变量,其中存放的内容是变量的地址,也即特定的数据。8051的地址是16位的,所以指针变量本身占用两个存储单元。指针的说明与变量的说明类似,仅在指针名前加上“*”即可。

如: int *int_point; //声明一个整型指针

char *char_point; //声明一个字符型指针

利用指针可以间接存取变量。实现这一点要用到两个特殊运算符

& 取变量地址

* 取指针指向单元的数据

示例一:

int a=15,b;

int *int_point; //定义一个指向整型变量的指针

int_point=&a; //int_point指向a

*int_point=5; //给int_point指向的变量a 赋值5 等同于a=5;

示例二:

char i,table[6],*char_point;

char_point=table;

for(i=0;i<6;i++)

{

char_point=i;

char_point++;

}

注:指针可以进行运算,它可以与整数进行加减运算(移动指针)。但要注意,移动指针后,其地址的增减量是随指针类型而异的,如,浮点指针进行自增后,其内部将在原有的基础上加4,而字符指针当进生自增的时候,其内容将加1。原因是浮点数,占4个内存单元,而字符占一个字节。

宏晶科技最新一代STC12C5A360S2系列,每一个单片机出厂时都有全球唯一身份证号码(ID号),用户可以在单片机上电后读取内部RAM单元F1H~F7H的数值,来获取此单片机的唯一身份证号码。使用MOV @Ri指令来读取。下面介绍C51获取方法:

char id[7]={0};

char i;

char idata *point;

for(i=0;i<7;i++)

{

id[i]=*point;

point++;

}

(此处只是对指针做一个小的介绍,达到访问内部任何空间的方式,后述有对指针使用的详细介绍)

(2)对SFR,RAM ,ROM的直接存取

C51提供了一组可以直接对其操作的扩展函数

若源程序中,用#include包含头文件,io51.h 后,就可以在扩展函数中使用特殊功能寄存器的地址名,以增强程序的可读性:

注此方法对SFR,RAM,ROM的直接存取不建议使用.因为,淡io51.h这个头文件在KEIL中无法打开,可用指针,或是采用absacc.h头文件,

(3) PWM与PCA

STC12系列有两路PWM/PCA

PWM:(Pulse Width Modulation)脉宽调制,是一种使用程序来控制波形占空比,周期,相位波形的技术。

PCA:(Programmable Counter Array)可编程计数阵列,它比通常的定时/计数器的定时能力强,需要CPU的干预少。其优势一是软件简单,二是精度大有提高。

*6.动态内存分配的实现

在单片机的实际开发中,很多情况下我么需要开辟一块内存,但是具体开辟多大,也就是内存的字节数我们还无法确定,比如可能要等到上位机的指令发送下来才能确定,这个时候我们就得动态分配内存。注意,单片机内部存储资源是极其有限的,不允许开发人员开辟出一块很大的存储区来备用。在VC 6.0环境下很容易用malloc()来得到一块RAM,但是由于单片机内部没有操作系统(如何在51上跑uC/OS-II我以后会写出来),所以在51上实现动态内存分配就是个难点也是一个重点问题。下面给出代码,详细分析大家可以参考求是科技编的《8051系列单片机C程序设计完全手册》这本书。

#include

#include //init_mempool()、malloc()、free()函数所在的头文件

……

void main (void)

{

char *ptr1;

init_mempool (0x1000,0x500); //内存池初始化,0x1000为起始地址,0x500为内存大小

ptr1=malloc(30); /*动态为指针变量分配长度为30字节的存储空间*/

……

//此处为你的代码

……

free(ptr1) ; //注意,动态内存用完之后务必要释放,否则程序将会出错

while (1);

}

二、变量类型及其作用域剖析

变量可分为 1.局部变量;2.全局变量(按变量的有效作用范围划分)

1.局部变量

是指函数内部(包括main函数)定义的变量,仅在定义它的那个函数范围内有效,不同函数可使用相同的局部变量名,函数的形式参数也属于局部变量,在一个函数的内部复合语句中也可以定义局部变量,该局部变量只在该复合语合中有效。

2.全局变量

是指函数外部定义的变量,以称外部变量。可为多个函数共同使用,其有效作用范围是从它定义开始到整个程序文件结束。如果全局变量,定义在一个程序文件的开始处,则在整个程序文件范围都可以使用它,如果一个全局变量不是在程序文件的开始处定义,但又希望在它定义之前的函数中引用该变量,这时应在引用该变量的函数中用关键字extern将其声明为“外部变量”。另个,如果在一个程序模块文件中引用另一个程序模块文件中定义的变量时,也必须用extern进行说明。

外部变量的说明与外部变量的定义是不同的,外部变量定义只能有一次,定义的位置在所有函数之外,而同一个程序文件中(不是指模块文件)的外部变量声明可以有多次,声明的置在需要引用该变量的函数之内,外部变量的声明的作用只是声明该变量是一个已经在外部定义过了的变量而已。

如在同一个程序文件中,全局变量与局部变量同名,则在局部变量的有效作用范围之内,全局变量不起作用,也就是说,局部变量的优先级比全局变量高。

在编写C语言程序时,不是特别必要的地方一般不要使用全局变量,而应当尽可能的使用局部变量。因为局部变量只在使用它的时候,才为其分配内存单元,而全局变量在整个程序的执行过程中都要占用内存单元,且当全局变量使用过多时,会降低程序的可读性。

变量的存储种类

(1).自动变量(auto)

定义变量时,在变量类型名前加上“auto” ,自动变量是C语言中使用最为广泛的一类变量,在函数体内部或是复合语句内部定义的变量,如果省略了存储种类说明,则该变量默认为自动变量。

例如:

{ 等价于 {

char x; auto char x;

int y; auto int y;

…………

} }

注:自动变量的作用范围在定义它的函数体或是复合语句内部,只有在定义它的函数内被调用,或是定义它的复合语句被执行时,编译器才会为其分配内存空间,开始其生存期。当函数调用结束返回,或复合语句执行结束,自动变量所占用的内存空间就被释放,变量的值当然也就不复存在,其生存期结束。当函数再次调用,或是复合语句被再次执行时,编译器又会为其内部的自动变量重新分配内存空间。但不会保留上一次运行的值。而必须被重新分配。因此自动变量始终是相对于函数或复合语句的局部变量。

(2).外部变量(extern)

用说明符“extern”定义的变量称为外部变量。按缺省规则,凡是在所有函数之前,在函数外部定义的变量都是外部变量,定义时可以不写extern说明符,但是一个函数体内说明一个已在该函数体外或别的程序模块文件中定义过的外部变量时,刚必须要使用extern说明符。外部变量定义后,它就被分配了固定的内存空间。外部变量的生存期为程序的整个执行时间。外部变量的存储不会随函数或复合语句执行完毕而释放,因此外部变量属于全局变量。

C语言允许将大型程序分解为若干个独立的程序模块文件,各个模块可分别进行编译,然后再将它们连接在一起,如果某个变量需要在所有程序模块文件中使用,只要在一个程序模块文件中将该变量定义成全局变量,而在其它程序模块文件中用extern声明该变量是已被定义过的外部变量就可以了。

函数是可以相互调用的,定义函数时,如果冠以关键字extern 即将其明确定义为一个外部函数。例如extern int func2(char a,b) 。如果在定义函数时省略关键字extern,则隐含为外部函数。如果在调用一个在本程序模块文件以外的其它模块文件所定义的函数,则必须要用关键字extern说明被调用的函数是一个外部函数。对于具有外部函数相互调用的多模块程序,可用C51编译器分别对各个模块文件进行编译,最后再用L51连接定位器将它们连接成为一个完整的程序。如下为一个多模块程序:

程序模块1,文件名为file1.c

#include

int x=5;

void main()

{

extern void fun1( );

extern viod fun2(int y);

fun1( );

fun1( );

fun1( );

printf( “\n%d %d\n”,x,fun2(x));

}

程序模块2,文件名为file2.c

#include

extern int x;

void fun1( )

{

static int a=5; //静态变量只在第一次调用函数时赋值,退出函数时//会保留上次的值,下次调用不再重新赋值。

int b=5;

printf(“%d%d %d |”,a,b,x);

a-=2;

b-=2

x-=2;

printf(“%d%d %d |”,a,b,x);

}

int fun2(int y)

{

return(35*x*y);

}

程序执行如果如下:

5 5 5 | 3 3 3

3 5 3 | 1 3 1

1 5 1 | -1 3 1

-1 35

注:C语言不允许在一个函数内嵌套定义另一个函数。为了能够访问不同文件中各个函数的变量,除了可以采用参数传递的方法外,还可以采用外部变量的方法,上面的例子就说了这一点。不过,尽管使用外部变量在不同函数之间传递数据有时比使用函数参数传递更为方便,不过当外部变量过多时,会增加程序的调试排错的困难。使得程序不便于维护。别外不通过参数传递直接在函数中改变全局变量的值,有时还会发生一些意想不到的副作用。因些最好还是使用函数参数来传递数据。

(3).寄存器变量(register)

为了提高程序的执行效率,C语言允许将一些频率最高的那些变量,定义为能够直接使用硬件寄存器的所谓的寄存器变量。定义一个变量时,在变量类型名前冠以“register” 即将该变量定义成为了寄存器变量。寄存器变量可以认为是一自动变量的一种。有效作用范围也自动变量相同。由于计算机寄存器中寄存器是有限的。不能将所有变量都定义成为寄存器变量,通常在程序中定义寄存器变量时,只是给编译器一个建议,该变量是否真正成为寄存器变量,要由编译器根据实际情况来确定。另一方面,C51编译器能够识别程序中使用频率最高的变量,在可能的情况下,即使程序中并未将该变量定义为寄存器变量,编译器也会自动将其作为寄存器变量处理。被定义的变量是否真正能成为寄存器变量,最终是由编译器决定的。

(4).静态变量(static)

使用存储种类说明符“static”定义的变量为静态变量,在上面模块2程序文件中使用了一个静态变量:static int a =5 ;由于这个变量是在函数fun1( )内部定义,因此称为内部静态变量或局部静态变量。局部静态变量始终都是存在的,但只有在定义它的函数内部进行访问,退出函数之后,变量的值仍然保持,但不能进行访问。

还有一种全局静态变量,它是在函数外部被定义的。作用范围从它的定义点开始,一直到程序结束,当一个C语言程序由若干个模块文件所组成时,全局静态变量始终存在,但它只能在被定义的模块文件中访问,其数据值可为该模块文件内的所有函数共享,退出该文件后,虽然变量的值仍然保持着,但不能被其它模块文件访问。在一个较大的程序中,这就方便了多人设计时,各自写的程序模块不会被别的模块文件所引用。全局静态变量和单纯的全局变量,在编译时就已经为期分配了固定的内存空间,只是他们的作用范围不同而已。局部静态变量是一种在两次函数调用之间仍能保持其值的局部变量。如下,局部变量的使用——计算度输出1~5的阶乘值。

#include

int fac( int n)

{

static int f=1;

f=f*n;

return(f);

}

main( )

{

int i;

for(i=1;i<=5;i++)

printf(“%d!=%d\n”,i,fac(i));

}

程序执行结果

1!=1

2!=2

3!=6

4!=24

5!=120

注:在这个程序中一共调用了5次计算阶乘的函数fac(i),每次调用后输出一个阶乘值i!,同时保留了这个i!值,以便下次再乘(i+1).由此可见,如果要保留函数上一次调用结束时的值,或是在初始化之后变量只被引用而不改变其值,则这时使用局部静态变量;较为方便,以免在每调用时都要重新进行赋值,但是,使用局部静态变量需要占用较多的内存空间,而且降低了程序的可读性,因此并不建议多用局部静态变量。

静态函数:

对于函数也可以定义成为具为静态存储种类的属性,定义函数时在函数名前冠以关键字static即将其定义为一个静态函数。例如static int func1(char x, y)函数是外部型的,使用静态函数可以使该函数只局限于当前定义它的模块文件中。其它模块文件是不能调用它的。换名话说,就是在其它模块文件中可以定义与静态函数完全同名的另一个函数。不会因为程序中存在相同的函数名而发生函数调用时的混乱。这一点对于进行模块化程序设计是很有用的。

三、中断浅谈

0 外中断0

1 定时器0

2 外中断1

3 定时器1

4 串行口

定义中断函数如下

void timer1() interrupt 3

{

……

……

}

强烈建议:如上所述,定义中断函数时不要加using n选项。除非你对你的程序以及单片机的工作过程非常熟悉,否则会带来不必要的麻烦。具体原因由于篇幅的限制暂不讨论。

C51中断程序编写要求:

1.中断函数不能进行参数传递,否则,将导致编译出错

2.中断中,不能包含任何参数声明,否则,将导致编译出错。

3.中断函数没有返回值,如果企图定义一个返回值将得到不正确的结果,因些建议在定义中断函数的时将其定义为void 类型,明确说明没有返回值。

4.任何情况下都不能直接调用中断函数,否则会主生编译出错。

5.如果中断函数中用到了浮点运算,必须保存浮点寄存器的状态。当没有其它的程序执行浮点运算时(即只有中断中用到浮点运算),可以不用保存。

6.如果中断函数中调用了其它函数,则被调用的函数所使用的寄存器组必须与中断函数相同,用户必须保证按要求使用相同的寄存器组,否则会产生不正确的结果,这一点必须引起足够的注意,如果定义中断函数时没有使用using选项,则由编译器选择一个寄存器组作绝对寄存器访问。另外,不断的产生不可预测,中断函数对其它函数的调用可能形成递规调用,需要时,可将被中断调用的其它函数定义为再入函数。

浅析函数的递规调用与再入函数:

函数的递规调用:在调用一个函数的过程中双直接或间接的调用该函数本身;

再入函数:一种可以在函数体内直接或间接调用其自身的一种函数。

C51编译器采用一个扩展关键字reentrant 作为定义函数时的选项,需要将一个函数定义为再入函数时,只要在函数名后加上关键字reentrant即可。空不空格以及空几格都无所谓。

再入函数剖析:

再入函数可被递归调用,无论何时,包括中断服务函数在内的任何函数都可调用再入函数。与非再入函数的参数传递和局部就是的存储分配方法不同,C51编译器为每个再入函数都生成一个模拟栈。模拟栈所在的存储器空间根据再入函数的存储模式的不同,可以分配到DATA,PDATA 或XDATA。

对再入函数有如下规定:

1.再入函数不能传送bit类型的参数。也不能定义一个局部位变量,再入函数不能包括位操作以及8051系列单片机的可位寻址区。

2.与PL/ M51兼容的函数,不能具有reentrant属性,也不能调用再入函数。

3.编译时,在存储器模式的基础上,为再入函数在内部或外部存储中建立一个模拟堆栈区,称为再入栈,再入函数的局部变量及参数被放在再入栈中,从而使得再入函数可以进行递规

调用。再非再入函数的局部变量被放在再入栈之外的暂存区内,如果对非再入函数进行递规调用,则上次调用时使用的局部变量数据将被覆盖。

4.在同一个程序中可以定义和使用不同存储器模式的再入函数,任意模式的再入函数不能调用不同模式的再入函数,但可以任意调用非再入函数。

5.在参数的传递上,实际参数,可以传递给间接调用的再入函数,无再入属性的间接调用函数不能包含调用参数。但是可以使用定义的全局变量来进行参数传递。

四、C51指针深度剖析(非常重要,嵌入式系统开发人员必须要掌握的内容)

注意:由于篇幅所限,本人暂时不打算讨论抽象指针的内容。但是你必须上网或去图书馆找找关于抽象指针的资料好好看看,抽象指针很有用的。

指针是C语言中的一个重要概念,使用也十分普遍,正确使用指针类型数据可以有效的表示复杂的数据结构,直接处理内存地址,而且可以更为有效的使用数组。

在C语言中,为了能够实现直接对内存单元的操作,引入了指针类型的数据,指针类型数据是专门用来确定其它数据类型的地址的,因此一个变量的地址就被称为该变量的指针如:一个整形变量i 存放在内存单元40H中,则该内存单元地址40H就是变量i 的指针。如

果有一个变量专门用来存放另一个变量的地址,则称之为“指针变量”

变量指针与指针变量

变量的指针:是指某个变量的地址,而一个指针变量里面存放的是另一个变量在内存

中的地址。拥有这个地址的变量则称为该指针变量所指向的变量。所以每个变量都有它自己的指针(地址),而每一个指针变量都是指向另一个变量的。C语言中用符号“*”来表示“指向”,如下:

i=50;

*ip=50;

如果指针ip这个指针变量指向i那么,两个赋值表达或同义,第二个表达式可以解释为“给指针变量ip所指向的变量赋值50”。

(1).指针变量的定义

指针变量的定义与一般变量的定义类似,其一般形式如下:

数据类型[存储器类型] * 标识符;

标识符,是所定义的指针变量名

数据类型,说明了该指针变量所指向的变量类型

存储器类型,是可选的,它是C51编译器的一种扩展,如果带有此选项,指针被定义为基于存储器的指针,无此选项时,被定义为一般指针,这两种指针的区别在于它们的存储字节不同。

一般指针:占用三个字节,第一个字节存放该指针存储器类型的编码,第二和第三个字节分别存放该指针的高位和低位地址的偏移量

存储器类型IDATA XDATA PDATA DATA CODE

编码值 1 2 3 4 5

基于存储器指针:则该指针长度可为一个字节,也可为两字节

一个字节:(存储器类型idata data pdata)

两个字节:(存储器类型为code xdata)

注:在定义指针变量时最好指定其为基于存储器的指针,这个生成的汇编代码长精练一些,而且也节省空间(读者可自行到C51中写一个程序,查看其反汇编程序)但在一些函数调用的参数中指针需要采用一般指针,为此C51编译器允许这两种指针相互转换,转换规则如下:

一般指针转换成基于存储器指针,采取截断,基于存储器类型指针转换成一般指针采用扩展的。

(2).指针变量的引用

指针变量是含有一个数据对象地址的特殊变量,指针变量中只能存放地址与指针变量有关的两个运算符:

& 取地址运算符

* 间接访问运算符

&a为取变量a的地址,*P为指针变量P所指向的变量。如下:

int i , x, y;

int *pi,*px,*py;

pi=&i; //将变量i的地址赋给指针变量pi,也即pi指向i

px=&x;

py=&py;

*pi=0; //等价于i=0

*px+=6; //等价于i+=6

(*py)++; //等价于i++

注:指向同类数据的指针之间可以相互赋值。如pi=px;

(3).指针变量作为函数的参数

函数的参数不仅可以是整型,字符型等数据,还可以是指针类型,指针变量作为函数的参数的作用是将一个变量的地址传到另一个函数中去,地址传递是双向的,即主调用函数不仅可以向被调用函数传递参数,而且还可以从被调用函数返回其结果。下面通过一个简单的示例来进行说明。

#include

swap(int *pi,int *pj)

{

int temp;

temp=*pi;

*pi=*pj; //把指针变量pj所指向的变量的值送给pi所指向的变量

*pj=temp;

}

main( )

{

int a,b;

int *pa, *pb;

a=9;

b=7;

pa=&a;

pb=&b;

if(a

printf(“\n max=%d,min=%d \n”,a,b);

}

上程序上定义了一个swap( )函数,两个形参为指针变量,在调用函数时,所用的实参也是指针变量,在调用开始,实参变量将它的值传递给形参变量,采取的仍然是“值传递”方式,但这时传递的是指针的值(地址),传递后,形参pi的值为&a,pj的值为&b,即指针变量*pi 和*pa都指向了a, *pj和*pb指向了b。接着使*pj与*pi的值互换,从而达到了实现了a,和b值的互换。虽然函数返回时,pi pj被释放而不存在,但main函数中a 与b 的值已经交换。

(4).数组的指针

在C语言中,指针与数组有着十分密切的关系,任何能够用数组实现的运算都可以通过指针来完成,例如定义一个具有十个元素的整形数据可以写成:

int a[10];

数组名a表示元素a[0]的地址,而*a 则表示a所代表地址中的内容,即a[0].

如果定义一个指向整形变量的指针pa并赋以数组a中的第一个元素a[0]的地址;

int *pa;

pa=&a[0]; //也可写成pa=a;

则可通过指针pa来操作数组a了,即可用*pa代表a[0];*(pa+i)代表a[i],也可以上pa[0];pa[1];pa[2]……pa[9]的形式

(5).字符数组的指针

用指针来描述一个字符数组是十分方便的,字符串是以字符数组的形式给出的,并且每个字符数组都是以转义字符…\0?作为字符串的结束标志。因此在判断一个字符数组是否结束时,通常不采用计数的方法,而是以是否读到转义字符…\0?来判别。利用这个特点,可以很方便的用指针处理字符数组。

示例如下:

#include

main()

{

char *s1;

char xdata *s2;

char code str[]={“how are you?”};

s1=str;

s2=0x1000;

while((*s2=*s1)!=?\0?)

{

s2++;

s1++;

}

s1=str;

s2=0x1000;

printf(“%s\n,%s\n”,s1,s2);

}

注:任何一个数组及其数组元素都可以用一个指针及其偏移值来表示,但要注意的是,指针是一个变量,因此像上例中的赋值运算s1=str, s2=0x1000都是合法的。而数组名是一个常量,不能像变量那样进行运算,即数组的地址是不能改变的。如上面程序中的语句

char code str[]={“how are you?”};

是将字符串“how are you?”置到数组str中作为初值,而语句s1=str则是将数组str的首地址,即指向数组str的指针赋给指针变量s1,如果对数组进行如下的操作:

str=s1;

str++;

都是错误的。

(6).指针的地址计算

指针的地址的计算包括以下几个方面:

1 赋初值

指针变量的初值可以是NULL(零),也可以是变量,数组,结构及函数等的地址,例如

int a[10],b[10];

float fbuf[100];

char *cptr1=NULL;

char *cptr2=&ch;

int *iptrl=&a[5];

int *iptr2=&b;

float *flptr1=fbuf;

2 指针与整数的加减

单片机课后习题答案

第一章单片机的概述 1、除了单片机这一名称外,单片机还可称为(微控制器)和(嵌入式控制器)。 2、单片机与普通微型计算机的不同之处在于其将(CPU)、(存储器)和(I/O口)三部分,通过内部(总线)连接在一起,集成于一块芯片上。 3、在家用电器中使用单片机应属于微型计算机的(B)。 A、辅助设计应用 B、测量、控制应用 C、数值计算应用 D、数据处理应用 4、微处理器、微计算机、微处理机、CPU、单片机、嵌入式处理器它们之间有何区别? 答:微处理器、微处理机和CPU它们都是中央处理器的不同称谓,微处理器芯片本身不是计算机。而微计算机、单片机它们都是一个完整的计算机系统,单片机是集成在一个芯片上的用于测控目的的单片微计算机。嵌入式处理器一般意义上讲,是指嵌入系统的单片机、DSP、嵌入式微处理器。目前多把嵌入式处理器多指嵌入式微处理器,例如ARM7、ARM9等。嵌入式微处理器相当于通用计算机中的CPU。与单片机相比,单片机本身(或稍加扩展)就是一个小的计算机系统,可独立运行,具有完整的功能。而嵌入式微处理器仅仅相当于单片机中的中央处理器。为了满足嵌入式应用的特殊要求,嵌入式微处理器虽然在功能上和标准微处理器基本是一样的,但在工作温度、抗电磁干扰、可靠性等方面一般都做了各种增强。 5、MCS-51系列单片机的基本型芯片分别为哪几种?它们的差别是什么? 答:MCS-51系列单片机的基本型芯片分别为:8031、8051和8751。它们的差别是在片内程序存储器上。8031无片内程序存储器、8051片内有4K字节的程序存储器ROM,而8751片内有集成有4K字节的程序存储器EPROM。 6、为什么不应当把8051单片机称为MCS-51系列单片机? 答:因为MCS-51系列单片机中的“MCS”是Intel公司生产的单片机的系列符号,而51系列单片机是指世界各个厂家生产的所有与8051的内核结构、指令系统兼容的单片机。 7、AT89S51单片机相当于MCS-51系列单片机中哪一种型号的产品?“s”的含义是什么? 答:相当于MCS-51系列中的87C51,只不过是AT89S51芯片内的4K字节Flash 存储器取代了87C51片内的4K字节的EPROM。“s”表示含有串行下载的Flash 存储器。 8、什么是嵌入式系统? 答:广义上讲,凡是系统中嵌入了“嵌入式处理器”,如单片机、DSP、嵌入式微处理器,都称其为“嵌入式系统”。但多数人把“嵌入”嵌入式微处理器的系统,称为“嵌入式系统”。目前“嵌入式系统”还没有一个严格和权威的定义。目前人们所说的“嵌入式系统”,多指后者。 9、嵌入式处理器家族中的单片机、DSP、嵌入式微处理器各有何特点?它们的应用领域有何不同? 答:单片机体积小、价格低且易于掌握和普及,很容易嵌入到各种通用目的的系统中,实现各种方式的检测和控制。单片机在嵌入式处理器市场占有率最高,最大特点是价格低,体积小。DSP是一种非常擅长于高速实现各种数字信号处

微机原理习题库(51单片机)含答案

第一章单片机概述与结构 一、选择题 1.访问片外部数据存储器时,不起作用的信号是(C)。 A./RD B./WE C./PSEN D.ALE 2.51单片机P0口用作输出时,应外接(A )。 A.上拉电阻B.二极管C.三极管D.下拉电阻 3.进位标志CY在( C )中。 A.累加器B.算逻运算部件ALU C.程序状态字寄存器PSW D.DPTR 4.堆栈数据的进出原则是(D )。 A.先进先出B.进入不出C.后进后出D.先进后出 5.51单片机系统中,若晶振频率为6MHz,一个机器周期等于(D )μs。 A.1.5 B.3 C.1 D.2 6.在家用电器中使用单片机应属于微计算机的( B )。 A.辅助设计应用B.测量、控制应用C.数值计算应用D.数据处理应用7.PC的值是(C )。 A.当前正在执行指令的前一条指令的地址B.当前正在执行指令的地址 C.当前正在执行指令的下一条指令的地址D.控制器中指令寄存器的地址 8.单片机应用程序一般存放在( B )中。 A.RAM B.ROM C.寄存器D.CPU 9.在堆栈操作中,当进栈数据全部弹出后,这时SP应指向( D ) A.栈底单元B.7FH单元C.栈底单元地址加1 D.栈底单元地址减1 10.51单片机的并行I/O口信息有两种读取方法:一种是读引脚,还有一种是(A )。 A.读锁存器B.读数据库C.读A累加器D.读CPU 二、填空题 1.单片机复位后,SP、PC和I/O口的内容分别为07H\000H\FFH 。 2.单片机有四个工作寄存器区,由PSW状态字中的RS1和RS0两位的状态来决定。单片机复位后,若执行SETB RS0指令,此时只能使用 1 区的工作寄存器,地址范围是08H---0FH 。 3.51单片机驱动能力最强的并行端口为P0端口。 4.51单片机PC的长度为16位,SP的长度为___8____位,DPTR的长度为_16__位。 5.访问51单片机程序存储器地址空间、片内数据存储器地址、片外数据存储器地址的指令分别为__movc_____,MOV和_movx______。 6.若A中的内容为63H,那么P标志位的值为1 。 7.当扩展外部存储器或I/O口时,P2口用作高八位地址总

第1章 MSC-51单片机结构

第1章MCS-51单片机结构 1.1 MCS-51 单片机内部结构 1.2 存储器 1.3 特殊功能寄存器 1.4 时钟电路与复位电路 1.5 引脚功能 1.6 小结

1.1 MCS-51 单片机内部结构1.1.1 概述 MCS-51系列单片机型号: 普通型(51子系列) 8031、8051、8751、89C51、89S51等。 增强型(52子系列) 8032、8052、8752、89C52、89S52等。 它们的结构基本相同,其主要差别反映在存储器的配置上。 8031:片内没有程序存储器 8051:内部有4KB的掩模ROM程序存储器 8751:内部有4KB EPROM 89C51: 有4KB的FLASH EEPROM 89S51:有4KB的FLASH EEPROM,可在线编程增强型的存储容量为普通型的一倍。 本课以8XX51 系列的单片机为代表讲授。

图中“/” 两边分别为基本型/增强 P3P1P2可编程串行I/O 口P0基准频率源128/256B 数据存储器4KB/8KB 程序存储器2/3个16位定时/计数器振荡器及 时钟电路 CPU 64KB 总线扩展控制 可编程并行I/O 口内部中断计数脉冲串行输出串行输入MCS-51系列单片机内部结构

1.1.2 CPU CPU是单片机的核心部件,由运算器和控制器等部件组成。 1. 运算器 运算器的功能: 算术运算:加、减、乘、除、加1、减1、比较、BCD码十进制调整等。 逻辑运算:与、或、异或、求反、循环等逻辑操作。 位操作:内部有布尔处理器,它以进位标志位C为位累加器,用来处理位操作。置‘1’、清‘0’ 、取反、位判断等。 操作结果的状态信息送至状态寄存器(PSW Program Status Word Register)。

(完整版)单片机第一章习题

第一章 一、判断题 ()1.MCS—51单片机是高档16位单片机。 ()2.单片机的CPU从功能上可分为运算器和存贮器。 ()8.MCS—51的程序存贮器用于存放运算中间结果。 ()9.MCS—51的数据存贮器在物理上和逻辑上都分为两个地址空间:一个是片内的256字节的RAM,另一个是片外最大可扩充64K字节的RAM。 ()10.单片机的复位有上电自动复位和按钮手动复位两种,当单片机运行出错或进入死循环时,可按复位键重新启动。 ()11.CPU的时钟周期为振荡器频率的倒数。 ()12.单片机的一个机器周期是指完成某一个规定操作所需的时间,一般情况下,一个机器周期等于一个时钟周期组成。 ()13.单片机的指令周期是执行一条指令所需要的时间。一般由若干个机器周期组成。 ()14.单片机系统扩展时使用的锁存器,是用于锁存高8位地址。 ()15.MCS—51单片机上电复位后,片内数据存储器的内容均为00H。 ()16.当8051单片机的晶振频率为12MHZ时,ALE地址锁存信号端的输出频率为2MHZ的方脉冲。()17.8051单片机片内RAM从00H~1FH的32个单元,不仅可以作工作寄存器使用,而且可作为RAM 来读写。 ()18.MCS—51单片机的片内存贮器称为程序存贮器。 ()19.MCS—51单片机的数据存贮器是指外部存贮器。 ()20.MCS—51单片机的特殊功能寄存器集中布置在片内数据存贮器的一个区域中。 ()6.8051的累加器ACC是一个8位的寄存器,简称为A,用来存一个操作数或中间结果。 ()7.8051的程序状态字寄存器PSW是一个8位的专用寄存器,用于存程序运行中的各种状态信息。 二、单项选择题 1.MCS—51单片机的CPU主要的组成部分为。 A.运算器、控制器 B.加法器、寄存器 C.运算器、加法器 D.运算器、译码器 2.单片机能直接运行的程序叫。 A.源程序 B。汇编程序 C。目标程序 D。编译程序 3.单片机中的程序计数器PC用来。 A.存放指令 B.存放正在执行的指令地址 C.存放下一条指令地址D.存放上一条指令地址 4.单片机上电复位后,PC的内容和SP的内容为。 A.0000H,00H B。0000H,07H C。0003H,07H D。0800H,08H 5.单片机8031的ALE引脚是。 A.输出高电平 B。输出矩形脉冲,频率为fosc的1/6 B.C.输出低电平 D。输出矩形脉冲,频率为fosc的1/2 6.单片机8031的EA引脚。 A.必须接地 B。必须接+5V C。可悬空 D。以上三种视需要而定 7.访问外部存贮器或其它接口芯片时,作数据线和低8位地址线的是 A 。 A.P0口 B。P1口 C。P2口 D。P0口和 P2口 8.PSW中的RS1和RS0用来。 A.选择工作寄存器区号 B。指示复位 C。选择定时器 D。选择工作方式

51单片机C语言程序设计复习资料

2013-2014学年上期51单片机C语言程序设计重修复习提纲考试方式:闭卷考试。 考试题型: 填空题(每空1分,共18分);单项选择题(每空2分,共18分);问答及计算题(每题4分,共16分);编程及程序阅读题(5小题,共48分)。 考试分数: 卷面成绩70%+平时成绩15%+实验成绩15%,未缺席、无课堂违纪、作业全交且认真完成的同学平时成绩可获得满分,缺席一次平时成绩扣30分,实验好评次数3次以上且实验报告全优的同学实验成绩可得满分,实验缺席一次扣30分。缺席实验和旷课共3次以上者,无考试资格。 考试时间: 18周周一(12月30日)下午14:00:16:00,考试地点:具体考室另行通知希望大家认真复习,认真听讲,不懂就问,考试成绩不及格允许查卷,如查卷卷面批阅无误成绩不做更改。 编程题为实验或实验类似的题目有3题,其余2题也取自课堂讲授例题,请务必认真复习。第一章单片机概述及单片机知识回顾 掌握什么是单片机、单片机的应用、常见单片机类型、十进制、十六进制、二进制数制转换知识。掌握单片机的硬件组成、CPU的结构、程序计数器PC的功能、存储器结构、机器周期的计算、会画出单片机的最小系统电路图及回答单片机最小系统的组成。 第二章C51语言程序设计基础(本章填空题和选择题比重较大请务必认真复习)掌握C51语言进行软件开发与汇编语言相比的优点、掌握C51的数据类型、特殊功能位的定义、C51的基本运算(位运算重点复习)、数组的定义、C51的结构及函数。 第三章AT89S51片内并行端口及编程(本章有编程题) 掌握P0-P3并行端口的特点,会开关量检测及流水灯程序的编程。 第四章AT89S51单片机的中断系统(本章有编程题) 掌握中断系统的结构、中断请求响应被满足的条件、外部中断的触发选择方式、外部中断的使用与编程。 第五章AT89S51单片机的定时器/计数器(本章有编程器) 掌握定时器的结构,TOMD及TCON的使用,定时器方式0和方式1的特点、会计算定时器初值,会用定时器中断产生PWM波形,会用定时器对外部事件进行计数。 第六章AT89S51单片机的串行口(本章有计算题) 掌握串行通信的基础知识(课本没有的内容请参照课堂讲授笔记或PPT)、串行口的四种工作方式的特点、会计算奇偶校验码、会根据波特率计算T1的初值。 第七章AT89S51单片机与输入/输出外设接口(本章有编程题) 掌握数码管动态显示的原理、掌握矩阵式键盘的原理与编程(矩阵键盘编程必考,但不会考4X4键盘)。 第八章AT89S51单片机与D/A与A/D转换器的接口(本章有编程题) 掌握AD与DA转换的接口、ADC和DAC的技术指标、常用AD和DA转换器。掌握ADC0809和TLC2543的使用与编程(2器件其中之一有编程题)。 第九章AT89S51单片机应用系统与调试(本章有编程题) 掌握单片机应用系统的软件抗干扰方法。

51单片机C语言入门教程详细解说

单片机c语言入门 相信很多爱好电子的朋友,对单片机这个词应该都不会陌生了吧。不过有些朋友可能只听说他叫单片机,他的全称是什么也许并不太清楚, 更不用说他的英文全称和简称了。单片机是一块在集成电路芯片上集成了一台有一定规模的微型计算机。简称为:单片微型计算机或单片机 (Single Chip Computer)。单片机的应用到处可见,应用领域广泛,主要应用在智能仪表、实时控制、通信、家电等方面。不过这一切都没 什么关系,因为我(当然也包括任何人)都是从不知道转变成知道的,再转变成精通的。现在我只想把我学习单片机的经历,详细地讲叙给大 家听听,可能有些大虾会笑话我,想:那么简单的东西还在这里卖弄。但是你错了,我只是把我个人学习的经历讲述一遍而已,仅仅对那些想 学习单片机,但又找不到好方法或者途径的朋友,提供一个帮助,使他们在学习过程中,尽量少走些弯路而已! 首先,你必须有学习单片机的热情,不是说今天去图书馆看了一个下午关于单片机的书,而明天玩上半天,后天就不知道那个本书在讲什 么东西了。还是先说说我吧,我从大二的第一个学期期末的时候才开始接触单片机,但在这之前,正如上面所说的:我知道有种芯片叫单片机, 但是具体长成什么样子,却一点也不知道!看到这里很多朋友一定会忍不住发笑。嘿嘿,你可千万别笑,有些大四毕业的人也同样不知道单片 机长成什么样子呢!而我对单片机的痴迷更是常人所不能想象的地步,大二的期末考试,我全放弃了复习,每当室友拿着书在埋头复习的时候, 我却捧着自己从图书馆借的单片机书在那看,虽然有很多不懂,但是我还是坚持了下来,当时我就想过,为了单片机值不值得我这样去付出, 或许这也是在一些三流学校的好处吧,考试挂科后,明年开学交上几十元一门的补考费,应该大部分都能过了。于是,我横下一条心,坚持看 我的单片机书和资料。 当你明白了单片机是这么一回事的时候,显而易见的问题出来了:我要选择那种语言为单片机编写程序呢?这个问题,困扰了我好久。具 体选择C51还是A51呢?汇编在我们大二之前并没有开过课,虽然看着人家的讲解,很容易明白单片机的每一时刻的具体工作情况,但是一合上 书或者资料,自己却什么也不知道了,根本不用说自己写程序了。于是,我最终还是决定学C51,毕竟C51和我们课上讲的C语言,有些类似, 编程的思想可以说是相通的。而且C51还有更大的优点就是编写大程序时的优越性更不言而喻,当然在那时,我并没有想的那么深远,C51的特 点,还是在后来的实践过程中,渐渐体会到的!朋友如果你选择了C51,那么请继续往下看,如果你选择了A51,那么你可以不要看了!因为下面讲 的全是C方面的,完全在浪费你的时间! 呵呵^_^ 第二,既然你想学好单片机,你必须得舍得花钱,如果不买些芯片回来自己动手焊焊拆拆的(但是在后期会介绍给大家一个很好用的硬件 仿真软件,并不需要你用实验板和仿真器了,直接在你的PC上完成,但是软件毕竟是软件,从某个特定的意义上来说是并不能代替硬件的),即使

单片机原理及应用第一章课后答案

作业答案0-1 绪论 2.什么叫单片机?其主要特点有哪些? 解: 将微处理器(CPU)、存储器(存放程序或数据的ROM和RAM)、总线、定时器/计数器、输入/输出接口(I/O口)、中断系统和其他多种功能器件集成在一块芯片上的微型计机,称为单片微型计算机,简称单片机。 单片机的特点:可靠性高、便于扩展、控制功能强、具有丰富的控制指令、低电压、低功耗、片内存储容量较小、集成度高、体积小、性价比高、应用广泛、易于产品化等。6.举例说明生活中应用单片机的例子。 解: 生活中单片机无处不在:如洗衣机的控制主板、太阳能的温度控制器,电动车的控制器,电磁炉、(高级)电冰箱的控制系统、手机、电视遥控器、空调、洗衣机、微波炉、冰箱、热水器、电子称、电子表、计算器、汽车钥匙、可视门禁、公交车报站器、公交车刷卡器、红绿灯控制器等等。欧美日等国家,一个家庭中所拥有的单片机数量平均到100-120片。 单片机有着广泛的应用领域: (1) 单片机在智能仪器仪表中的应用; (2) 单片机在工业测控中的应用; (3) 单片机在计算机网络和通讯技术中的应用; (4) 单片机在日常生活及家电中的应用; (5) 单片机在办公自动化方面。 目前单片机渗透到我们生活的各个领域,几乎很难找到哪个领域没有单片机的踪迹。导弹的导航装置,飞机上各种仪表的控制,计算机的网络通讯与数据传输,工业自动化过程的实时控制和数据处理,广泛使用的各种智能IC卡,民用豪华轿车的安全保障系统,录象机、摄象机、全自动洗衣机的控制,以及程控玩具、电子宠物、自动控制领域的机器人、智能仪表、医疗器械等等。 第1章MCS-51单片机的结构与原理 15. MCS-51系列单片机的引脚中有多少根I/O线?它们与单片机对外的地址总线和数据总线之间有什么关系?其地址总线和数据总线各有多少位?对外可寻址的地址空间有多大?解: MCS-51系列单片机有4个I/O接口,每个接口都是8位双向口,共占32根引脚。每个接口都包括一个锁存器(即专用寄存器P0~P3)、一个输入驱动器和输入缓冲器。通常把4个端口称为P0~P3。在无片外扩展的存储器的系统中,这4个接口的每一位都可以作为双向通用I/O端口使用。在具有片外扩展存储器的系统中,P2口作为高8位地址线,P0口分时作为低8位地址线和双向数据总线。 MCS-51系列单片机数据总线为8位,地址总线为16位,对外可寻址空间为64KB。25. 开机复位后,CPU使用的是哪组工作寄存器(R0-R n)?它们的地址是什么?CPU如何确定和改变当前工作寄存器组(R0-R n)? 解: 开机复位后,CPU使用的是第0组工作寄存器。其地址是00H-07H。CPU通过对程序状态字PSW中RS1和RS0的设置来确定和改变当前工作寄存器组。 27. MCS-51单片机的时钟周期、机器周期、指令周期是如何定义的?当主频为12MHz的时

单片机第一章

第一章绪论 1.1单片机的产生和发展 1.1.1什么是单片机 所谓单片机,就是把中央处理器CPU(Central Processing Unit)、存储器(Memory)、定时器、I/0(Input/Output)接口电路等一些计算机的主要功能部件集成在一块集成电路芯片上的微型计算机。 中文“单片机”的称呼由英文名称“SingleChip Microcomputer”直接翻译而来。 单片机把微型计算机的各主要部分集成在一块芯片上,大大缩短了系统内信号传送距离,从而提高了系统的可靠性及运行速度。因而在工业测控领域中,单片机系统是最理想的控制系统。所以,单片机是典型的嵌入式系统,是嵌入式系统低端应用的最佳选择。 1.1.2单片机技术发展的四个阶段 单片机的发展经历了探索---完善---MCU化---百花齐放四个阶段。 1.芯片化探索阶段 20世纪70年代,美国的Fairchild(仙童)公司首先推出了第一款单片机F-8; 随后Intel公司推出了影响面大、应用更广的MCS48单片机系列。MCS48单片机系列的推出标志着在工业控制领域,进入到智能化嵌入式应用的芯片形态计算机的探索阶段。这就是Single Chip Microcomputer的诞生年代,单片机一词即由此而来。这一时期的特点是: ◆嵌入式计算机系统的芯片集成设计; ◆少资源、无软件,只保证基本控制功能。 2.结构体系的完善阶段 在MCS-48探索成功的基础上很快推出了完善的、典型的单片机系列MCS-51。MCS-51系列单片机的推出,标志Single Chip Microcomputer体系结构的完善。它在以下几个方面奠定了典型的通用总线型单片机的体系结构。 ①完善的总线结构: ◆并行总线:8位数据总线、16位地址总线及相应的控制总线,两个独立的地址空间; ◆串行总线:通信总线,扩展总线。 ②完善的指令系统: ◆具有很强的位处理功能和逻辑控制功能,以满足工业控制等方面的需要; ◆功能单元的SFR(特殊功能寄存器)集中管理。 ③完善的MCS-51成为SCMC的经典体系结构。 日后,许多电气商在MCS-51的内核和体系结构的基础上,生产出各具特色的单片机。 3.从SCMC向MCU化过渡阶段 Intel公司推出的MCS96单片机,将一些用于测控系统的模数转换器(ADC)、程序运行监视器(WDT)、脉宽调制器(PWM)、高速I/O口纳入片中,体现了单片机的微控制器特征。MCS-51单片机系列向各大电气商的广泛扩散,许多电气商竞相使用80C51内核,将许多测控系统中使用的电路技术、接口技术、可靠性技术应用到单片机中;随着单片机内外围功能电路的增强,强化了智能控制器特征。微控制器(Microcontrollers)成为单片机较为准确表达的名词。其特点是: ①满足嵌入式应用要求的外围扩展,如WDT、PWM、ADC、DAC、高速I/0口等。 ②众多计算机外围功能集成,如:

51单片机声控智能小车C语言程序设计代码

51单片机声控智能小车C语言程序设计代码 #include #define uint unsigned int #define uchar unsigned char unsigned char code LEDShowData[]={0x9F,0x25,0x0D,0x99,0x49,0x41,0x1F,0x01,0x19,0x03}; sbit LED=P0^7; sbit m1a=P0^0; sbit m1b=P0^1; sbit m2a=P0^2; sbit m2b=P0^3; sbit B1=P0^4; uint m,n,x,y,z; void delayB1() { unsigned int delaytime=500; while(delaytime--); return; } void delayLED(uint ms) { uint a,b; for(a=0;a

TR0=1;//启动T0定时器 TR1=0;//关闭T1定时器 m1a=1; m2a=1; } void timer2(void) interrupt 5 { TF2=0;//软件对T2标志位清零 n++; if(n==250)//n控制查询周期时间 { n=0; switch(m) { case 1://低速挡,占空比77.8% { P2=LEDShowData[0];//七段数码管显示1 TH0=210; TL0=210;//对T0定时器赋初值 TH1=240; TL1=240;//对T1定时器赋初值 x=m; m=0; z=0; ET0=1; ET1=1; TR0=1;//启动T0定时器 break;//跳出switch } case 2://高速挡,占空比99.6% { P2=LEDShowData[1];//七段数码管显示2 TH0=1; TL0=1; //对T0定时器赋初值 TH1=255; TL1=255; //对T1定时器赋初值 x=m+1; m=0; z=0; ET0=1; ET1=1; TR0=1; //启动T0定时器 break;//跳出switch }

第1章作业-单片机原理与应用及C51程序设计(第4版)-谢维成-清华大学出版社

习题 1.给出下列有符号数的原码、反码和补码(假设计算机字长为8位)。 +53-88-7+104 答:【+53】原=00110101,【+53】反=00110101,【+53】补=00110101 【-88】原=11011000,【-88】反=10100111,【-88】补=10101000 【-7】原=10000111,【-7】反=11111000,【-7】补=11111001 【+104】原=01101000,【+104】反=01101000,【+104】补=01101000 2.指明下列字符在计算机内部的表示形式。 AsENdfJFmdsv120 答:41H73H45H4EH64H66H4AH46H6DH64H73H76H31H32H30H 3.什么是单片机? 答:单片机是把微型计算机中的微处理器、存储器、I/O接口、定时器/计数器、串行接口、中断系统等电路集成到一个集成电路芯片上形成的微型计算机。因而被称为单片微型计算机,简称为单片机。 4.与一般微型计算机相比,单片机有何特点? 答:主要特点如下: 1)在存储器结构上,单片机的存储器采用哈佛(Harvard)结构 2)在芯片引脚上,大部分采用分时复用技术 3)在内部资源访问上,采用特殊功能寄存器(SFR)的形式 4)在指令系统上,采用面向控制的指令系统 5)内部一般都集成一个全双工的串行接口 6)单片机有很强的外部扩展能力 5.简述存储器的哈弗结构。 答:哈佛(Harvard)结构,将程序和数据分别用不同的存储器存放,各有自己的存储空间,分别用不同的寻址方式。存放程序的存储器称为程序存储器,存放数据的存储器称为数据存储器。程序存储器一般由只读存储器芯片构成,所以又可简称为ROM,数据是随时变化的,所以数据存储器一般用随机存储器构成,所以又可简称为RAM。 6.简述51单片机有哪些系列。 答:主要有如下系列: 1.MCS-51系列单片机 2.ATMEL公司的AT89系列单片机 3.STC系列51单片机 4.SST公司的SST89系列单片机 5.Silicon Labs公司51单片机 6.华帮W77系列、W78系列单片机

51单片机C语言变量定义

单片机教程,51单片机C语言学习 第六课变量 上课所提到变量就是一种在程序执行过程中其值能不断变化的量。要在程序中使用变量必须先用标识符作为变量名,并指出所用的数据类型和存储模式,这样编译系统才能为变量分配相应的存储空间。定义一个变量的格式如下:[存储种类]数据类型[存储器类型]变量名表 在定义格式中除了数据类型和变量名表是必要的,其它都是可选项。存储种类有四种:自动(auto),外部(extern),静态(static)和寄存器(register),缺省类型为自动(auto)。这些存储种类的具体含义和用法,将在第七课《变量的存储》中进一步进行学习。 而这里的数据类型则是和我们在第四课中学习到的名种数据类型的定义是一样的。说明了一个变量的数据类型后,还可选择说明该变量的存储器类型。存储器类型的说明就是指定该变量在C51硬件系统中所使用的存储区域,并在编译时准确的定位。表6-1中是KEIL uVision2所能认别的存储器类型。注意的是在AT89C51芯片中RAM只有低128位,位于80H到FFH的高128位则在52芯片中才有用,并和特殊寄存器地址重叠。特殊寄存器(SFR)的地址表请看附录二 如果省略存储器类型,系统则会按编译模式SMALL,COMPACT或LARGE所规定的默认存储器类型去指定变量的存储区域。无论什么存储模式都可以声明变量在任何的8051存储区范围,然而把最常用的命令如循环计数器和队列索引放在内部数据区可以显著的提高系统性能。还有要指出的就是变量的存储种类与存储器类型是完全无关的。 SMALL存储模式把所有函数变量和局部数据段放在8051系统的内部数据存储区这使访问数据非常快,但SMALL存储模式的地址空间受限。在写小型的应用程序时,变量和数据放在data内部数据存储器中是很好的因为访问速度快,但在较大的应用程序中data区最好只存放小的变量、数据或常用的变量(如循环计数、数据索引),而大的数据则放置在别的存储区域。 COMPACT存储模式中所有的函数和程序变量和局部数据段定位在8051系统的外部数据存储区。外部数据存储区可有最多256字节(一页),在本模式中外部数据存储区的短地址用@R0/R1。 LARGE存储模式所有函数和过程的变量和局部数据段都定位在8051系统的外部数据区外部数据区最多可有64KB,这要求用DPTR数据指针访问数据。 之前提到简单提到sfr,sfr16,sbit定义变量的方法,下面我们再来仔细看看。

新概念51单片机C语言教程例题

目录 例编写程序,点亮第一个发光二极管(P27 )错误!未定义书签。例利用for 语句延时特性,编写第一个发光二极管以间隔1S 亮灭闪动的程序(P42 )错误!未定义书签。 例编写程序使第一个发光二极管以间隔500ms亮灭闪动。(P48 )错误!未定义 书签。 例编写程序使第一个二极管以亮200ms灭800ms的方式闪动。P49)错误味定义书签。 例利用C51自带库_crol_(),以间隔500ms实现流水灯程序(P53)错误味定义书签。 例编写程序使第一个数码管显示8(P59 )....... 错误!未定义书签。 例让实验板上6个数码管同时点亮,依次显示0到F,时间间隔为,循环下去。 (P61 )..................... 错误!未定义书签。 例第一个数码管显示 1 ,时间为,然后关闭它,立即让第二个数码管显示2,时间为,在关闭它……一直到最后一个数码管显示6,时间同样为,关闭它之后再 回来显示第一个数码管,一直循环下去。(P62 ) ... 错误!未定义书签。 例利用定时器0 工作方式1,在实验板上实现第一个发光管以1s 亮灭闪烁。 (P74 )..................... 错误!未定义书签。 例用定时器0的方式1实现个第一发光二极管以200ms间隔闪烁,用定时器1 的方式 1 实现数码管前两位59s 循环计时。(P75 )错误!未定义书签。例用数码管前两位显示一个十进制数,变化范围为00~59,开始时显示00,每按下S2键一次,数值加1;每按下S3键一次,数值减1;每按下S4键一次,数值归零;按下S5键一次,利用定时器功能使数值开始自动每秒加1,再次按下

51单片机及C语言入门教程

51单片机 及C语言入门教程 注:排成16开版式,是为了方便自已打印阅读。请不要用于非法用途。 2007.12.20

51单片机及C语言入门教程 第一课 建立您的第一个C项目 使用C语言肯定要使用到C编译器,以便把写好的C程序编译为机器码,这样单片机才能执行编写好的程序。KEIL uVISION2是众多单片机应用开发软件中优秀的软件之一,它支持众多不同公司的MCS51架构的芯片,它集编辑,编译,仿真等于一体,同时还支持,PLM,汇编和C语言的程序设计,它的界面和常用的微软VC++的界面相似,界面友好,易学易用,在调试程序,软件仿真方面也有很强大的功能。因此很多开发51应用的工程师或普通的单片机爱好者,都对它十分喜欢。 以上简单介绍了KEIL51软件,要使用KEIL51软件,必需先要安装它。KEIL51是一个商业的软件,对于我们这些普通爱好者可以到KEIL中国代理周立功公司的网站上下载一份能编译2K的DEMO版软件,基本可以满足一般的个人学习和小型应用的开发。(安装的方法和普通软件相当这里就不做介绍了) 安装好后,你是不是迫不及待的想建立自己的第一个C程序项目呢?下面就让我们一起来建立一个小程序项目吧。或许你手中还没有一块实验板,甚至没有一块单片机,不过没有关系我们可以通过KEIL软件仿真看到程序运行的结果。 首先当然是运行KEIL51软件。怎么打开?噢,天!那你要从头学电脑了。呵呵,开个玩笑,这个问题我想读者们也不会提的了:P。运行几秒后,出现如图1-1的屏幕。 图1-1启动时的屏幕

接着按下面的步骤建立您的第一个项目: (1)点击Project菜单,选择弹出的下拉式菜单中的New Project,如图1-2。接着弹出一个标准Windows文件对话窗口,如图1-3,这个东东想必大家是见了N次的了,用法技巧也不是这里要说的,以后的章节中出现类似情况将不再说明。在"文件名"中输入您的第一个C程序项目名称,这里我们用"test",这是笔者惯用的名称,大家不必照搬就是了,只要符合Windows文件规则的文件名都行。"保存"后的文件扩展名为uv2,这是KEIL uVision2项目文件扩展名,以后我们可以直接点击此文件以打开先前做的项目。 图1-2New Project菜单 图1-3文件窗口 (2)选择所要的单片机,这里我们选择常用的Ateml公司的AT89C51。此时屏幕如图1-4

单片机习题-第一章 第二章MCS—51单片机原理与结构

第一章第二章MCS—51单片机原理与结构 一、判断题 ()1.MCS—51单片机是高档16位单片机。 ()2.单片机的CPU从功能上可分为运算器和存贮器。 ()3.8051的累加器ACC是一个8位的寄存器,简称为A,用来存一个操作数或中间结果。 ()4.8051的程序状态字寄存器PSW是一个8位的专用寄存器,用于存程序运行中的各种状态信息。 ()5.MCS—51的程序存贮器用于存放运算中间结果。 ()6.MCS—51的数据存贮器在物理上和逻辑上都分为两个地址空间:一个是片内的256字节的RAM,另一个是片外最大可扩充64K字节的RAM。 ()7.单片机的复位有上电自动复位和按钮手动复位两种,当单片机运行出错或进入死循环时,可按复位键重新启动。 ()8.CPU的时钟周期为振荡器频率的倒数。 ()9.单片机的一个机器周期是指完成某一个规定操作所需的时间,一般情况下,一个机器周期等于一个时钟周期组成。 ()10.单片机的指令周期是执行一条指令所需要的时间。一般由若干个机器周期组成。 ()11.单片机系统扩展时使用的锁存器,是用于锁存高8位地址。 ()12.MCS—51单片机上电复位后,片内数据存储器的内容均为00H。 ()13.8051单片机片内RAM从00H~1FH的32个单元,不仅可以作工作寄存器使用,而且可作为RAM来读写。 ()14.MCS—51单片机的片内存贮器称为程序存贮器。 ()15.MCS—51单片机的数据存贮器是指外部存贮器。 ()16.MCS—51单片机的特殊功能寄存器集中布置在片内数据存贮器的一个区域中。 二、单项选择题

1.MCS—51单片机的CPU主要的组成部分为。 A.运算器、控制器 B.加法器、寄存器 C.运算器、加法器 D.运算器、译码器 3.单片机中的程序计数器PC用来。 A.存放指令 B.存放正在执行的指令地址 C.存放下一条指令地址 D.存放上一条指令地址 7.访问外部存贮器或其它接口芯片时,作数据线和低8位地址线的是。 A.P0口 B。P1口 C。P2口 D。P0口和 P2口 8.PSW中的RS1和RS0用来。 A.选择工作寄存器区号 B。指示复位 C。选择定时器 D。选择工作方式 9.上电复位后,PSW的值为。 A.1 B。07H C。FFH D。0 11.单片机上电复位后,堆栈区的最大允许范围是内部RAM的。 A.00H—FFH B。00H—07H C。07H—7FH D。08H—7FH 12.堆栈指针SP在内部RAM中的直接地址是。 A.00H B。07H C。81H D。FFH 13.INTEL8031的P0口,当使用外部存贮存器时它是一个。 A.传输高8位地址口 A.传输低8位地址口 C.传输高8位数据口 D.传输低8位地址/数据口 14.P0口作数据线和低8位地址线时。

51单片机C语言程序设计经典案例

项目三C51程序设计语言基础 任务1 C51程序的识读 1.C51程序结构 例3-1 P_test /********************* //注释,还可用//注释掉一行 File name:P_test.c Chip name:STC89C51RC Clock frequency:1.20MHz ***********************/ #include “reg52.h”//预处理命令,文件包含预处理命令,后缀名都是.h,标准的MCS-51单片机头文件为”reg51.h”,STC89系列单片机头文件为”reg52.h” #define unit unsigned int //宏定义预处理命令 sbit BZ=P3`7 ; sbit key=P1`0; void delay(unit ms) { unit i; while( ms --) { for(i=0;i<120;i++); } } void main(void) { while(1) { if(key==0) { BZ=0x0; delayms(10); BZ=0x1; delayms(50); P0=0xFF; } else { P0=~P0; delayms(500); } } } 2.C51的数据类型

位变量型bit 字符型无符号字符型unsigned char 有符号字符型signed char C51的数据类型整数型无符号整数型unsigned int 基本类型有符号整数型signed int 长整数型无符号长整数型unsigned long int 有符号长整数型signed long int 实数型(浮点型)单精度浮点型float 双精度浮点型double 数组类型array 结构体类型struct 构造类型共用体union 枚举enum 指针类型 空类型(void) 表3-1 C51基本数据类型的长度和值域 类型长度/bit 长度/byte 范围 位变量型bit 1 0 ,1 无符号字符型unsigned char 8 单字节0-255 有符号字符型signed char 8 单字节-128-127 无符号整数型unsigned int 16 双字节0-65536 有符号整数型signed int 16 双字节-32768-32767 无符号长整数型unsigned long int 32 四字节 有符号长整数型signed long int 32 四字节 单精度浮点型float 32 四字节 双精度浮点型double 32 四字节 一般指针类型24 三字节 3.C51的标识符和关键字 标识符是由字母、数字和下划线组成的字符串,第一个字符必须是字母或下划线,不超过32个字符。 表3-2 C51中的关键字 关键字用途说明 auto 存储种类声明用来声明局部变量 bdata 存储器类型说明可位寻址的内部数据存储器 break 程序语句退出最内层循环体 bit 位变量语句位变量的值是1(true)或0(flase)case 程序语句switch语句中的选择项 char 数据类型的声明单字节整数型或字符型数据

单片机c语言教程

第一课建立你的第一个KeilC51项目 随着单片机技术的不断发展,以单片机C语言为主流的高级语言也不断被更多的单片机爱好者和工程师所喜爱。使用C51肯定要使用到编译器,以便把写好的C程序编译为机器码,这样单片机才能执行编写好的程序。KEIL uVISION2 是众多单片机应用开发软件中优秀的软件之一,它支持众多不一样公司的MCS51架构的芯片,它集编辑,编译,仿真等于一体,同时还支持,PLM,汇编和C 语言的程序设计,它的界面和常用的微软 VC++的界面相似,界面友好,易学易用,在调试程序,软件仿真方面也有很强大的功能。本站提供的单片机c语言教程都是基于keilc51的。 下面结合8051介绍单片机C语言的优越性: ·无须懂得单片机的具体硬件,也能够编出符合硬件实际的专业水平的程序; ·不懂得单片机的指令集,也能够编写完美的单片机程序; ·不同函数的数据实行覆盖,有效利用片上有限的RAM空间; ·提供auto、static、const等存储类型和专门针对8051单片机的data、idata、pdata、xdata、code等存储类型,自动为变量合理地分配地址; ·C语言提供复杂的数据类型(数组、结构、联合、枚举、指针等),极大地增强了程序处理能力和灵活性; ·提供small、compact、large等编译模式,以适应片上存储器的大小; ·中断服务程序的现场保护和恢复,中断向量表的填写,是直接与单片机相关的,都由C编译器代办; ·程序具有坚固性:数据被破坏是导致程序运行异常的重要因素。C语言对数据进行了许多专业性的处理,避免了运行中间非异步的破坏 ·提供常用的标准函数库,以供用户直接使用; ·有严格的句法检查,错误很少,可容易地在高级语言的水平上迅速地被排掉; ·可方便地接受多种实用程序的服务:如片上资源的初始化有专门的实用程序自动生成;再如,有实时多任务操作系统可调度多道任务,简化用户编程,提高运行的安全性等等。 ·头文件中定义宏、说明复杂数据类型和函数原型,有利于程序的移植和支持单片机的系列化产品的开发; 以上简单介绍了 KEILC51 软件,要使用KEILC51软件,必需先要安装它,这也是学习单片机编程语言所要求的第一步――建立学习环境。 本站提供无限制版的keil c51下载(此处)(安装的方法在压缩包内有详细说明,这里就不做介绍了)

51单片机教程(从原理开始基于汇编)及单片机C语言教程

51单片机教程(从原理开始基于汇编)及单片机C语言教程 1.单片机可以做什么? 目前单片机渗透到我们生活的各个领域,几乎很难找到哪个领域没有单片机的踪迹。小到电话,玩具,手机,各类刷卡机,电脑键盘,彩电,冰箱,空调,电磁炉,大到汽车,工业自动控制,机器人,导弹导航装置,甚至是美国的火星车,这些设备里面都含有一个或者多个单片机。单片机的数量不仅远超过PC机,甚至比人类的数量还要多。因此,单片机的学习、开发与应用将造就一大批软硬件工程师。2. 学习单片机需要哪些基本条件? 模拟电路,数字电路基础,对C语言或汇编语言有一定的了解。当然,这些也可以在学习过程中掌握。对此这套教程均有讲解. 硬件条件的话:电脑一台,实验开发平台一套。3、单片机的结构 一台能够工作的计算机要有这样几个部份构成:CPU(进行运算、控制)、RAM(数据存储-内存)、ROM(程序存储)、输入/输出设备(例如:串行口、并行输出口等)。在个人计算机上这些部份被分成若干块芯片,安装一个称之为主板的印刷线路板上。而在单片机中,这些部份,全部被做到一块集成电路芯片中了,所以就称为单片机。单片机是一种

控制芯片,一个微型的计算机,而加上晶振,存储器,地址锁存器,逻辑门,七段译码器(显示器),按钮(类似键盘),扩展芯片,接口等那是单片机系统。天!PC中的CPU一块就要卖几千块钱,这么多东西做在一起,还不得买个天价!再说这块芯片也得非常大了。不,价格并不高,从1元人民币到几十元人民币,体积也不大,一般用40脚封装,当然功能多一些单片机也有引脚比较多的,如68引脚,功能少的只有10多个或20多个引脚,有的甚至只8只引脚。为什么会这样呢?功能有强弱,打个比方,市场上面有的组合音响一套才卖几百块钱,可是有的一台功放机就要卖好几千。另外这种芯片的生产量很大,技术也很成熟,51系列的单片机已经做了十几年,所以价格就低了。既然如此,单片机的功能肯定不强,干吗要学它呢?话不能这样说,实际工作中并不是任何需要计算机的场合都要求计算机有很高 的性能,一个控制电冰箱温度的计算机难道要动用一台台式电脑不成?应用的关键是看是否够用,是否有很好的性能价格比。所以8051出来十多年,依然没有被淘汰,还在不断的发展中。4、MCS51单片机和8051、8031、89C51等的关系 我们平常老是讲8051,又有什么8031,现在又有89C51,89s51它们之间究竟是什么关系? MCS51是指由美国INTEL公司(对了,就是大名鼎鼎的INTEL)生产的一系列

相关文档
最新文档