《单片机原理及应用(C51)》

更新时间:2024-04-17 10:19:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

(习题库

C51)》

1

《单片机原理及应用

一、填空题

1.单片机与普通计算机的不同之处在于其将_CPU__、 存储器 和__I/O_3部分集成于一块芯片之上。

2.CPU主要由 运算 器和 控制 器组成。CPU中的 布尔处理器 用来处理位操作。

3.MSC-51系列单片机中,片内无ROM的机型是 8031 ,有4KB ROM的机型是_8051_,而有4KB EPROM 的机型是 8751 。

4. -32的补码为 11100000 B,补码11011010B代表的真值为_-38__D。 5.原码数BFH=_-63_D,原码数6EH=_110_D。 6.100的补码=_64_H,-100的补码= 9C H 7.在8031单片机内部,其RAM高端128个字节的地址空间称为 特殊功能寄存器或SFR 区,但其中仅有_21_个字节有实际意义。

8.通常单片机上电复位时PC=_0000_H,SP=_07_H,通用寄存器则采用第_0_组,这一组寄存器的地址范围是从_00 H~_07_H。

9.若PSW为18H,则选取的是第_3__组通用寄存器。 10. 8031单片机复位后R4所对应的存储单元地址为_04_H,因上电时PSW=_00_H。 11. 若A中数据为63H,那么PSW的最低位(即奇偶位P)为_0_。 12. 在微机系统中,CPU是按照 程序计数器PC 来确定程序的执行顺序的。 13. 在8031单片机中,使用P2、P0口传送 地址 信号,且使用了P0口来传送 数据 信号,这里采用的是 总线复用 技术。 14. 堆栈遵循 先进后出(或后进先出) 的数据存储原则。 15. 当8051地RST端上保持 两 个机器周期以上低电平时,8051即发生复位。 16. 使用8031单片机时需将EA引脚接_低__电平,因为其片内无 程序 存储器。 17. 配合实现“程序存储自动执行”的寄存器是_PC_,对其操作的一个特别之处是 每取完一字节指令后PC内容会自动加1 。 18. MCS-51单片机PC的长度为_16_位;SP的长度为_8_位,数据指针DPTR的长度为_16_位。 19. 8051单片机的RST引脚的作用是 对单片机实行复位操作 ,其操作方式有 上电自动复位 和 按键手动复位 两种方式。 20. 8051片内有256B的RAM,可分为四个区,00H~1FH为 工作寄存器 区;20H~2FH为 位寻址 区;30H~7FH为 堆栈、数据缓冲 区;80H~FFH为 特殊功能寄存器 区。 21. MCS-51单片机系列有_5__中断源。上电复位时,同级中断源的优先级别从高至低为 外部中断源0 、 定时器0 、 外部中断1 、 定时器1 和 串行口 ,若IP=00010100B,则优先级别最高者为 外部中断1 、最低者为 定时器1 。 22. 若你正在编辑某个文件,突然断电,则计算机中 RAM 类型存储器中的信息全部丢失,且通电后也不能自动恢复。 23. 8051在物理结构上只有四存储空间,它们分别是 片内程序存储器 、 片外程序存储器 、 片内数据存储器 、 片外数据存储器 ;但在逻辑结构上只有三个存储空间,它们分别是 片内外统一编址的64KB程序存储器 、 片内256B的数据存储器 和 片外64KB的数据存储器 。 24. I/O端口作为通用输入输出口时,在该端口引脚输入数据时,应先向端口锁存器进行 写“1” 操作。 25. 8051单片机其内部有 21 个特殊功能寄存器,其中 11 个可以位寻址。 26. 在一般情况下实现片选的方法有两种,分别是 线选法 和 译码法 。 27. 起止范围是0000H~3FFFH的存储器的容量是 16 KB。 28. 11根地址线可选 2048(或2KB或211)个存储单元,16KB存储单元需要 14 根地址线。 29. MCS-51机中扩展I/O口占用片外__数据__存储器地址空间。

2

30. MCS-51 单片机访问片外存储器时利用通信 ALE_信号锁存来自_P0__口的低八位地址信号。 31. 半导体存储器的最重要的两个指标是 存储容量 和 存取速度 。 32. 32KB ROM的首地址若为2000H,则末地址是 9FFFH 。 33. 通过堆栈操作实现子程序调用,首先就要把 PC 的内容入栈,以进行断点保护。 34. C语言除了具有标准C的所有标准数据类型外,还扩展了一些特殊的数据类型:bit、sbit、 sfr 和sfr16,用于访问8051的特殊功能寄存器和可寻址位。

其中 用来访问MCS-51单片机内部的所有的特殊功能寄存器。 35. C语言是结构化程序设计语言,有三种基本程序结构:顺序结构、选择结构和循环结构。 36. 在单片机C语言程序设计中,char 类型数据经常用于处理ASCⅡ字符或处理小于等于255的整型数。 37. C51中的字符串总是以 ‘\\0’ 作为结束符,通常用字符数组来存放。 38. 外部中断1的中断类型号是: 2 。 39. 一个完整的中断过程可分为 中断请求 、 中断响应 、 中断处理 和 中断返回 四部分。 40. 中断请求信号有 电平 触发和__边沿__触发两种触发方式。 41. MCS-51单片机8031中有_2_个_16_位的定时器/计数器,可以被设定的工作方式有_4_种。 42. 若系统晶振频率为12MHZ,则T0工作于方式0时的最大定时时间是 8.192 ms,工作于方式2时的最大计数脉冲个数是 256 个。 43. 欲对300个外部事件计数,可以选用定时/计数器T1的模式_0 或模式__1_。 44. 若系统晶震频率为6MHZ,则时钟周期为__0.167_us,机器周期为_2_us,最短和最长指令周期分别为__2_us和__8_us。 45. RS-232C采用单端驱动,易受 干扰 影响,一般传输距离在 几十米 以内。 46. 三态缓冲寄存器的“三态”是指 低电平 态、 高电平 态和 高阻 态。 47. 74LS138是具有3个输入的译码器芯片,其输出作为片选信号时,最多可以选中_8_块芯片。 48. 74LS273通常用来作为简单 输出 接口扩展;而74LS244则常用来作简单 输入 接口扩展。 49. 计算机对输入/输出设备的控制方式主要有三种。其中, A 方式硬件设计最简单,但要占用不少CPU的运行时间; B方式的硬件线路最复杂,但可大大提高数据传送效率;而 C 则介于上述两者之间。

①先进先出 ②后进先出 ③直接存储器访问 ④程序查询 ⑤高速缓存 ⑥系统总线 ⑦程序中断 ⑧逐行扫描 请选择并填写答案:A=__④__,B= ③ ,C=_ ⑦_ 50. 若LED为共阳极接法(即负逻辑控制),则提示符P的七段代码值应当为_0C或 8C_H。 51. 欲增加8KB*8位的RAM区,请问选用Intel2114(1KB*4位)需购_16_片;若改用Intel6116(2KB*8位)需购_4_片;若改用Intel6264(8KB*8位)需购_1_片。 52. 已知RAM芯片6116(2KB*8位)有24条外引脚,请问应分配 11 个引脚给地址线,分配_8__个引脚给数据线,再分配两个引脚给电源和地线外,剩余的_3_个引脚应该分配给 读写控制和片选信号线 。 53. 在异步通信中若每个字符由11位组成,串行口每秒传送250个字符,则对应波特率为_2750bps_。 54. 在串行通信中采用偶校验,若传送的数据为0A5H,则基本奇偶校验位应为_0_(用“0”“1”表示)。 55. 80C51的串行口控制寄存器中有2个中断标志位,它们是 RI 和 TI 。 56. 串行通信可以分成 异步 通信和 同步 通信两大类。 57. LED显示器的显示控制方式有 静态 显示和 动态 显示两大类。 58. LED显示器根据二极管的连接方式可以分为( 共阴极 )和(共阳极)两大类。

3

59. CPU与内存或I/O接口相连的系统总线通常由 数据总线(DB) 、 地址总线(AB) 、 控制总线(CB) 等三种信号线组成。 60. A/D转换器的作用是将模拟量转为数字量; D/A转换器的作用是将数字量转为模拟量。

二、单选题

1.MCS-51系列单片机的CPU主要由( A )组成。 (A) 运算器、控制器 (B) 加法器、寄存器 (C) 运算器、加法器 (D) 运算器、译码器 2.单片机8031的/EA引脚( B)。

(A) 必须借+5V电源 (B)必须接地

(C) 可悬空 (D)以上三种视需要而定 3.计算机能直接识别的语言是:(C)

(A) 汇编语言 (B) 自然语言 (C) 机器语言 (D) 高级语言 4.在CPU中,控制器的功能是:(C)

(A) 进行逻辑运算 (B)进行算术运算

(C) 分析指令并发出相应的控制信号 (D) 只控制CPU的工作 5.PC是:(C)

(A) 一根硬件信号线

(B) 一个可由用户直接读写的8位PAM寄存器 (C) 一个能自动加1的16位的计数器

(D)一个能自动加1计数的ROM存储单元

6.外部扩展存储器时,分时复用做数据线和低8位地址线的是( A ) (A)P0口 (B) P1口 (C) P2口 (D)P3口 7.在单片机中,通常将一些中间计算结果放在( A )中

(A)累加器 (B)控制器 (C)程序存储器 (D)数据存储器 8.PC的值是(C)

(A)当前正在执行指令的前一条指令的地址 (B)当前正在执行指令的地址 (C)当前正在执行指令的下一条指令的地址 (D)控制器中指令寄存器的地址 9.CPU寻址外设端口地址的方法有两种,一种是统一编址,还有一种是( C)。 (A) 混合编址 (B) 动态编址 (C) 独立编址 (D) 变址编址 10. 在CPU内部,反映程序运行状态或反映运算结果的一些特征的寄存器是:(B) (A) PC (B) PSW (C) A (D) SP 11. MCS-51的并行I/O信息有两种读取方法,一种是读引脚,还有一种是( A ) (A)读锁存 (B)读数据 (C)读累加器A (D)读CPU 12. 区分片外程序存储器和数据存储器的最可靠方法是(D)。 (A)看其芯片型号是RAM还是ROM (B)看其位于地址范围的低端还是商端 (C)看其离MCS-51芯片的远近

(D)看其是被RD信号连接还是被PSEN信号连接 13. 已知PSW=10H,通用寄存器R0~R7的地址分别为( C )。

(A)00H~07H; (B) 08H~0FH; (C) 10H~17H; (D) 18H~1FH 14.关于MCS-51单片机堆栈操作,下列描述错误的是( B )。

(A)遵循先进后出,后进先出的原则 (B)出栈时栈顶地址自动加1 (C)调用子程序及子程序返回与堆栈有关 (D) 堆栈指针是一个特殊功能寄存器

4

15.MCS-51的并行I/O口读-改-写操作,是针对该口的( D )

(A)引脚 (B)片选信号 (C)地址线 (D)内部锁存器 16.MCS-51单片机复位操作的主要功能是把PC初始化为( C )。

(A)0100H (B)2080H (C)0000H (D)8000H 17.当外部中断请求的信号方式为脉冲方式时,要求中断请求信号的高电平状态和低电平状态都应至少维持( B )。

(A)1个机器周期 (B)2个机器周期 (C)4个机器周期 (D)10个晶振周期 18.8051与8751的区别是(C)

(A)内部数据存储单元数目不同 (B)内部数据存储器的类型不同 (C)内部程序存储器的类型不同 (D)内部的寄存器的数目不同 19.访问片外数据存储器时,不起作用的信号是(C) (A) RD (B) WR (C) PSEN (D) ALE 20.下列四条叙述中,有错误的一条是(A) (A)16根地址线的寻址空间可达1MB (B)内存器的存储单元是按字节编址的

(C) CPU中用于存放地址的寄存器称为地址寄存器 (D)地址总线上传送到只能是地址信息 21.14根地址线的寻址范围可达(B)

(A) 8KB (B)16KB (C) 32KB (D)64KB

22.CPU寻址外设端口地址的方法有两种,一种是统一编址,还有一种是( C )。

(A) 混合编址 (B) 动态编址 (C) 独立编址 (D) 变址编址

23.MSC-51系列单片机外扩存储器芯片时,4个I/O口中用作数据总线的是( B)。 (A)P0口和P2口 (B)P0口 (C)P2口和P3口 (D)P2口 24、在单片机应用系统中,(B)显示方式编程简单,但占用I/O端口线多,一般适用显示位数较少的场合。

(A) 动态 (B) 静态 (C) 动态和静态 (D) 查询 25、LED数码管若采用动态显示方式,下列说法错误的是:(C) (A)将各位数码管的段选线并联

(B)将段选线用一个8位I/O端口控制

(C) 将各位数码管的公共端直接接在+5V或GND

(D)将各位数码管的位选线用各自独立的I/O端口控制 26、C程序总是从( B )开始执行的。

(A) 主程序 (B) 主函数 (C) 子程序 (D) 主过程

27、在C51语言中,当do-while 语句中的条件为(C)时,结束循环。 (A) 0 (B) 真 (C) 假 (D) 非0 28、在C51的数据类型中,unsigned char型的数据长度和值域为:(C)。 (A)单字节,-128~127 (B)双字节,-32678~+32767 (C)单字节, 0~255 (C)双字节,0~65535

29、使用单片机开发系统调试C语言程序时,应新建文件,该文件的扩展名是(A )。 (A) .c (B) .hex (C) .asm (D) .bin 30、单片机能够直接运行的程序是(D)。

(A) 汇编源程序 (B) C语言源程序 (C) 高级语言程序 (D) 机器语言源程序

31、MCS-51系列的单片机的4个并行I/O端口作为通用I/O端口使用,在输出数据时,必须外接

5

#include \char led_mod[]=

{0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x58,0x5e,0x79,0x71}; char count=0; sbit P04 = P0^4; int0_key() interrupt 0 { P04=!P04; }

int1_key() interrupt 2 { count++;

if (count==0x10) count=0; P2 = led_mod[count]; }

void main(){

IT0=IT1=EX0=EX1=EA=1; P04=0;

P2 = led_mod[0]; while(1); }

4、数码管动态显示。要求:6个共阳数码管稳定显示“012345”6个字符。 #include

unsigned char led[]={0xc0,0xf9,0xa4,0x99,0x92}; void delay(unsigned char t) { unsigned char i,j; for(i=200;i>0;i--) for(j=t;j>0;j--); }

main()

{unsigned char i, w; while(1) { w=0x01;

for( i=0;i<6;i++) { P2=~w; w<<1; P1=led[i]; delay(100); } } }

5、采用T0定时方式2在P1.0口输出周期为0.5ms的方波(设fosc=12MHz)。 分析:计数初值TL0= ((256-250)*12/12)%6 = 0x06, TMOD = 0x02

11

(1)查询方式 (2)中断方式 #include #include sbit P1_0 = P1^0; sbit P1_0=P1^0; main() timer0 () interrupt 1 { TMOD = 0x02; { P1_0 = !P1_0; TH0= TL0 = 0x06; } TR0=1; main() for(;;) { TMOD = 0x02; { while(!TF0); TH0 = TL0 = 0x06; P1_0 =!P1_0; EA= ET0 = 1; TF0 = 0; TR0=1; } while(1); } }

6、设计0~9秒的简易秒表。(用T1,采用方式1编写1s延时函数,系统晶振12M。) #include unsigned char led[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; void delay1s() { unsigned char i; for(i=0;i<0x14;i++) C2C1 { TH1=0x3c; 30PFX130PFU11939XTAL1P0.0/AD0 TL1=0xb0; 38P0.1/AD137P0.2/AD2CRYSTAL TR1=1; 1836XTAL2P0.3/AD335P0.4/AD4 while(!TF1); 34P0.5/AD5C333P0.6/AD6932 TF1=0; RSTP0.7/AD72110uFR1 } P2.0/A822P2.1/A92310k} P2.2/A102924R3PSENP2.3/A113025ALEP2.4/A12void main() 3126R4220EAP2.5/A1327P2.6/A14{ unsigned char i; 28R5220.P2.7/A15 TMOD=0x10; 110R6220P1.0P3.0/RXD211P1.1P3.1/TXD312 while(1) R7220P1.2P3.2/INT0413P1.3P3.3/INT1514 { for(i=0;i<10;i++) R8220P1.4P3.4/T0615P1.5P3.5/T1716R9220P1.6P3.6/WR { P0=led[i]; 817P1.7P3.7/RD220 delay1s(); AT89C51 } } }

7、通过按键改变灯的显示方式。要求正常情况是8个灯依次点亮,循环显示。按键按下后,8个灯同时亮灭一次,按键动作采用外部中断INT0实现。 #include

void delay(unsigned char t)

12

{ unsigned char i,j;

C1 for(i=200;i>0;i--) X1 for(j=t;j>0;j--); U1C2D1}

D2void int_0() interrupt 0 R10{ P1=0x00; D3C3 delay(250); D4R9 P1=0xff; U2:AD5 delay(250);

D6}

D7U2:Bvoid main()

D8{ unsigned k,w; EA=1;

R8R7R6R5R4R3R2R1 EX0=1; IT0=1; while(1) { w=0x01;

for(k=0;k<8;k++) { P1=~w; w<<=1; delay(100); } }}

8、定时中断方式实现键控的电子秒表:单片机控制2位数码管实现00~59的简易秒表,并利用3C1C2X1个独立按键实现秒表的启动、停止和复位功能。 R2-R7/1kU1#include /51头文件

unsigned char t=0; //定义中断次数 C3unsigned char second=0; //定义秒

R1unsigned char code table[]=

{0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; 启动//定时器0中断函数

暂停LED1timer0() interrupt 1{ 清零 TH0 =0x3c; //初值重装载 TL0 =0xb0; R16-R18/1K t++; //中断次数增1

if(t==20){ //若中断20次,相当于1秒 t=0; //中断次数计数器清零 second++; //秒计数器清零 }

if(second==60) second=0; //若秒计数器=60,清零 }

main(){

TMOD=0x01; //定义T0定时方式1

30pFCRYSTAL19XTAL130pF18XTAL2LED-RED9RSTP0.0/AD0P0.1/AD1P0.2/AD2P0.3/AD3P0.4/AD4P0.5/AD5P0.6/AD6P0.7/AD7393837363534333221222324252627281011121314151617LED-RED10kLED-RED29303122uFPSENALEEALED-REDP2.0/A8P2.1/A9P2.2/A10P2.3/A11P2.4/A12P2.5/A13P2.6/A14P2.7/A1510kLED-RED18161412Y0Y1Y2Y3A0A1A2A324681OELED-RED74LS24012345678P1.0P1.1P1.2P1.3P1.4P1.5P1.6P1.7P3.0/RXDP3.1/TXDP3.2/INT0P3.3/INT1P3.4/T0P3.5/T1P3.6/WRP3.7/RDAT89C51LED-RED9753Y0Y1Y2Y3A0A1A2A31113151719LED-REDOE74LS2401k1k1k1k1k1k1k1k30pF30pF19XTAL1CRYSTAL18XTAL29RSTP0.0/AD0P0.1/AD1P0.2/AD2P0.3/AD3P0.4/AD4P0.5/AD5P0.6/AD6P0.7/AD7393837363534333221222324252627281011121314151617P0.0P0.1P0.2P0.3P0.4P0.5P0.6P0.0P0.1P0.2P0.3P0.4P0.5P0.6PULLUP10uF10k293031PSENALEEAP2.0/A8P2.1/A9P2.2/A10P2.3/A11P2.4/A12P2.5/A13P2.6/A14P2.7/A15P2.0P2.1P2.2P2.3P2.4P2.5P2.6P0.0P0.1P0.2P0.3P0.4P0.5P0.6P2.0P2.1P2.2P2.3P2.4P2.5P2.612345678P1.0P1.1P1.2P1.3P1.4P1.5P1.6P1.7P3.0/RXDP3.1/TXDP3.2/INT0P3.3/INT1P3.4/T0P3.5/T1P3.6/WRP3.7/RDLED280C51 13

TH0 =0x3c; //50ms溢出初值 TL0 =0xb0;

ET0=1; //打开定时器0中断 EA=1; //打开总中断 while(1)

{ P0=table[second/10]; //P0口输出显示 P2=table[second]; //P2口输出显示 P1=P1&0x07; if(P1==0x06) TR0=1; if(P1==0x05) TR0=0; if(P1==0x03)

{ TR0=0; t=0; second=0; } } }

9、利用74LS164扩展并行输出口,并实现LED由上向下循环 。 #include sbit MR=P2^7;

void delay() { unsigned int i; for (i=0; i<20000; i++) ; }

void main() {

unsigned char index, LED; //定义LED指针和显示字模 SCON = 0; //设置串行模块工作在方式0

MR = 1; // CLEAR端=1,允许输入数据 while (1) { LED=0x7f; for (index=0; index < 8; index++) {

SBUF = LED; //控制L0灯点亮

do {} while(!TI); //通过TI查询判别数据是否输出结束 LED = ((LED>>1)|0x80); //左移1位,末位置1 TI=0; delay(); }

}}

14

10、根据如下电路,利用DAC0832编程实现两路锯齿波发生器的功能。 U1+5VU2Y1P2.01939120P0.0/AD0CSVCC38219Y2WRU4 XTAL1P0.1/AD1WR1ILE(BY1/BY2)Y337318WRP0.2/AD2GNDWR2Y4Y41836417P0.3/AD3DI3XFERP2.4Y5Y3355163 XTAL2P0.4/AD4DI2DI4Y6Y2346156P0.5/AD5DI1DI5VXY7Y1337142P0.6/AD6DI0DI6Y8+5V893213 RSTP0.7/AD7VREFDI7741912RFBIOUT2P2.0VX102111P2.0/A8GNDIOUT122P2.1 P2.1/A9VX23DAC0832P2.2/A10A2924P2.4PSENP2.3/A1110kVY3025 ALEP2.4/A12B3126RV1EAP2.5/A13U327P2.6/A14CP2.128120 P2.7/A15CSVCCWR219WR1ILE(BY1/BY2)+5VD110318WRP1.0P3.0/RXDGNDWR2+12V211Y4417 3P1.1P3.1/TXDDI3XFERP2.4Y312516U5P1.2P3.2/INT0DI2DI4Y24136153P1.3P3.3/INT1DI1DI5Y1147146 5P1.4P3.4/T0DI0DI6VY+5V8615132P1.5P3.5/T1VREFDI7WR716912P1.6P3.6/WRRFBIOUT2741VY101711P3.7/RDGNDIOUT1 8P1.780C51DAC0832 net=D910k RV2 +12V #include #include

#define DAC1 XBYTE[0xfeff] //设置1#DAC0832输入锁存器的访问地址 #define DAC2 XBYTE[0xfdff] //设置2#DAC0832输入锁存器的访问地址 #define DAOUT XBYTE[0xefff] //两个DAC0832的DAC寄存器访问地址 void main (void){

unsigned char num; //需要转换的数据 while(1){

for(num =0; num <=255; num++){

DAC1 = num; //上锯齿送入1#DAC DAC2 = 255-num; //下锯齿送入2#DAC

DAOUT = num; //两路同时进行D/A转换输出 } } }

Y8Y7Y6Y5Y8Y7Y6Y5

六、编程分析题:

1、单片机控制单灯闪烁。 #include

void delay(unsigned char k); sbit p1_0=P1^0; main() { while(1) { p1_0=0; delay(200); p1_0=1; delay(200); }}

C130pF1941550t1550%7U1X1CRYSTALXTAL1P0.0/AD0P0.1/AD1P0.2/AD2P0.3/AD3P0.4/AD4P0.5/AD5P0.6/AD6P0.7/AD7P2.0/A8P2.1/A9P2.2/A10P2.3/A11P2.4/A12P2.5/A13P2.6/A14P2.7/A15P3.0/RXDP3.1/TXDP3.2/INT0P3.3/INT1P3.4/T0P3.5/T1P3.6/WRP3.7/RD393837363534333221222324252627281011121314151617C230pF18XTAL29C322uFRSTR11k293031PSENALEEAR2220D1LED-RED12345678P1.0P1.1P1.2P1.3P1.4P1.5P1.6P1.7AT89C5115

void delay(unsigned char k) { unsigned char i,j; for(i=0;i<255;i++) for(j=0;j

2:如下图,编程实现开关控制 LED

说明:开关 S1 和 S2 分别控制 LED1 和 LED2 #include sbit S1=P1^0; sbit S2=P1^1; sbit LED1=P0^0; sbit LED2=P0^1; void main() { while(1)

{ LED1=S1; LED2=S2; } }

3:如下图,编程实现8个发光二极管先按状态1的形式点亮,经过一段时间延时,再按状态2的形式点亮,点亮形式见下表 P1.7 P1.6 P1.5 P1.4 P1.3 P1.2 P1.1 P1.0 P1口引脚 灭 亮 灭 亮 灭 亮 灭 亮 对应灯的状态1 对应灯的状态2 亮 灭 #include void delay( unsigned int time) { unsigned int j = 0; for(; time>0;time--) for( j=0;j<125;j++); }

void main( ) { while(1)

{ P1=0xaa; delay(500); P1=0x55; delay(500); } }

亮 灭 亮 灭 亮 灭 C130pFX1CRYSTALU1C2D1LED-REDD29LED-REDD3RST30pF18XTAL219XTAL1P0.0/AD0P0.1/AD1P0.2/AD2P0.3/AD3P0.4/AD4P0.5/AD5P0.6/AD6P0.7/AD7P2.0/A8P2.1/A9P2.2/A10P2.3/A11P2.4/A12P2.5/A13P2.6/A14P2.7/A15P3.0/RXDP3.1/TXDP3.2/INT0P3.3/INT1P3.4/T0P3.5/T1P3.6/WRP3.7/RD393837363534333221222324252627281011121314151617R10C310k293031PSENALEEALED-REDD422uFLED-REDD5U2:A18161412Y0Y1Y2Y3A0A1A2A3OE2468112345678P1.0P1.1P1.2P1.3P1.4P1.5P1.6P1.7AT89C51A0A1A2A3OE1113151719LED-REDD6LED-REDD7975374LS240U2:BY0Y1Y2Y3LED-REDD8LED-REDR81kR71kR61kR51kR41kR31kR21kR11k74LS24016

4:如下图,编程实现LED循环显示字符:“H” →“L” →“E”。 #include

char led_ mod[]={0x76,0x38,0x79}; //LED显示字模 void delay( unsigned int time) { unsigned int j = 0; for(; time>0;time--) for( j=0;j<200;j++); }

void main(void) { char i=0; while(1)

{for(i=0;i<=2;i++) { P0=led_mod[i]; delay(500); } }}

5、开机时LED全熄,然后根据按键动作使相应灯亮,并将亮灯保持到按压其它键时为止。 #include

R5R6R7R8void main() {

U1 char key = 0; P2=0; while(1){

key = ~P0 & 0x0f; //读取按键状态 R1D1 if (key != 0) P2 = key; //显示到led R2D2 }

R3D3}

R4D4

6、在P0口连接一个共阴极数码管,使之循环显示0~9数字。 #include //包括一个51标准内核的头文件 char led_mod[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //LED显示字模 void delay(unsigned int time) { unsigned int j = 0; C2C130PFX130PFU1 for(;time>0;time--) 1939XTAL1P0.0/AD038P0.1/AD137 for(j=0;j<125;j++); P0.2/AD2CRYSTAL1836XTAL2P0.3/AD335P0.4/AD434} P0.5/AD5C333P0.6/AD6932RSTP0.7/AD7void main(void) { 2110uFR1P2.0/A822P2.1/A923 char i = 0; 10kP2.2/A102924R3PSENP2.3/A113025ALEP2.4/A123126 while(1){ R4220EAP2.5/A1327P2.6/A1428R5220.P2.7/A15 for(i=0;i<=9;i++) { 110R6220P1.0P3.0/RXD211P1.1P3.1/TXD312 P0=led_mod[i]; R7220P1.2P3.2/INT0413P1.3P3.3/INT1514R8220P1.4P3.4/T0615 delay(500); P1.5P3.5/T1716R9220P1.6P3.6/WR817P1.7P3.7/RD} } } 220AT89C511k1k1k1k+5V19XTAL118XTAL29RSTP0.0/AD0P0.1/AD1P0.2/AD2P0.3/AD3P0.4/AD4P0.5/AD5P0.6/AD6P0.7/AD7P2.0/A8P2.1/A9P2.2/A10P2.3/A11P2.4/A12P2.5/A13P2.6/A14P2.7/A15393837363534333221222324252627281011121314151617293031PSENALEEALED-YELLOW10012345678LED-YELLOW100P1.0P1.1P1.2P1.3P1.4P1.5P1.6P1.7P3.0/RXDP3.1/TXDP3.2/INT0P3.3/INT1P3.4/T0P3.5/T1P3.6/WRP3.7/RDLED-YELLOW100LED-YELLOW10080C51 17

7、设计一个开关控制报警器:用K1开关控制报警器,程序控制P1.0输出两种不同频率的声音,模拟很逼真的报警效果.

C2C1#include

22uF193930pF#define uchar unsigned char XTAL1P0.0/AD038X1P0.1/AD137CRYSTALP0.2/AD2C31836sbit SPK=P1^0; XTAL2P0.3/AD335R1P0.4/AD4341kP0.5/AD53330pFsbit K1=P1^7; P0.6/AD6932RSTP0.7/AD721void Alarm(uchar t) //发声函数 P2.0/A822P2.1/A923P2.2/A10U12924{ uchar i,j; PSENP2.3/A113025ALEP2.4/A12312680C51EAP2.5/A1327 for(i=0;i<200;i++) //循环次数控制音频的持续时间 P2.6/A1428P2.7/A15LS1110 { SPK=~SPK; P1.0P3.0/RXD211P1.1P3.1/TXD312P1.2P3.2/INT0413 for(j=0;j

void main() { SPK=0; while(1)

{ if(K1==1) { Alarm(90); Alarm(150); } } }

8、设单片机的fosc=12MHz,采用T0定时方式1在P1.0脚上输出周期为2ms的方波。 分析:1ms定时的计数初值应为:

a = 216 – t* fos / 12 = 216 – 1000* 12/ 12 = 64536 = 0xfc18 TH0 = 0xfc TL0 = 0x18 ① 查询法:

U?#include 1939XTAL1P0.0/AD038P0.1/AD137sbit P1_0=P1^0; P0.2/AD21836XTAL2P0.3/AD335void main (void) { P0.4/AD434P0.5/AD533P0.6/AD6 TMOD = 0x01; //T0定时方式1 932RSTP0.7/AD7 TR0=1; //启动T0 21P2.0/A822P2.1/A923 for( ; ; ) P2.2/A102924PSENP2.3/A113025{ TH0 = 0xfc; //装载计数初值 ALEP2.4/A123126EAP2.5/A1327P2.6/A14 TL0 = 0x18; 28P2.7/A15 while(!TF0); //查询等待TF0复位 110AP1.0P3.0/RXD211P1.1P3.1/TXD312 P1_0 =!P1_0; //定时时间到P1.0反相 BP1.2P3.2/INT0413P1.3P3.3/INT1514CP1.4P3.4/T0 TF0 = 0; //软件清TF0 615P1.5P3.5/T1716DP1.6P3.6/WR }} 817P1.7P3.7/RD②中断法: 80C51#include sbit P1_0=P1^0;

timer0 () interrupt 1 //T0中断函数 { P1_0 = !P1_0; //P1.0取反 TH0 = 0xfc; //装载计数初值

18

TL0 = 0x18; }

main ()

{ TMOD = 0x01; //T0定时方式1 TH0 = 0xfc; //装载计数初值 TL0 = 0x18; EA=1; //开总中断 ET0=1; //开T0中断 TR0=1; //启动T0

while(1); }

9、使用T1,分别用工作方式1、方式2 、方式0实现1s延时函数,晶振频率为12M.

19

C130pFX1CRYSTALC310uFR110k10、程序运行开始时先显示“00”,随后显示数值逐渐增大。待计数到59后,自动从“00”开始。 //定时中断方式实现的电子秒表

#include //51头文件

unsigned char t=0; //定义中断次数计数器 unsigned char second=0; //定义秒计数器

unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; timer0() interrupt 1{ //定时器0中断函数 TR0=0;

TH0 =0x3c; //初值重装载 TL0 =0xb0;

t++; //中断次数增1

if(t==20){ //若中断20次,相当于1秒 t=0; //中断次数计数器清零 second++; //秒计数器清零 }

if(second==60) second=0; //若秒计数器=60,清零 P0=table[second/10]; //P0口输出显示 P2=table[second]; //P2口输出显示 TR0=1; }

main(){

TMOD=0x01; //定义T0定时方式1 TH0 =0x3c; //50ms溢出初值 TL0 =0xb0;

P0=table[second/10]; //P0口输出显示 P2=table[second]; //P2口输出显示 TR0=1; //启动定时器 ET0=1; //打开定时器0中断 EA=1; //打开总中断 while(1){} //主程序循环 } C1C2C2 30pF30pFX1U1R2-R7/1kR2 U11939XTAL1P0.0/AD038220P0.1/AD137P0.2/AD2CRYSTAL 1836XTAL2P0.3/AD335P0.4/AD434P0.5/AD5C3 33P0.6/AD6932RSTP0.7/AD7 2110uFR1P2.0/A822P2.1/A92310kP2.2/A10 2924PSENP2.3/A113025ALEP2.4/A123126EAP2.5/A13 27P2.6/A1428P2.7/A15 110P1.0P3.0/RXD211P1.1P3.1/TXDLED1LED2312P1.2P3.2/INT0 413P1.3P3.3/INT1514P1.4P3.4/T0615P1.5P3.5/T1 716P1.6P3.6/WR817P1.7P3.7/RD 80C51第10题图 第11题图 30pF19XTAL118XTAL29RSTP0.0/AD0P0.1/AD1P0.2/AD2P0.3/AD3P0.4/AD4P0.5/AD5P0.6/AD6P0.7/AD7393837363534333221222324252627281011121314151617P0.0P0.1P0.2P0.3P0.4P0.5P0.6P0.0P0.1P0.2P0.3P0.4P0.5P0.6PULLUP293031PSENALEEAP2.0/A8P2.1/A9P2.2/A10P2.3/A11P2.4/A12P2.5/A13P2.6/A14P2.7/A15P2.0P2.1P2.2P2.3P2.4P2.5P2.6P0.0P0.1P0.2P0.3P0.4P0.5P0.6P2.0P2.1P2.2P2.3P2.4P2.5P2.612345678P1.0P1.1P1.2P1.3P1.4P1.5P1.6P1.7P3.0/RXDP3.1/TXDP3.2/INT0P3.3/INT1P3.4/T0P3.5/T1P3.6/WRP3.7/RD80C51D1LED-YELLOW 20

11、定时器控制单只LED(说明:LED在定时器的控制下不断闪烁,闪烁间隔时间为1S )。 ①查询方法: ②中断方法: #include #include sbit LED=P0^0; unsigned char T_Count=0; void main() sbit LED=P0^0; { unsigned char i; void main() { TMOD=0x01; //定时器0工作方式1 TMOD=0x01; //定时器0工作方式1 TH0=0xec; //5ms定时设初值 TR0=1; TL0=0x78; while(1) IE=0x82; //允许T0中断 { } //1s定时 TR0=1; for(i=0;i<200;i++) { TH0=0xec; while(1); } TL0=0x78; //T0中断函数 while(!TF0); TF0=0; void LED_Flash() interrupt 1 } { TH0=0xec; //恢复初值 TL0=0x78; LED=~LED; if(++T_Count==200) //1s开关一次LED } } { LED=~LED; T_Count=0;

}}

12、 利用T0的计数功能,对按下按键的次数计数,显示在数码管上。一通电,数码管显示“00” 。 #include

unsigned char code table[]={0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07,0x7f,0x6f}; unsigned char count=0; //计数器赋初值 RP1sbit p1_0=P1^0; RESPACK-7

VCCint0_srv () interrupt 1{ //T0中断函数

U1 if(++count==100) count=0; //判断循环是否超限 LED1a1939XTAL1P0.0/AD0b38 P0=table[count/10]; //显示十位数 P0.1/AD1c37P0.2/AD2d1836XTAL2P0.3/AD3e35 P2=table[count]; //显示个位数 P0.4/AD4f34P0.5/AD5g33P0.6/AD6932} RSTP0.7/AD7a21P2.0/A8b22 P2.1/A9c23P2.2/A10d2924PSENP2.3/A11e3025main(){ ALEP2.4/A12f3126EAP2.5/A13g27P2.6/A142880C51 P0=P2=table[0]; //显示初值“00” P2.7/A15110P1.0P3.0/RXD211P1.1P3.1/TXD TMOD=0x06; //T0计数方式2 312P1.2P3.2/INT0413P1.3P3.3/INT1514P1.4P3.4/T0 TH0=TL0=0xff; //计数初值 615P1.5P3.5/T1BUT716P1.6P3.6/WR817P1.7P3.7/RD ET0=1; //开中断

EA=1;

TR0=1; //启动T0 while(1); }

12345678LED2 21

13、定时器控制3只LED(说明:LED在定时器的控制下不断闪烁,闪烁间隔时间为1S )。 #include

unsigned char T_Count=0;

C2C122pf22pf//T0中断函数 0R11939XTAL1P0.0/AD0void LED_Flash() interrupt 1 38220P0.1/AD137X1R2P0.2/AD212M1836{ TH0=0xec; //恢复初值 XTAL2P0.3/AD335220P0.4/AD434R3P0.5/AD5 TL0=0x78; 33P0.6/AD6932220RSTP0.7/AD7 P0=P0&0x49; //屏蔽多余的位 22021C3P2.0/A822P2.1/A910uF if(++T_Count==200) //1s开关一次LED 23P2.2/A102924PSENP2.3/A11302510k { P0=~P0; ALEP2.4/A123126EAP2.5/A1327P2.6/A14 T_Count=0; 28P2.7/A15110 } P1.0P3.0/RXD211P1.1P3.1/TXD312P1.2P3.2/INT0} 413P1.3P3.3/INT1514P1.4P3.4/T0void main() 615P1.5P3.5/T1716P1.6P3.6/WR817{ TMOD=0x01; //定时器0工作方式1 P1.7P3.7/RDAT89C51 TH0=0xec; //5ms定时设初值 CLOCK=12MHz TL0=0x78;

IE=0x82; //允许T0中断 TR0=1; while(1); }

14、根据如下电路,编程实现由DAC0832输出一路三角波的功能

#include #include

#define DAC0832 XBYTE[0xfeff] //设置DAC0832的访问地址 unsigned char num; void main() { while (1) {

for (num = 0 ; num < 255 ; num++) //上升段波形 DAC0832=num;

for (num = 255 ; num > 0 ; num--) //下降段波形 DAC0832=num; //DAC0832转换输出 } U1D01939XTAL1P0.0/AD0} D138P0.1/AD1+5VD237P0.2/AD2U2D31836 XTAL2P0.3/AD3D4IOUT1351011P0.4/AD4GNDIOUT1D5RFBIOUT234912P0.5/AD5RFBIOUT2 D6D733813P0.6/AD6VREFDI7D7D0D6932714RSTP0.7/AD7DI0DI6D1D5615 DI1DI5CSD2D421516P2.0/A8DI2DI4D322417P2.1/A9DI3XFER 23318P2.2/A10GNDWR2WR2924219PSENP2.3/A11WR1ILE(BY1/BY2)CS3025120 ALEP2.4/A12CSVCC+5V3126EAP2.5/A1327DAC0832P2.6/A14 28P2.7/A15RFBA110 P1.0P3.0/RXD211U4P1.1P3.1/TXDB312P1.2P3.2/INT0 IOUT1413P1.3P3.3/INT1C514P1.4P3.4/T0IOUT2615 P1.5P3.5/T1DWR7168P1.6P1.7P3.6/WRP3.7/RD17OPAMP80C51D1D2D3 22 15、采用ADC0809设计数据采集电路,将IN7通道输入的模拟量信号进行测量,结果以16进制显示。

#include

#include

#define AD_IN7 XBYTE[0xfeff] //IN7通道地址 sbit ad_busy=P3^3; //定义检测单元变量 void main(void){ while(1){

AD_IN7 = 0; //启动A/D信号 while(ad_busy==1); //等待A/D转换结束 P1 = AD_IN7; //转换数据显示 }}

16、利用两片74LS273扩展16位并行I/O口,且使其外接LED按1010 1010 0000 1111的规律发光。 U1D8 U3AR10D7R9 D6R8 D5U3:BR7 U2D4R6D3 R5D2R4 D1R3 D16U3R16 D15R15 D14R14 D13R13D12 R12D11R11 D10R2 D9R1#include 87654321P1.7P1.6P1.5P1.4P1.3P1.2P1.1P1.0P3.7/RDP3.6/WRP3.5/T1P3.4/T0P3.3/INT1P3.2/INT0P3.1/TXDP3.0/RXDP2.7/A15P2.6/A14P2.5/A13P2.4/A12P2.3/A11P2.2/A10P2.1/A9P2.0/A817161514131211102827262524232221323334353637383923UQ71270UQ674LS02270UQ5+5V27056UQ43130294EAALEPSEN27074LS02111181714138743MRCLKD7D6D5D4D3D2D1D0UQ32709RST18XTAL219XTAL1P0.7/AD7P0.6/AD6P0.5/AD5P0.4/AD4P0.3/AD3P0.2/AD2P0.1/AD1P0.0/AD0P0.0P0.1P0.2P0.3P0.4P0.5P0.6P0.7P0.0P0.1P0.2P0.3P0.4P0.5P0.6P0.7Q7Q6Q5Q4Q3Q2Q1Q0191615129652UQ7UQ6UQ5UQ4UQ3UQ2UQ1UQ0UQ2270UQ1270UQ027074LS273MRCLKD7D6D5D4D3D2D1D080C51111181714138743VQ7270P0.0P0.1P0.2P0.3P0.4P0.5P0.6P0.7Q7Q6Q5Q4Q3Q2Q1Q0191615129652VQ7VQ6VQ5VQ4VQ3VQ2VQ1VQ0VQ6270VQ5270VQ427074LS273VQ3270VQ2270VQ1270VQ0270 23

#define U2 XBYTE [0x7fff] #define U3 XBYTE [0xbfff] void main(void){

U2=0xaa; //U2送1010 1010b U3=0x0f; //U3送0000 1111b while(1); }

17、对RV1电压进行实时AD转换,结果以十进制数形式进行动态显示。 C1C230PFX130PFU1R1-R8 /1kVCC19XTAL1P0.0/AD039P0.1/AD138CRYSTAL18P0.2/AD237XTAL2P0.3/AD336P0.4/AD435C3P0.5/AD5349P0.6/AD633RSTP0.7/AD73210uFR9P2.0/A82110kP2.1/A92229P2.2/A1023频率5kHz30PSENP2.3/A112431ALEP2.4/A1225U3(CLOCK)EAP2.5/A1326P2.6/A1427P2.7/A1528D01D12P1.0P3.0/RXD10U3P3.1/TXD1110D23P1.126P3.2/INT01227IN0CLOCK6D34P1.2P3.3/INT11328IN1STARTD45P1.3P3.4/T0141IN27D56P1.4?RV1P3.5/T1152IN3EOCD67P1.5P3.6/WR164.7K3IN421D7D78P1.6P1.7P3.7/RD174IN5OUT120D65IN6OUT280C51IN7OUT319D525OUT418D424ADD AOUT58D323ADD BOUT615D222ADD COUT714D1ALEOUT817D01216VREF(+)VREF(-)OE9ADC0808 #include

sbit _st = P2^5; //定义AD启动位,_st sbit _eoc = P2^6; //定义AD结束位,_eoc sbit _oe = P2^7; //定义AD使能位,_oe sbit led0 = P2^3; //定义数码管最低位,led0 sbit led1 = P2^2; //定义数码管第二位,led1 sbit led2 = P2^1; //定义数码管第三位,led2

unsigned char ad_result=0; //定义AD转换结果变量,ad_result unsigned char table[] = {0x3f,0x06,0x5b,

0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//定义十进制显示字模数组,table[]

void delay(unsigned int time){ //延时函数 unsigned int j = 0; for(;time>0;time--)

for(j=0;j<125;j++); }

void disp(void){ //动态显示函数 led2=0; //第三位位码清0

24

P0=table[ad_result/100]; //输出第三位的字模 delay(10); //延时10ms

led2=1; //第三位位码置1

led1=0; //第二位位码清0 P0=table[(ad_result/10)]; //输出第二位的字模 delay(10); //延时10ms

led1=1; //第二位位码置1 led0=0; //最低位位码清0 P0=table[ad_result]; delay(10); led0=1; }

void main(void){ while(1){

_st=0;_st=1;_st=0; while(!_eoc); _oe=1; ad_result=P1; _oe=0; disp(); } } //输出最低位的字模 //延时10ms

//最低位位码置1 //模拟启动时序,发出启动AD转换脉冲 //查询EOC标志,若EOC=0,原地等待 //若EOC=1,使能OE置1 //读取AD转换结果 //使能OE置0

///动态显示函数调用 25

本文来源:https://www.bwwdw.com/article/dmjp.html

Top