单片机c语言设计试题答案

时间:2019-05-12 16:51:18下载本文作者:会员上传
简介:写写帮文库小编为你整理了多篇相关的《单片机c语言设计试题答案》,但愿对你工作学习有帮助,当然你在写写帮文库还可以找到更多《单片机c语言设计试题答案》。

第一篇:单片机c语言设计试题答案

单片机C语言程序设计师试题

一、填空题

1、设X=5AH,Y=36H,则X与Y“或”运算为_________,X与Y的“异或”运算为________。

2、若机器的字长为8位,X=17,Y=35,则X+Y=_______,X-Y=_______(要求结果写出二进制形式)。

3、单片机的复位操作是__________(高电平/低电平),单片机复位后,堆栈指针SP的值是________。

4、单片机中,常用作地址锁存器的芯片是______________,常用作地址译码器芯片是_________________。

5、若选择内部程序存储器,应该设置为____________(高电平/低电平),那么,PSEN信号的处理方式为__________________。

6、单片机程序的入口地址是______________,外部中断1的入口地址是_______________。

7、若采用6MHz的晶体振荡器,则MCS-51单片机的振荡周期为_________,机器周期为_______________。

8、外围扩展芯片的选择方法有两种,它们分别是__________________和_______________。

9、单片机的内部RAM区中,可以位寻址的地址范围是__________________,特殊功能寄存器中,可位寻址的地址是____________________。

10、子程序返回指令是________,中断子程序返回指令是_______。11、8051单片机的存储器的最大特点是____________________与____________________分开编址。12、8051最多可以有_______个并行输入输出口,最少也可以有_______个并行口。

13、_______是C语言的基本单位。

14、串行口方式2接收到的第9位数据送_______寄存器的_______位中保存。

15、MCS-51内部提供_______个可编程的_______位定时/计数器,定时器有_______种工作方式。

16、一个函数由两部分组成,即______________和______________。

17、串行口方式3发送的第9位数据要事先写入___________寄存器的___________位。

18、利用8155H可以扩展___________个并行口,___________个RAM单元。

19、C语言中输入和输出操作是由库函数___________和___________等函数来完成。

二、选择题

1、C语言中最简单的数据类型包括()。

A、整型、实型、逻辑型 B、整型、实型、字符型

C、整型、字符型、逻辑型 D、整型、实型、逻辑型、字符型

2、当MCS-51单片机接有外部存储器,P2口可作为()。A、数据输入口 B、数据的输出口 C、准双向输入/输出口 D、输出高8位地址

3、下列描述中正确的是()。A、程序就是软件 B、软件开发不受计算机系统的限制

C、软件既是逻辑实体,又是物理实体 D、软件是程序、数据与相关文档的集合

4、下列计算机语言中,CPU能直接识别的是()。

A、自然语言 B、高级语言 C、汇编语言 D、机器语言

5、MCS-5l单片机的堆栈区是设置在()中。

A、片内ROM区 B、片外ROM区 C、片内RAM区 D、片外RAM区

6、以下叙述中正确的是()。

A、用C语言实现的算法必须要有输入和输出操作 B、用C语言实现的算法可以没有输出但必须要有输入 C、用C程序实现的算法可以没有输入但必须要有输出 D、用C程序实现的算法可以既没有输入也没有输出

7、定时器/计数器工作方式1是()。

A、8位计数器结构 B、2个8位计数器结构 C、13位计数结构 D、16位计数结构

8、C语言提供的合法的数据类型关键字是()。

A、Double B、short C、integer D、Char

9、片内RAM的20H~2FH为位寻址区,所包含的位地址是()。

A、00H~20H B、00H~7FH C、20H~2FH D、00H~FFH

10、以下能正确定义一维数组的选项是()。

A、int a[5]={0,1,2,3,4,5};B、char a[ ]={0,1,2,3,4,5};C、char a={'A','B','C'};D、int a[5]=“0123”;

11、数据的存储结构是指()。

A、存储在外存中的数据 B、数据所占的存储空间量

C、数据在计算机中的顺序存储方式 D、数据的逻辑结构在计算机中的表示

12、下列关于栈的描述中错误的是()。

A、栈是先进后出的先性表 B、栈只能顺序存储

C、栈具有记忆作用 D、对栈的插入和删除操作中,不需要改变栈底指针

13、在寄存器间接寻址方式中,间址寄存器中存放的数据是()。A、参与操作的数据 B、操作数的地址值 C、程序的转换地址 D、指令的操作码

14、MCS-51单片机的复位信号是()有效。A、高电平B、低电平C、脉冲 D、下降沿

15、为了使模块尽可能独立,要求()。A、模块的内聚程度要尽量高,且各模块间的耦合程度要尽量强 B、模块的内聚程度要尽量高,且各模块间的耦合程度要尽量弱 C、模块的内聚程度要尽量低,且各模块间的耦合程度要尽量弱 D、模块的内聚程度要尽量低,且各模块间的耦合程度要尽量强

16、若MCS-51单片机使用晶振频率为6MHz时,其复位持续时间应该超过()。A、2μs B、4μs C、8μs D、1ms

17、以下选项中可作为C语言合法常量的是()A、-80 B、-080 C、-8e1.0 D、-80.0e

18、能够用紫外光擦除ROM中程序的只读存储器称为()。

A、掩膜ROM B、PROM C、EPROM D、EEPROM

19、以下不能定义为用户标识符是()。

A、Main B、_0 C、_int D、sizeof 20、下选项中,不能作为合法常量的是()。//幂不能为小数

A、1.234e04 B、1.234e0.4 C、1.234e+4 D、1.234e0

21、以下叙述中错误的是()A、对于double类型数组,不可以直接用数组名对数组进行整体输入或输出 B、数组名代表的是数组所占存储区的首地址,其值不可改变

C、当程序执行中,数组元素的下标超出所定义的下标范围时,系统将给出“下标越界”的出错信息

D、可以通过赋初值的方式确定数组元素的个数

22、以下与函数fseek(fp,0L,SEEK_SET)有相同作用的是()

A、feof(fp)B、ftell(fp)C、fgetc(fp)D、rewind(fp)

23、存储16×16点阵的一个汉字信息,需要的字节数为()

A、32 B、64 C、128 D、256

24、已知1只共阴极LED显示器,其中a笔段为字形代码的最低位,若需显示数字1,则它的字形代码应为()。

A、06H B、F9H C、30H D、CFH

25、在C语言中,合法的长整型常数是()A、OL B、4962710 C、324562& D、216D

26、以下选项中合法的字符常量是()A、“B” B、’10’ C、68 D、D

27、若PSW.4=0,PSW.3=1,要想把寄存器R0的内容入栈,应使用()指令。A、PUSH R0 B、PUSH @R0 C、PUSH 00H D、PUSH 08H

28、在片外扩展一片2764程序存储器芯片要()地址线。A、8根 B、13根 C、16根 D、20根

29、设MCS-51单片机晶振频率为12MHz,定时器作计数器使用时,其最高的输入计数频率应为()A、2MHz B、1MHz C、500kHz D、250kHz 30、下列数据字定义的数表中,()是错误的。

A、DW “AA” B、DW “A” C、DW “OABC” D、DW OABCH

三、判断题()1、在对某一函数进行多次调用时,系统会对相应的自动变量重新分配存储单元。()2、在C语言的复合语句中,只能包含可执行语句。()3、自动变量属于局部变量。()

4、Continue 和break都可用来实现循环体的中止。()

5、字符常量的长度肯定为1。()

6、在MCS-51系统中,一个机器周期等于1.5μs。()

7、C语言允许在复合语句内定义自动变量。

()

8、若一个函数的返回类型为void,则表示其没有返回值。()

9、所有定义在主函数之前的函数无需进行声明。

()

10、定时器与计数器的工作原理均是对输入脉冲进行计数。()

11、END表示指令执行到此结束。

()

12、ADC0809是8位逐次逼近式模/数转换接口。()

13、MCS-51的相对转移指令最大负跳距是127B。()

14、MCS-51的程序存储器只是用来存放程序的。

()

15、TMOD中的GATE=1时,表示由两个信号控制定时器的的启停。()

16、MCS-51的特殊功能寄存器分布在60H~80H地址范围内。()

17、MCS-51系统可以没有复位电路。()

18、片内RAM与外部设备统一编址时,需要专门的输入/输出指令。

()

19、锁存器、三态缓冲寄存器等简单芯片中没有命令寄存和状态寄存等功能。()20、使用8751且 =1时,仍可外扩64KB的程序存储器。

四、简答题

1、在使用8051的定时器/计数器前,应对它进行初始化,其步骤是什么?

2、什么是重入函数?重入函数一般什么情况下使用,使用时有哪些需要注意的地方? 3、8051引脚有多少I/O线?他们和单片机对外的地址总线和数据总线有什么关系?地址总线和数据总线各是几位?

4、在有串行通信时,定时器/计数器1的作用是什么,怎样确定串行口的波特率?

5、如何消除键盘的抖动?怎样设置键盘中的复合键? 答案

一、填空题 1、7EH、6CH 2、110100、11101110

3、高电平、07h 4、74HC373、74HC138

5、高、不用 6、0000H、0013H 7、0.5us、2us

8、线选法、译码法 9、20H~2FH、是能被8整除的地址

10、Ret、RETI

11、内部RAM、外部RAM 12、32、8

13、函数

14、SCON、RB8 15、3、16、4

16、说明部分、语句部分

17、SCON、TB8 18、3、256

19、scanf、printf

二、选择题

1、B

2、C

3、D

4、D

5、C

6、C

7、D

8、B

9、B

10、B

11、D

12、C

13、B

14、A

15、B

16、B

17、A

18、C

19、D 20、B

21、C

22、D

23、A

24、B

25、A

26、B

27、D

28、B

29、C 30、A

三、判断题

1、√

2、×

3、√

4、×

5、√

6、×

7、√

8、√

9、×

10、×

11、×

12、√

13、√

14、×

15、√

16、×

17、×

18、×

19、√ 20、√

四、简答题

1、答:(1)确定T/C的工作方式——编程TMOD寄存器;(2)计算T/C中的计数初值,并装载到TH和TL;

(3)T/C在中断方式工作时,须开CPU中断和源中断——编程IE寄存器;(4)启动定时器/计数器——编程TCON中TR1或TR0位。

2、答: 多个函数可以同时使用的函数,称为重入函数。

通常情况下,C51函数不能被递归调用,也不能应用导致递归调用的结构。有此限制是由于函数参数和局部变量是存储在固定的地址单元中。重入函数特性允许你声明一个重入函数。即可以被递归调用的函数。重入函数可以被递归调用,也可以同时被两个或更多的进程调用。重入函数在实时应用中及中断服务程序代码和非中断程序代码必须共用一个函数的场合中经常用到。

3、答:1)8051引脚共有40个引脚,8051的地址总线由P2和P0口提供,P2口是地址总线的高8位,P0口是地址总线的低8位;数据总线由P0口提供;P0口的地址总线和数据总线是分时进行的,P0口的地址总线需要外接地址锁存器完成地址锁存。2)地址总线共16位,数据总线是8位。

4、答:在有串行通信时,定时器/计数器1的作用是串行口发生器。串行口的波特率根据串行口的工作方式具有不同的计算方式: 方式0的波特率固定为晶体振荡器的十二分之一; 方式1的波特率=2SMOD.(定时器1的溢出率)/32; 方式2波特率=2SMOD.(fosc/64); 方式3波特率同方式1(定时器l作波特率发生器)。

5、答:由于按键是机械开关结构,所以当用手按下其中一个键时,往往会出现所按键在闭合位置和断开位置之间发生跳几下后才会稳定到闭合状态的情况。在释放一个键时,也会出现类似的情况,这就是键的抖动,抖动的持续时间不一,但通常不会大于10ms。若抖动问题不解决,就会引起对闭合键的多次读入。对于键抖动最方便的解决方法就是当发现有键按下后,不是立即进行扫描,而是延时大约10ms后再进行。由于一个键按下的时间一般会持续上百毫秒,所以延迟10ms后再扫描处理并不迟。复合键可以仿照计算机复合键的处理方法,通常可以假设一个键具有复合功能,再与其它减的键值组合成复合键。

第二篇:单片机C语言学习

单片机C语言之一___________________________________________________________________ _____________________ 预处理 一》宏定义:

1、不带参数:

#define 标识符 常量表达式

/*#define是宏定义命令,宏名(标识符)好习惯用大写*/ #define NIL 0x80

2、带参数:/*相当于小函数*/ #define 宏名(参数表)字符串

/*不仅要时行字任串替换还要进行参数的替换,在宏定义时,宏名与带参数的括弧之间不应该加空格,否则将空格以后的字符串都作为替代字符串的一部分,这可是很容易出错的*/ 如:#define SQ(a,b)a*b 使用:x=12;y=10;area=SQ(x,y);/*则area=12*10=120*/ 二》文件包含:

#include <文件名>或#include “文件名” /*在C中用双引用形式更保险,在C51中常用物是尖括弧形式*/ 三》条件编译:

/*一般源程序中的所有程序行都参加编译,但有时希望对其中一部分内容只在满足一定条件下才进行编译,也就是对一部分内容指定编译的条件。*/ #if、#elif、#else、#endif、#ifdef、#ifndef /*选择不同的编译范围,产生不同的代码,提供通用性。*/ /*如对8051在6MHZ与12MHZ下有*/ #ifdef cpu==8051 #define FREQ 6 /*程序段*/ #else #define FREQ 12/*程序段*/ #endif /*这样下面的原程序不用做任何修改便可以使用于两种时钟频率的单片机系统*/ 四》其他:

1、#error:捕捉不可预料的编译条件

#if(myv!=0&&myv!=1)/*假定其值必为0或1*/ #error myv must be 1 or 0/*出错时显示*/ #endif

2、#pragma:用于在程序中向编译器传送各种编译控制命令 #pragma 编译命令序列

/*例:想按如下命令编译ex.c c51 ex.c debug cod large可用:*/

#pragma DB CD LA #pragma disable /*禁止中断*/

单片机C语言之二_____________________________________________________________________________________ 一》数据类型:

char int long 1:unsinged 0~255 0~65535 0~4294967295 2:signed-128~127-32768~32767-2147483648~2147483647 指针:* 3字节 位标量: sbit 特殊功能寄存器:sfr 16位特殊功能寄存器:sfr16 占2个内存单元,0~65535 可寻址位:sbit利用他可访问51单片机的内部RAM中的可寻址位或特殊功能寄存器中的可寻址位 sfr P0=0x80;sbit P0_1=P0^1;/*将P0口的口地址定义为80H,将P0.1位定义为P1_1*/ 二》数据存贮类型

表1.C51数据存贮类型

━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━ 数据存贮类型 ┃ 与存贮空间的对应关系

━━━━━━━╋━━━━━━━━━━━━━━━━━━━━━━━━━━ data ┃ 直接寻址片内数据存贮区,访速度快 bdata ┃ 可位寻址片内数据存贮区,允许位与字节混合访问 idata ┃ 间接寻址片内数据存贮区,可访问片内全部RAM地址空间

pdata ┃ 分页寻址片外数据存贮区(256字节)由MOVX @R0访问 xdata ┃ 片外数据存贮区(64K),由MOVX @DPTR访问 code ┃ 代码存贮区(64K),由MOVC @DPTR访问

━━━━━━━┻━━━━━━━━━━━━━━━━━━━━━━━━━━ 变量的存贮类型定义: char data var /*字符变量var被定义为data存贮类型,C51编译器将把该变量定位在51单片机片内数据区存贮区中*/ bit bdata flag /*位变量flag被定义为bdata存贮类型,C51编译器将把该变量定位在51单片机片内数据区存贮区(RAM)中的位寻址区:20H--2FH*/

三》typedef:重新定义数据类型

typedef 已有数据类型 新的数据类型 typedef int word;/*将word定义为整型*/ word i,j;/*将i,j定义为整型*/ 四》位运算符:

━━━━┳━━━━━┳━━━━━┳━━━━━━┳━━━━━━┳━━━━━━ ~ ┃ & ┃ | ┃ ^ ┃ << ┃ >> ━━━━╋━━━━━╋━━━━━╋━━━━━━╋━━━━━━╋━━━━━━

按位取反┃ 按位与 ┃ 按位或 ┃ 按位异或 ┃ 左移 ┃ 右移

━━━━┻━━━━━┻━━━━━┻━━━━━━┻━━━━━━┻━━━━━━

对移位:如<< ,a<<2,即为将二进制的a左移两位,若a=0x8f,即10001111,a=a<<2,将导致a=0x3c(00111100),右边补零。五》条件运算符:

逻辑表达式? 表达式1:表达式2 六》指针与地址运算符: *取内容 &取地址

七》强制类型转换:(类型)=表达式(char *)0xb000 八》sizeof 取数据类型、变量以及表达式的字节数的运算符; 九》continue:中断语句:结束本次循环。

单片机C语言之三_____________________________________________________________________________________ 函数:

一》中断服务函数与寄存器组定义:

函数类型 函数名(形式参数表)[interrupt n][using n] n为中断号,0~31:

━━━━┳━━━━━┳━━━━━ 中断编号┃ 中断向量┃ 入口地址 ━━━━╋━━━━━╋━━━━━ 0 ┃ 外中断0 ┃ 0003H ━━━━╋━━━━━╋━━━━━ 1 ┃ 定时器0 ┃ 000BH ━━━━╋━━━━━╋━━━━━ 2 ┃ 外中断1 ┃ 0013H

━━━━╋━━━━━╋━━━━━ 3 ┃ 定时器1 ┃ 001BH ━━━━╋━━━━━╋━━━━━ 4 ┃ 串行口 ┃ 0023H ━━━━┻━━━━━┻━━━━━

后面的n指的是四个工作寄存器组的一个:0~3 对函数目标代码影响如下:

在函数入口处将当前工作寄存器组保护到堆栈中;指定的工作寄存器内容不会改变,函数返回前将被保护的工作寄存器组从堆栈中恢复!例(定时1ms):

#include sbit P1_0=P1^0;void timer0(void)interrupt 1 using 1{ P1_0=!P1_0;TH0=-(1000/256);TL0=-(1000%256);} main(){ SP=0x60;P1_0=0;TMOD=0X01;TH0=-(1000/256);TL0=-(1000%256);EA=1;ET0=1;TR0=1;do{}while(1);} /* 注意:

1、如果中断函数中用到浮点运算,必须保存浮点寄存器的状态。(在math.h中保存浮点寄存器函数为pfsave, 恢复浮点寄存器的状态函数为fprestore)

2、如果在中断函数中调用了其他函数,则被调函数所使用的工作寄存器组与中断函数的一致!*/

单片机C语言之四_____________________________________________________________________________________

一、局部变量与全局变量(外部变量):

1、全局变量若不在开头定义则加extern

2、全局变量会使代码长,占用内存多

二、存储方式:

自动变量(auto):缺省,函数调用存在,退出消失。

内部变量 静态变量(static):static int a=5;始终存在,退出不消失,但不能访问。寄存器变量(register):速度最快。通常只给编译器一个建议,由编译器根 据实际情况确定。(见下)变量 全局变量(global): 外部变量

静态变量(static): 寄存器变量例: #include int_power(m,e)int m;register int e;{ register int temp;temp=1;for(;e;e--)temp*=m;return(temp);} main(){ „„ }

三、函数的参数和局部变量的存储器模式: 三种存储器模式:small,compact,large.一个函数的存储器模式确定了函数的参数和局部变量在内存中的地址空间 small:内部ram compact, large:外部RAM 函数类型 函数名(形式参数表)[存储器模式] 例:

#pragma large /*默认存储器模式为large*/ extern int calc(char I,int b)small;/*指定small模式*/ extern int func(int I,float f)large;/*指定large模式*/ int large_te(int I,int k)/*未指定,按默认的large模式处理*/ { return(mtest(I,k)+2);}

利用存储器混合模式编程,充分利用有限的存储空间,还可加快程序的执行速度!

单片机C语言之五_____________________________________________________________________________________ 数组 1>初始化数组: unsigned char a[5]={0x11,0x22,0x33,0x44,0x55} 或

unsigned char a[ ] ={0x11,0x22,0x33,0x44,0x55,0x66} 3>数组作为函数的参数:不但可以由变量作为函数的参数外,还可以用数组名作为函数的参数。一个数组数组名表示该数组的首地址。用一个数组名作为函数的参数时,在执行函数调用的过程中参数传递方式采用的是地址传递。将实际参数数组首地址传递给被调函数中的形式参数数组,这样一来两个数组就占有同一段内存单元。见下图:

a[0] a[1] a[2] a[3] a[4] a[5] a[6] a[7] a[8] a[9] 起始地址1000 b[0] b[1] b[2] b[3] b[4] b[5] b[6] b[7] b[8] b[9] 用数组名作为函数的参数,应该在主调函数和被调函数中分别进行数组定义而不能只在一方定义数组。而且在两个函数中定义的数组类型必须一致,如果类型不一致将导致编译出错。实参数组和型参数组的长度可以一致可以不一致,编译器对形参数组的长度不做检查,直只是将实参数组的首地址传递给行参数组。如果希望行参数组能得到实参数组的全部元素,则应使两个数组的长度一致。定义型参数组时可以不指定长度,只在数组名后面跟一个方括号[]。这时为了在被调函数中处理数组元素的需要,应另外设置一个参数来传递数组元素的个数。

例:用数组作为函数的参数,计算两个不同长度的数组中所有元素的平均值 #include float average(array,n)int n;float array[ ];{ int I;float aver,sum=array[0];for(I=1;I

float pot_1[2]={99.9,88.8};float pot_2[3]={11,22,33.3};average(pot_1,2);average(pot_1,3);}

单片机C语言之六_____________________________________________________________________________________ 软件法去干扰:

工程上我们在采集数据时一般要求精度达到5%%,大于这个值将认为无效。我在实际应用中采用8535对32路数据进行采集(8535带10位AD,带看门狗),发现数据跳动有时达7%%,这是由于各种干扰造成的。主要来自于随机干扰,下面就各种干扰的方法给出简单的去除方法:

1、白噪声:最重要的统计特性为平均值为0,可采取每路数据采集几次求平均的方法;

2、随机干扰:该点明显高于或低于附近正常采样值,故采取中值滤波法,即对被测信号连续采样M次,进行大小排序,取大小居中的1/3个采样值进行算术平均;

3、电源干扰:特点是有固定周期,故可采用定时采样求平均的方法。

由于各种排序与求平均算法用C易于实现,故C常常用于采集系统中软件去干扰。至于排序算法可参考上一篇文章,有一个经典的程序。

在实际中我们采用每路猜9个值,排序,取中间3个,求平均。然后。,每路数据几乎不动!

单片机C语言之七_____________________________________________________________________________________ 指针:可对内存地址直接操作

基于存贮器的指以贮器类为参量,它在编译时才被确定。因此为指针选择存贮器的方法可以省掉,以这些指针的长度可为1个字节(idata *,data *,pdata *)或2个这节(code *,xdata *)。char xdata *address;ADC0809具有8个模拟量输入通道,采用中断方式,在中断函数中读取8个通道的A/D转换值,分别存储在外部RAM的1000H~1007H单元。ADC0809端口地址为00F0H。

程序定义了两个指针变量* ADC和* ADCdata,分别指向ADC0809端口地址(00F0H)和外部RAM单元地址(1000H~1007H)

由*ADC=I送入通道数,启动ADC0809进行A/D转换,转换结束时产生INT1中断。在中断服务函数int1()中通过temp=*ADC和*ADCdata=temp;读取A/D转换结果并存到外部RAM中。#include unsigned int xdata *ADC;/*定义ADC0809端口指针*/ unsigned int xdata *ADCdata;/*定义ADC0809数据缓冲器指针*/ unsigned char I;

void main(){ ADC=0x00f0;/*定义端口地址和数据缓冲器地址*/ ADCdata=0x1000;I=8;/* ADC0809有8个模拟输入通道*/ EA=1;EX1=1;IT1=1;/*开中断*/ *ADC=I;/*启动ADC0809*/ WHILE(I);/*等待8个通道A/D转换完*/ } void int1()interrupt 2 { unsigned char tmp;temp=*ADC;/*读取A/D转换结果*/ *ADCdata=temp;/*结果值存到数据缓冲区*/ ADCdata++;/*数据缓冲区地址加1*/ i—;*ADC=I;/*启动下一个模拟输入通道A/D转换*/ } 除了用指针变量来实现对内存地址的直接操作外,c51编译器还提供一组宏,该宏定义文件为:“absacc.h”,利用它可十分方便地实现对任何内存空间的直接操作,改写上面的程序: #include #include /*包含绝对地址操作预定义头文件*/ #define ADC 0x00f0;/*定义ADC0809端口地址*/ #define ADCdata 0X1000 /*定义数据缓冲器地址*/ unsigned char I;void main(){ I=8;/ *ADC0809有8个模拟输入通道*/ EA=1;ex1=1;it1=1;/ *开中断*/ XBYTE[ADC]=I;/*启动0809 */ While(i);/*等待8个通道转换完毕*/ } void int1()interrupt2 { unsigned char tmp;tmp=XBYTE[ADC];/*读取A/D转换结果*/ i--;XBYTE[ADCdata+I]=tmp;/**结果值存储到数据缓冲器*/ XBYTE[ADC]=I;/*启动下一个模拟输入通道A/D转换*/ } 两指针相减-----计算字符串的长度 #include main(){

char *s=”abcdef”;int strlen(char *s);printf(“n length of ‘%%s’=%%dn”,s,strlen(s));} int strlen(char *s){ char *p=s;while(*p!=’’)p++;return(p-s);} 结果为:length of ‘abcdef’=6 注:不允许指针之间进行加,乘,除,移位,或屏蔽运算,也不允许用float类型数据与指针做加,减运算!

抽象型指针:

ANSI新标准增加了一种“void * ”的指针类型,这是一种抽象型指针,即可以定义一个指针变量,但不指定该指针是指向哪种类型的数据的。在赋值时需进行强制类型转换: Char *p1;Void *p2;P1=(char*)p2;抽象型指针可以用来在每个存储区内访问任意绝对地址或者用来产生绝对调用。

第三篇:单片机c语言学习心得转载

单片机c语言学习心得

(一)相信很多爱好电子的朋友,对单片机这个词应该都不会陌生了吧。不过有些朋友可能只听说他叫单片机,他的全称是什么也许并不太清楚,更不用说他的英文全称和简称了。单片机是一块在集成电路芯片上集成了一台有一定规模的微型计算机。简称为:单片微型计算机或单片机(Single Chip Computer)。单片机的应用到处可见,应用领域广泛,主要应用在智能仪表、实时控制、通信、家电等方面。不过这一切都没什么关系,因为我(当然也包括任何人)都是从不知道转变成知道的,再转变成精通的。现在我只想把我学习单片机的经历,详细地讲叙给大家听听,可能有些大虾会笑话我,想:那么简单的东西还在这里卖弄。但是你错了,我只是把我个人学习的经历讲述一遍而已,仅仅对那些想学习单片机,但又找不到好方法或者途径的朋友,提供一个帮助,使他们在学习过程中,尽量少走些弯路而已!

首先,你必须有学习单片机的热情,不是说今天去图书馆看了一个下午关于单片机的书,而明天玩上半天,后天就不知道那个本书在讲什么东西了。还是先说说我吧,我从大二的第一个学期期末的时候才开始接触单片机,但在这之前,正如上面所说的:我知道有种芯片叫单片机,但是具体长成什么样子,却一点也不知道!看到这里很多朋友一定会忍不住发笑。嘿嘿,你可千万别笑,有些大四毕业的人也同样不知道单片机长成什么样子呢!而我对单片机的痴迷更是常人所不能想象的地步,大二的期末考试,我全放弃了复习,每当室友拿着书在埋头复习的时候,我却捧着自己从图书馆借的单片机书在那看,虽然有很多不懂,但是我还是坚持了下来,当时我就想过,为了单片机值不值得我这样去付出,或许这也是在一些三流学校的好处吧,考试挂科后,明年开学交上几十元一门的补考费,应该大部分都能过了。于是,我横下一条心,坚持看我的单片机书和资料。当你明白了单片机是这么一回事的时候,显而易见的问题出来了:我要选择那种语言为单片机编写程序呢?这个问题,困扰了我好久。具体选择C51还是A51呢?汇编在我们大二之前并没有开过课,虽然看着人家的讲解,很容易明白单片机的每一时刻的具体工作情况,但是一合上书或者资料,自己却什么也不知道了,根本不用说自己写程序了。于是,我最终还是决定学C51,毕竟C51和我们课上讲的C语言,有些类似,编程的思想可以说是相通的。而且C51还有更大的优点就是编写大程序时的优越性更不言而喻,当然在那时,我并没有想的那么深远,C51的特点,还是在后来的实践过程中,渐渐体会到的!朋友如果你选择了C51,那么请继续往下看,如果你选择了A51,那么你可以不要看了!因为下面讲的全是C方面的,完全在浪费你的时间!呵呵 ^_^

第二,既然你想学好单片机,你必须得舍得花钱,如果不买些芯片回来自己动手焊焊拆拆的(但是在后期会介绍给大家一个很好用的硬件仿真软件,并不需要你用实验板和仿真器了,直接在你的PC上完成,但是软件毕竟是软件,从某个特定的意义上来说是并不能代替硬件的),即使你每天捧着本书,把那本书翻烂,也永远学不会单片机的!刚接触单片机的朋友,看了资料,一定会对以下几个词见的比较多,但是具体的概念还是比较模糊,现作如下说明:

(1)编程器编程器是用来烧单片机芯片的,是把HEX或者BIN文件烧到单片机ROM里的。

(2)实验板实验板是专为初学者根据某些要求而特做的板,一般上面就有一个单片机的最小系统,使用者只需写好程序,烧好芯片,放到上面加以验证的这么一个工具。有了实验板,对与初学者来说,省去了焊个最小系统的麻烦。但是对于电子开发人员来说,作用并不是很大

(3)仿真器仿真器是直接把HEX或者BIN文件暂时放在一个芯片里,再通过这个芯片的引脚连接到实验板或者系统上工作。这样以来,可以省去了来回插拔芯片带来的不必要麻烦。

我一开始也不知道上面3个的概念和作用,嘿嘿,原本想买个实验板(不想焊板,因为不可能为了点亮几个流水灯,而去焊个单片机的最小系统)的,可是结果,确和我想的正好相反,人家出售的是编程器。等货物寄到后,才知道自己搞错了!汗。。嘿嘿。现在想想实在是又气又笑。我花了160大样买了个编程器(很不幸的是,这个编程器更本用不了,一烧芯片,芯片就烧坏了)把我给气的,这个编程器,现在还躺在我的抽屉里呢不过,现在想想,唯一让我觉得欣慰的是,那个老板每次能解答我的问题,连那种超级幼稚的问题,他也能不嫌麻烦地尽量帮我解答!这点让我很感动!

第三,想学单片机的必需品--PC。因为写程序,编译或者是仿真都是通过PC完成的。如果没有PC,什么也做不了!!有了PC最好还要可以上网,因为如果你没有可以和你交流单片机的人,遇到自己解决不了的问题,一直都想不通,那么估计你学习单片机的热情就会随着时间的推移而慢慢耗尽。如果你能上网通过论坛或者QQ群,问题就很快得到解决。这样的学习效率一定很高!真正的高手是从论坛中泡出来的!

有了上述3个条件后,你就可以开始学你的单片机了。但是,真的做起来并没有我所说的那么简单。你一定会遇到很多很多的问题。比如为了让单片机实现某个功能,你可能不知道怎么去写某个程序。或是你看懂了资料上某个相似的程序,你自己却写不出来。遇到类似的情况,记住:千万不要急噪,就行!

(二)说了这么多了,相信你也看了很多资料了,手头应该也有必备的工具了吧!(不要忘了上面讲过几个条件的哦)。那个单片机究竟有什么功能和作用呢?先不要着急!接下来让我们点亮一个LED(搞电子的应该知道LED是什么吧^_^)我们在单片机最小系统上接个LED,看我们能否点亮它!对了,上面也有好几次提到过单片机最小系统了,所谓单片机最小系统就是在单片机上接上最少的外围电路元件让单片机工作。一般只须连接晶体、VCC、GND、RST即可,一般情况下,AT89C51的31脚须接高电平。

#include//头文件定义。或用#include其具体的区别在于:后者定义了更多的地址空间。

//在Keil安装文件夹中,找到相应的文件,比较一下便知!sbit P1_0 = P1 ^ 0;

void main(void)

{

while(1)

{

P1_0 = 0;//低电平有效,如果把LED反过来接那么就是高电平有效}

}

就那么简单,我们就把接在单片机P1_0上的LED点亮了,当然LED是低电平,才能点亮。因为我们把LED的正通过电阻接至VCC。

P1_0 = 0;类似与C语言中的赋值语句,即把 0 赋给单片机的P1_0引脚,让它输出相应的电平。那么这样就能达到了我们预先的要求了。while(1)语句只是让单片机工作在死循环状态,即一直输出低电平。如果我们要试着点亮其他的LED,也类似上述语句。这里就不再讲了。

点亮了几个LED后,是不是让我们联想到了繁华的街区上流动的彩灯。我们是不是也可以让几个LED依次按顺序亮呢?答案是肯定的!其实显示的原理很简单,就是让一个LED灭后,另一个立即亮,依次轮流下去。假设我们有8个LED分别接在P1口的8个引脚上。硬件连接,在P1_1--P1_7上再接7个LED即可。例程如下:

#include

sbit P1_0 = P1 ^ 0;

sbit P1_1 = P1 ^ 1;

sbit P1_2 = P1 ^ 2;

sbit P1_3 = P1 ^ 3;

sbit P1_4 = P1 ^ 4;

sbit P1_5 = P1 ^ 5;

sbit P1_6 = P1 ^ 6;

sbit P1_7 = P1 ^ 7;

void Delay(unsigned char a)

{

unsigned char i;

while(--a!= 0)

{

for(i = 0;i < 125;i++);//一个;表示空语句,CPU空转。

}//i 从0加到125,CPU大概就耗时1毫秒}

void main(void)

{

while(1)

{

P1_0 = 0;

Delay(250);

P1_0 = 1;

P1_1 = 0;

Delay(250);

P1_1 = 1;

P1_2 = 0;

Delay(250);

P1_2 = 1;

P1_3 = 0;

Delay(250);

P1_3 = 1;

P1_4 = 0;

Delay(250);

P1_4 = 1;

P1_5 = 0;

Delay(250);

P1_5 = 1;

P1_6 = 0;

Delay(250);

P1_6 = 1;

P1_7 = 0;

Delay(250);

P1_7 = 1;

}

}

sbit 定义位变量,unsigned char a 定义无符字符型变量a,以节省单片机内部资源,其有效值为0~255。main函数调用Delay()函数。Delay函数使单片机空转,LED持续点亮后,再灭,下一个LED亮。while(1)产生循环。

第四篇:单片机C语言学习心得

8、指针的使用

8.1 在定义的时候,*ap中的‘*’是指针类型说明符;

在进行指针预算时,x = *ap 中的‘*’是指针运算符。8.2 如果在已定义好的指针变量,并引用,即

int *ap, int a;ap = &a;则在进行指针运算的时候:

(1)*ap与a是等价的,即 *ap就是a;

(2)&*ap:由于*ap与a等价,则&*ap与&a等价(地址);

(3)*&a:由于&a = ap,则*&a与*ap等价,即*&a与a等价(变量);(4)*ap++相当于a++。

8.3 指向数组的指针变量的定义,应用,赋值:

int a[10];int *app;则有两种方法:app = &a[0];或 app = &a;(1)app+I 或a+i就是数组元素a[i]的地址;(2)*(app+i)或 *(a+i)就是元素a[i]中的内容;

(3)指针变量也可以带下表,即app[i]与*(app+i)等价。8.4 数组和指针可以互换,但在代码执行的效率上却大不相同。用数组找元素必须每次计算元素的地址,效率不高;而用指针则直接指向某个元素,不必每次计算地址,可以大大的提高运算效率。8.5 关于指针的运算:

(1)p++(或p+=1):使指针p指向下一个数组元素,地址加1;

(2)*p++:先得到p指向的变量值,再执行p加1,指向下一个数组元素;(3)*++p:先使p加1,指向下一个数组元素,再去p指向的变量值;(4)(*p)++:表示p指向的变量值加1;

(5)若p指向当前数组中的第i个元素,则:

(p--)与a[i--] 等价:先执行*p,然后p自减;(++p)与a[++i] 等价:先执行p自加,再执行*p;(--p)与a[--p] 等价:先执行p自减,再执行*p。

8.6 指向多维数组:

定义一个二维数组:a[3][4];定义一个指针变量:(*p)[4];(注意:列数相同(第二维相同))使指针变量指向数组:p = a;此时: p与a等价:指向数组a[3][4]的第0行首地址;

p+1与a+1等价:指向数组a[3][4]的第1行首地址; p+2与a+2等价:指向数组a[3][4]的第2行首地址;

而:

*(p+1)+3与& a[1][3]等价,指向a[1][3]的地址;

*(*(p+1)+3)与a[1][3]等价,表示a[1][3]的值; 一般的:对于数组a[i][j]来讲,有

*(p+i)+j相当于&a[i][j],表示第i行第j列元素的地址; *(*(p+i)+j)相当于a[i][j],表示第i行第j列元素的值。

8.7 指向结构体:

如果指针p指向结构体数组msg1[0]的首地址,则:

(1)(*p).flg与p->flg和msg1[0].flg三者完全等价,即(*p).成员名 与p->成员名 以及 结构体数组元素成员名三种形式是等价的;

(2)p+1:使指针指向结构数组msg1[0]的下一个元素msg1[1]的首地址;(3)由于指向运算符->的优先级高于自加运算符++,则:

(++p)->flg:先使p自加1指向msg1[1]的地址,再指向msg1[1]的flg成员值;(p++)->flg:先得到msg1[0].flg的值,再使p自加1指向msg1[1]的首地址;

p->flg++:先得到msg1[0].flg的值,使用完后再使msg1[0].flg的值加1; ++p->flg:先将msg1[0].flg的值加1,再使用。

第五篇:单片机C语言知识点

【C语言】 【数据类型】

【转义字符】 【语句】 【#define】 #define 新名 原名 【typedef】

typedef 原类型名 新类型名;【sbit】 sbit P1_0=P1^0;在reg52.h或reg51.h的头文件下,要使用P0.0~7….一定要事先位定义。【if】

(1)if(表达式)语句; 表达式的值为真,则执行其后的语句,否则不执行该语句,继续执行

这条语句的下一条。(2)if(表达式)语句1; else 语句2;

表达式的值为真,则执行语句 1,否则执行语句2。(3)if(表达式1)语句1; else if(表达式2)语句2; else if(表达式3)语句3; …

else if(表达式m)语句m; else 语句n;

依次判断表达式的值,只要出现某个表达式的值为真时,则执行其对应的语

句。然后跳到整个if 语句之外继续执行程序。【switch】(1)switch(表达式){ case常量表达式1: 语句1;case常量表达式2: 语句2;------------------------case常量表达式n: 语句n;default : 语句n+1;} 计算表达式的值。并逐个与其后的常量表达式值相比较,当表达式的值与

某个常量表达式的值相等时,即执行其后的语句,然后不再进行判断,继续执行后面所有 case 后的语句。(2)

switch(表达式){ case 常量表达式1:语句1;Break;case 常量表达式2:语句2;Break;case 常量表达式3:语句3;Break;------------------------case 常量表达式n:语句n;Break;default : 语句n+1;} 计算表达式的值。并逐个与其后的常量表达式值相比较,当表达式的值与

某个常量表达式的值相等时,即执行其后的语句。【goto】 goto 语句标号;

goto 语句标号; 其中语句标号是按标识符规定书写的符号,放在某一语句行的前面,标号后加冒号(:)。语句标号起标识语句的作用,与goto 语句配合使用。【while】(1)

while(表达式)语句;

只要这个表达式所表描述的事情成立或该表达式经过计算后的值是非0 值,就一直循环执行其后

面的语句;当表达式所描述的事情不成立或经过计算后表达式的值为0 时,就不再执行其后 面的语句,并跳出while 循环。(2)do 语句; while(表达式);

先执行循环中的语句,然后再判断表达式是

否为真,如果为真则继续循环;如果为假,则终止循环。【for】

for(循环变量赋初值;循环条件;循环变量增量)语句 1)先求解表达式1。

2)求解表达式2,若其值为真(非0),则执行语句,然后执行下面第3)步;若其值为

假(0),则结束循环,转到第5)步。3)求解表达式3。4)转回上面第2)步继续执行。

5)循环结束,执行for语句下面的一个语句。【数组】(一维数组)

类型说明符数 组名

[常量]; unsigned char a[10];(二维数组)

类型说明符 数组名 [常量] [常量]; unsigned char b[3][3];int display[2][3]={{1},{3}};

*unsigned char code table[] 定义在code区,为常量

下载单片机c语言设计试题答案word格式文档
下载单片机c语言设计试题答案.doc
将本文档下载到自己电脑,方便修改和收藏,请勿使用迅雷等下载。
点此处下载文档

文档为doc格式


声明:本文内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:645879355@qq.com 进行举报,并提供相关证据,工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。

相关范文推荐

    单片机C语言学习心得

    8、指针的使用 8.1 在定义的时候,*ap中的‘*’是指针类型说明符; 在进行指针预算时,x = *ap 中的‘*’是指针运算符。 8.2 如果在已定义好的指针变量,并引用,即 int *ap, int a;......

    单片机c语言学习心得(改编)

    单片机c语言学习心得(一) 相信很多爱好电子的朋友,对单片机这个词应该都不会陌生了吧。不过有些朋友可能只听说他叫单片机,他的全称是什么也许并不太清楚,更不用说他的英文全称......

    学习单片机c语言还是语言

    汇编语言(AssemblyLanguage)是面向机器的程序设计语言。汇编语言是一种用文字助记符来表示机器指令的符号语言,是最接近机器码的一种语言。其主要优点是占用资源少、程序执行......

    c语言编写单片机感想

    用C语言对单片机编程感想 起先接触单片机,单片机的程序是用汇编语言编写的。汇编语言是面向机器的低级语言,保持了机器语言的优点,具有直接和简捷的特点,目标代码简短,占用内存少......

    C语言编程期末试题答案

    科目:C语言编程 适用班级: 11级计算机1、2班试题答案 一、单选题(每小题2分,共30分) 1.、A2、.B3、.D4、.A5、A6、A7、C8、.C9、.A.10、A11、.A12、 C13、D14、A15、D 二、填空......

    51单片机的C语言程序结构

    预处理命令 #include 子函数 void delay(void) { 函数体... } 主函数 void main(void) { 函数体... whlie { 函数体... } } 2、c语言是由函数构成的,一个c语言......

    --单片机C语言编程实训

    实习报 告 实习地点:201机房 实习时间:2014.12.1——2014.12.6 实习项目:单片机C语言编程实训 指导老师:骆乐 姓名:班级:电信3121 一、 实习内容 1.计算字符的ASCII码 编写一......

    C语言设计

    C语言课程设计任务书1 题目:学院教学信息管理系统 功能:学院教学信息管理系统,每一条记录包括一位教师的职工号、姓名、职称、性别、3门课程, 教学效果综合评分。系统要求实现......