单片机实验例题及答案
单片机习题及参考答案

(一)填空题1. 除了“单片机”之外,单片机还可以称之为单片微控制器和单片微型计算机。
2. 专用单片机由于已经把能集成的电路都集成到芯片内部了,所以专用单片机可以使系统结构最简化,软硬件资源利用最优化,从而极大地提高了可靠性和降低了成本。
3. 在单片机领域内,ICE的含义是在线仿真器(In Circuit Emulator)。
4. 单片机主要使用汇编语言,而编写汇编语言程序要求设计人员必须精通和指令系统,单片机硬件结构。
5. CHMOS工艺是 CMOS 工艺和 HMOS 工艺的结合,具有低功耗的特点。
6. 与8051比较,80C51的最大特点是所用CHMOS工艺。
7. 微控制技术是对传统控制技术的一次革命,这种控制技术必须使用单片机才能实现。
(二)选择题1.下列简写名称中不是单片机或单片机系统的是(A)MCU (B)SCM (C)ICE (D)CPU2.在家用电器中使用单片机应属于计算机的是(A)数据处理应用(B)控制应用(C)数值计算应用(D)辅助工程应用3.80C51与80C71的区别在于(A)内部程序存储器的类型不同(B)内部数据存储器的类型不同(C)内部程序存储器的容量不同(D)内部数据存储器的容量不同4.8051与80C51的区别在于(A)内部ROM的类型不同(B)半导体工艺的形式不同(C)内部寄存单元的数目不同(D)80C51使用EEPROM,而8051使用EPROM5.在下列单片机芯片中使用掩膜ROM作为内总程序存储器的是(A)8031 (B)80C51 (C)8032 (D)87C516.80C51芯片采用的半导体工艺是(A)CMOS (B)HMOS (C)CHMOS(D)NMOS7.单片机芯片8031属于(A)MCS-48系列(B)MCS-51系列(C)MCS-96系列(D)MCS-31系列8.使用单片机实现在线控制的好处不包括(A)精确度高(B)速度快(C)成本低(D)能与数据处理结合9.以下所列各项中不是单片机发展方向的是(A)适当专用化(B)不断提高其性能(C)继续强化功能(D)努力增加位数(一)判断题1.用户构建单片机应用系统,只能使用芯片提供的信号引脚。
单片机练习题标准答案

单片机练习题标准答案单片机练习题答案一、填空题1、若单片机振荡脉冲频率为6MHz时,一个机器周期为______2μs________。
2、AT89C51单片机得XTAL1与XTAL2引脚就是___外接晶振或时钟__引脚。
3、定时器/计数器得工作方式3就是指得将定时器/计数器T0拆成两个独立得8位计数器。
4、若由程序设定RS1、RS0=01,则工作寄存器R0~R7得直接地址为__08~0FH____.5、写出完成相应功能得汇编指令:将立即数11H送到R2____ MOV R2,#11H ____、使ACC、2置位____ SETB ACC、2__、使累加器得最低2位清零___ ANL A,#0FCH ___。
6、A/D转换得作用就是将__模拟____量转为数字量。
ADC0809就是__8___位得A/D转换芯片。
7、8051得堆栈区一般开辟在用户RAM区得地址为30H~7FH。
8、所谓寻址,其实质就就是__如何确定操作数得单元地址问题_。
9、若单片机振荡脉冲频率为12MHz时,一个机器周期为____1μs ______.10、定时器中断请求发生在__计数溢出得时候_____。
11、中断响应时间就是指__从中断请求发生直到被响应去执行中断服务程序所需得时间____。
12、通过CPU对I/O状态得测试,只有I/O已准备好时才能进行I/O传送,这种传送方式称为____程序查询方式___。
13、在中断服务程序中现场保护与现场恢复期间,中断系统应处在__关中断__状态。
14、8051单片机得内部硬件结构包括了:中央处理器(CPU)、数据存储器(RAM)、程序存储器、与2个16位定时/计数器以及并行I/O口、串行口、中断控制系统、时钟电路、位处理器等部件,这些部件通过内部总线相连接。
15、MCS-51得堆栈只可设置在RAM得地址为30H~7FH,堆栈寄存器sp就是8位寄存器。
16、MCS-51单片机得P0~P4口均就是并行I/O口,其中得P0口与P2口除了可以进行数据得输入、输出外,通常还用来构建系统得数据总线与地址总线,在P0~P4口中,P0为真正得双相口,P1—P3为准双向口;P3口具有第二引脚功能。
单片机编程练习题(含部分答案)

单片机编程练习题(含部分答案)编程练习题1. 编一程序将片内存储单元20H~3FH单元的内容复制到40H~5FH单元。
MOV R0,#20H MOV R1,#40H MOV R7,#32LOOP: MOV A,@R0MOV @R1,A INC R0 INC R1DJNZ R7,LOOP SJMP $2. 编一程序将片内存储器40H单元的内容与41H单元的内容进行比较,若相等将50H置00H,若不等将50H置0FFH。
3. 在片内数据存储单元30H~4FH中存有32个同学的数学成绩,编一程序计算有多少同学成绩不及格(成绩低于60为不及格)。
若20H作为计数存储单元MOV R0,#30H MOV 20H,#0 MOV R0,#30H MOV R7,#32 MOV 20H,#0LOOP: MOV A,@R0 MOV R7,#32 SUBB A,#60 LOOP: CJNE @R0,#60,NE JNC GE NE: JNC GE INC 20H INC 20H GE: INC R0 GE: INC R0DJNZ R7,LOOP DJNZ R7,LOOPSJMP $ SJMP $4. 内部RAM中分别以地址20H和30H开始的连续16个单元,按顺序依次将两组中相应单元的内容相加(不考虑溢出),并将和存入外部RAM 2000H开始的单元中。
MOV R0,#20H MOV R1,#30H MOV DPTR,#2000H MOV R7,#16LOPP: MOV A,@R0ADD A,@R1 MOVX @DPTR,A INC R0 INC R1 INC DPTRDJNZ R7,LOOP SJMP $5. 设内部RAM 20H单元为数据块的起始地址,数据块长度为10H,数据为8位无符号数,试编程找出数据块中的最小值,并将其存入40H单元。
MOV R0,#20H MOV 40H,#255 MOV R7,#10HLOOP: MOV A,@R0SUBB A,40H JNC NJWMOV 40H,@R0NCW: INC R0DJNZ R7,LOOP SJMP $6. 比较两个ASCII码字符串是否相等。
单片机课后重要习题答案

单片机课后重要习题答案单片机课后重要习题答案在学习单片机的过程中,课后习题是巩固知识、提高编程能力的重要环节。
下面是一些常见的单片机课后习题及其答案,供大家参考。
一、基础题1. 请用C语言编写一个程序,实现将一个整数的二进制表示输出到LED灯上。
答案:```c#include <reg52.h>void main(){int num = 10; // 待转换的整数int i;while (1){for (i = 0; i < 8; i++){P1 = num & (1 << i) ? 0xFF : 0x00; // 判断第i位是否为1,是则点亮LED灯delay(); // 延时函数}}```2. 请编写一个程序,实现将一个8位二进制数的奇偶校验位计算出来,并输出到P1口。
答案:```c#include <reg52.h>void main(){unsigned char num = 0b10011010; // 待计算的8位二进制数int count = 0;int i;for (i = 0; i < 8; i++){if (num & (1 << i)){count++;}}P1 = count % 2 ? 0xFF : 0x00; // 奇数个1则输出高电平,偶数个1则输出低电平}二、进阶题1. 请编写一个程序,实现一个简单的计算器功能,能够进行加、减、乘、除四则运算,并将结果输出到数码管上。
答案:```c#include <reg52.h>void main(){unsigned char num1 = 10; // 第一个操作数unsigned char num2 = 5; // 第二个操作数unsigned char operator = '+'; // 运算符,可修改为其他运算符unsigned char result;switch (operator){case '+':result = num1 + num2;break;case '-':result = num1 - num2;break;case '*':result = num1 * num2;break;case '/':result = num1 / num2;break;default:result = 0;break;}// 将结果输出到数码管上P1 = result;}```2. 请编写一个程序,实现一个简单的密码验证功能,用户输入密码后,若密码正确,则点亮一个LED灯,否则不点亮。
单片机实验练习题

1.利用8255A可以扩展个并行口,用区分往控制寄存器中写的数据是置位/复位控制字还是方式控制字。
2.执行MOVX A,@DPTR指令时, MCS—51产生的控制信号是。
3.当单片机复位时PSW= H,这时当前的工作寄存器区是区,R6所对应的存储单元地址为 H。
4.MCS—51单片机的复位信号是有效。
5.已知(SP)=60H,子程序SUBTRN的首地址为0345H,现执行位于0123H的ACALL SUBTRN双字节指令后,(PC)= ,(61H)= ,(62H)= 。
6.MCS-51访问片外存储器时,利用信号锁存来自发出的低8位地址信号。
7.MCS-51单片机有级优先级中断。
8.串行口方式2接收到的第9位数据送寄存器的位中保存。
9. 已知1只共阴极LED显示器,其中a笔段为字形代码的最低位,若需显示数字1,则它的字形代码应为。
10.堆栈的特性是,8051的堆栈一般开辟在,其堆栈指针是。
11.定时器/计数器的工作方式3是指得将___ __拆成两个独立的8位计数器。
而另一个定时器/计数器此时通常只可作为___ __使用。
12.51系统单片机的EA引脚保持高电平,当地址号小于4K时,CPU访问的是程序存储器,当地址号大于4K时,CPU访问的是程序存储器,当EA引脚保持低电平,CPU只访问程序存储器,对于8031来说,它的EA引脚必须接。
13.51系列单片机上电复位后,堆栈区的最大允许范围是个单元。
14.在多机通信中,若字符传送率为100B/s,则波特率等于。
15.在多机通信中,主机发送从机地址呼叫从机时,其TB8位为;各从机此前必须将其SCON 中的REN位和位设置为1。
16.若由程序设定RS1、RS0=10,则工作寄存器R0~R7的直接地址为___ ____。
17.若累加器A中的数据为01110010B,则PSW中的P=__ ___。
18.在中断服务程序中现场保护和现场恢复期间,中断系统应处在_ ___。
单片机程序分析试题与答案

六、设计题1.某单片机控制系统有8个发光二极管。
试画出89C51与外设的连接图并编程使它们由右向左轮流点亮。
答:图(5分) 构思(3分)MOV A,#80H (1分)UP:MOV P1,A (1分)RR A (2分)SJMP UP (1分)2.某控制系统有2个开关K1和K2,1个数码管,当K1按下时数码管加1,K2按下时数码管减1。
试画出8051与外设的连接图并编程实现上述要求。
答:图(5分) 构思(3分)程序(4分)ORG 0000HLJMP MAINORG 0003HLJMP AINT0ORG 0013HLJMP BINT1MAIN: MOV IE,#83HSETB IT0SETB IT1MOV R0,#00HMOV DPTR,#TABUP: MOV A,R0MOVC A,@A+DPTRMOV P1,ASJMP UPAINT0: INC R0CJNE R0,#10,AINT01MOV R0,#0AINT01: RETIBINT1: DEC R0CJNE R0,#0FFH,BINT11MOV R0,#9BINT11: RETI1.已知在累加器A中存放一个BCD数(0~9),请编程实现一个查平方表的子程序。
1.SQR:1NC AMOVC A,@A+PCRETTAB:DB 0,1,4,9,16DB 25,36,49,64,812.请使用位操作指令实现下列逻辑操作:BIT=(10H∨P1.0)∧(11H∨C Y)2.ORL C,11HMOV 12H,CMOV C,P1.0ORL C,/10HANL C,12HMOV BIT,CRET3.已知变量X存于V AR单元,函数值Y存于FUNC单元,按下式编程求Y值。
Y=10 01xxx> -=<⎧⎨⎪⎩⎪3. MOV A,V ARCJNE A,#0,COMPSJMP RES ;x=0,Y=0COMP:JNC POSI ;x>0,Y=1MOV A,#0FFH ;x<0,Y=-1SJMP RESPOSI:MOV A,#01HRES:MOV FUNC,ARET4.已知在R2中存放一个压缩的BCD码,请将它拆成二个BCD字节,结果存于SUM开始的单元中(低位在前)。
单片机测试习题含答案

单片机测试习题含答案一.选择题1.8位二进制数所能表示的最大无符号数是( B )A.256 B.255 C.128 D.1273.有一个数152,它与十六进制数6A相等,那么该数是( B )A.二进制数 B.八进制数 C.十进制数 D.十六进制数4.十进制数向二进制数进行转换时,十进制数91相当于二进制数( D )A.1001 0001 B.0110 1111 C.0111 0001 D.0101 10115.取指操作后,PC的值是( C )A.当前指令前一条指令的地址 B.当前正在执行指令的地址C.下一条指令的地址 D.控制器中指令寄存器的地址6.80C51单片机中,设置堆栈指针SP为37H后就发生子程序调用,这时SP的值变为( C )A.37H B.38H C.39H D.3AH7.设置堆栈指针SP=30H后,进行一系列的堆栈操作。
当进栈数据全部弹出后,SP应指向( A )A. 30H单元B. 07H单元C. 31H单元D.2FH单元8.程序计数器PC是 ( A )位的计数器,能寻址64KB的程序存储器范围。
A.16 B.8 C.4 D.3210.单片机程序存储器的寻址范围是由程序计数器PC的位数决定的,MCS-51的PC为16位,因此其寻址范围是( C )A.4KB B.8KB C.64KB D.128KB11.80C51单片机地址总线(AB)总线宽度为 ( B )位。
A.8 B.16 C.15 D.3212.8051单片机复位信号应从 ( B )脚接入。
A.P3.2 B.RST C.8脚 D.T113.8051复位后PC和SP中的内容各为 ( C )A.PC=0000H,SP=60H B.PC=0040H,SP=07H C.PC=0000H,SP=07H D.PC=1000H,SP=07H14.一个机器周期含有( C )个时钟周期A.1 B.2 C.6 D.1215.一个机器周期含有① 个时钟周期,当单片机时钟频率为12MHZ时,一个机器周期为②μs ( D )A.①6 ②2 B.①12 ②2 C.①12 ②1 D.①6 ②116.在寄存器间接寻址方式中,指定寄存器中存放的是( D )A.操作数 B.操作数地址 C.转移地址 D.地址偏移量17.下列指令或指令序列中,不能实现PSW内容送A的是()A. MOV A , PSWB. MOV A , 0D0HC. MOV R0 , #0D0HD. PUSH PSWMOV A , @R0 POP ACC18.在相对寻址方式中,“相对”两字是指相对于( A )A. 地址偏移量relB. 当前指令的首地址C. 下一条指令的首地址D. DPTR值19.下列指令或指令序列中,能将外部数据存储器3355H单元内容传送给A的是( B )A. MOVX A , 3355HB. MOV DPTR , #3355HMOVX A , @DPTRC. MOV P0 , #33HD. MOV P2 , #33HMOV R0 , #55H MOV R2 , #55HMOVX A , R0 MOVX A , @R220.对程序存储器的读操作,只能使用( D )A.MOV指令 B.PUSH指令 C.MOVX指令 D.MOVC指令21.执行返回指令后,返回的断点是( C )A.调用指令的首地址B.调用指令的末地址C.调用指令的下一条指令的首地址D.返回指令的末地址22.以下各项中不能用来对内部数据存储器进行访问的是( B )A.数据指针DPTRB. 按存储器单元地址或名称C.堆栈指针SPD.由R0或R1作间址寄存器23.指令MOV寻址空间是 ( C )A.片外ROM B.片外RAM C.片内RAM D.片内ROM24.指令MOVX寻址空间是 ( B )A.片外ROM B.片外RAM C.片内RAM D.片内ROM25.“MUL AB”指令执行后,16位乘积的高位在 ( D )中。
蓝桥杯单片机小例题

1、在蓝桥杯单片机比赛中,常用的单片机类型是什么?
A. ARM Cortex系列
B. 8051系列(答案)
C. AVR系列
D. PIC系列
2、单片机中,I/O端口的主要功能是什么?
A. 仅用于输入数据
B. 仅用于输出数据
C. 可用于输入或输出数据(答案)
D. 用于存储程序
3、下列哪项不是单片机编程中常用的语言?
A. C语言(答案应为非此选项,但为保持格式一致,此处标记为错误选项)
B. 汇编语言
C. Python(答案)
D. C++(部分情况下)
4、在单片机系统中,晶振的主要作用是什么?
A. 提供稳定的电压
B. 提供稳定的电流
C. 提供时钟信号(答案)
D. 提供复位信号
5、单片机中的定时器/计数器,通常用于什么功能?
A. 计算程序运行时间(答案)
B. 存储数据
C. 放大信号
D. 转换电压
6、下列哪种通信方式不是单片机常用的?
A. UART(串行通信)
B. SPI(串行外设接口)
C. HDMI(高清多媒体接口)(答案)
D. I2C(集成电路总线)
7、在单片机编程中,中断的主要作用是什么?
A. 使程序暂停运行
B. 使程序跳转到特定地址执行(答案)
C. 加快程序运行速度
D. 减少程序占用的存储空间
8、单片机复位后,程序计数器(PC)通常指向哪个地址?
A. 0x0001
B. 0x0000(答案,对于大多数单片机而言)
C. 0xFFFF
D. 随机地址。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
单片机实验考试题1、用Proteus打开“简易电子琴.DSN',按图编写程序,设计一个简易电子琴。
按数字键1〜7,分别发“斗”、“来”、“米”……音(频率见实验指导书),按键抬起则发音停止,不考虑高八度和低八度音,按下1〜7以外的其它键不发音。
2、用Proteus打开文件“计数器.DSN',当按下键盘上的0〜F十六个键时,能将键值以十六进制形式在四个数码管上滚动显示。
在LED上显示字符A〜F的形式分别为:代3、用Proteus打开文件“频率计.DSN',图中,在单片机的外部中断0脚接有一个脉冲信号源,编写程序实现一个频率计的功能,能够测定该脉冲信号源的频率。
程序调试时可以修改信号源的频率,比较测量值与设定值的差距,仿真时一般误差在10%内就算正常。
修改信号源频率的方法是,右击信号源图标后再左击,打开信号源的属性对话框,修改其中的频率(frequ ncy),不要改变其它属性值,频率可以在1Hz到10000Hz之间设定。
(提示:可以设置一个外部中断0的中断服务程序,每次中断时给某个变量加一;再设置一个定时器中断服务程序,用于计时。
每秒钟读一次脉冲数,并将其清零,然后将脉冲数显示在数码管上,每秒钟内的脉冲数就是频率。
)4、用Proteus打开文件“电子秒表.DSN',开机时显示00.00,单位是秒,精确到10毫秒,按“SW1 键启动或暂停,按“ SW2键时间清零。
提示:关于点亮小数点,每5mS刷新LED时,判断当刷新到第2个LED时将笔划代码中与小数点对应的位(bit7)清零。
5、用Proteus打开文件“播放音乐.DSN',按图设计一个开机就能播放<康定情歌〉的程序,并将其简谱在数码管上同步滚动显示。
此程序也可以下载到实验板上运行。
6用Proteus打开文件“流水灯.DSN',可以看到在单片机89C52的P2 口接有8个发光二极管。
编写流水灯的程序,使8个发光二极管每隔约0.5秒依次点亮(每次亮一个),要求开始时从左往右点亮,每按一次按钮SW1后,改变流水的方向。
7、用Proteus打开文件“计数器.DSN',当按下键盘上的0〜9十个数字键时,能将键值在四个数码管上滚动显示。
若按了A〜F六个字母键,则在数码管上显示■- (Over)。
8、用Proteus打开文件“电子秒表.DSN',开机时显示00.00,单位是分、秒,按“ SW1键启动/ 暂停计时,在暂停状态按“ SW2键分秒清零。
在计时状态分和秒之间的小数点闪烁(每秒钟亮半秒,熄半秒),暂停状态常亮。
提示:关于小数点闪烁,每5mS刷新LED时,判断当刷新到第2个LED并且时间是前半秒时将笔划代码中与小数点对应的位清零。
9. 用Proteus打开文件“定时关灯控制器.DSN',按图编写程序设计一个定时关灯控制器。
从键盘输入时间(单位:秒,最大9999秒,最小1秒),按一下A键灯亮,时间每秒减1,减到0时停止, 灯熄灭。
可以再次输入时间并启动定时过程。
10. 用Proteus 打开文件“交通信号灯.DSN',编程实现时间倒计时及绿黄红三色灯的切换。
切换方 式为:如此周而复始。
(提示:图中数码管与单片机之间的连接方式与实验指导书中相同 )11. 用Proteus 打开文件“多路开关指示.DSN',可以看到图中有八个按钮、八个发光二极管和一个 数码管。
编写程序实现如下功能:当按一下某一按钮时,该按钮的编号显示在数码管上,同时点 亮对应编号的发光二极管。
12. 用Proteus 打开文件“数字钟.DSN',编写程序实现如下功能:开机时显示 00.00.00 (时分秒), 按钮“SW1控制“时”的调整,每按一次加 1小时;按钮“ SW2控制“分”的调整,每按一次 加1分钟;按钮“ SW3控制“秒”的调整,每按一次加1秒钟,按“ SW4启动数字钟从设定的 时间开始计时。
当按SW1 SW2或 SW3键时,时钟进入暂停状态,再一次按13•实验板上有4个发光二极管,与单片机的连接如右所示。
编写流水灯的程 序,使4个发光二极管每隔1秒依次点亮(每次亮一个),要求每个发光二 极管逐渐点亮然后熄灭,再点亮下一个发光二极管。
程序在实验板上调试 通过。
(提示:通过改变加在单片机引脚上脉冲的占空比来改变发光二极 管的亮度,可以在一个定时中断中点亮发光二极管, 同时启动在另一个定时中断,在该中断过程中关闭发光二极管,两个中断之间的时间间隔逐渐 加大,二极管就慢慢亮起来了。
)(本题无法在Proteus 中仿真) 14•用Proteus 打开文件“流水灯.DSN',可以看到在单片机89C52的P2 口接有8个发光二极管。
编 写流水灯的程序,使8个发光二极管从左往右依次点亮(每次亮一个),当按一下按钮SW1并抬起 后,流水暂停,再按一下按钮 SW1后,从暂停的位置继续流水,如此反复。
15•用Proteus 打开文件“电子打铃器.DSN',编写程序实现定时打铃功能。
要求如下:开机时显示 00.00.00 (时分秒),按钮“ SW1控制“时”的调整,每按一次加1小时;按钮“ SW2控制“分” 的调整,每按一次加1分钟;按钮“ SW3控制“秒”的调整,每按一次加1秒钟,按“ SW4启 动数字钟从设定的时间开始计时。
当按SW1 SW2或 SW3键时,时钟进入暂停状态,再一次按SW4键启动计时。
在程序中设定,8点10分00秒和8点20分00秒各打一次铃,打铃时间长度为10 秒钟。
图中用一发光二极管模拟电铃。
程序调试时可将时间调到打铃前几秒再启动时钟。
16•用Proteus 打开文件“拨盘开关.DSN',可以看到图中有一个6位拨盘开关、六个发光二极管和 一个数码管。
编写程序实现如下功能:当转动拨盘开关时,拨盘开关的编号显示在数码管上,同 时点亮对应编号的发光二极管。
13 16 CMtUhr-1-I P3-4 P3 5 P3.6 P3.7 AT89C51 红灯亮16秒 绿灯亮20秒 黄灯亮3秒0 南北方向东西方向 红灯亮23秒 36 39 秒绿灯亮13秒 黄灯亮3秒17•用Proteus打开文件“流水灯.DSN',可以看到在单片机89C52的P2 口接有8个发光二极管。
编写流水灯的程序,使8个发光二极管从左往右依次点亮,每次亮相邻两个,如先是D1、D2亮,然后是D2、D3亮,……D7、D8亮,D8 D1亮,如此周而复始。
当按一下按钮SW1后,流水暂停,再按一下按钮SW1后,从暂停的位置继续流水。
说明:用自己学号的最后四位数加题号作为源程序文件名,同时将自己的完整学号、班级、姓名、第几题等信息放在源程序的第一行,如1052号同学考第3题,其源程序文件名应为“ 1052_03.C”(题号必须为两位数),源程序的第一行为:/*完整学号班级姓名第X题*/程序要正确缩进,否则扣5分;考试完毕,不要关闭开发环境MedWir和Proteus,不拆除实验板,千万不要关闭计算机。
1、简易电子琴参考答案//1-- 简易电子琴#include <REG51.h>if(key_port == 0xf0) goto rn; a = key_port; key_port = a | 0x0f;delay_ms(20);a = key_port;for (r = 0;r <= 11;r++){ if(a == kcode[r]) break;};if(r > 11) r = 0xff; //0xff 表示无效rn: key_port = 0xf0;return r;}void main(void){ U8 i,k,a;unsigned int b;TMOD=0x11;EA=1;ET0=1;ET1=1;#define U8 unsigned char#define key_port P3code U8 kcode[]={0xEE,0xDE,0xBE,0xED,0xDD,0xBD,0xEB,0xDB,0xBB,0xE7,0xD7,0xB7};// 反转码对应键值 0 1 2 3 4 5 6 7 8 9 A Bcode unsigned int cyc[]={1800,1600,1440,1351,1200,1079,960};// U8 H0,L0,cnt,err;void cntint0(void) interrupt 1 //{ 定时器 0 中断用于产生音阶方波音阶 1-7 的半周期数 TH0=H0;TL0=L0;P2_0=~P2_0;// P2.3 是音乐信号输出脚, P2.3 反相,产生方波} void cntint1(void) interrupt 3 { cnt++;}void delay_ms(U8 ms){ U8 i,j;for(i=0;i<100;i++){ for(j=0;j<ms;j++);};}U8 key(void){ U8 a,r;delay_ms(20); //// 定时器 1 中断用于产生节拍延时 延时 20毫秒, 消除按键抖动 或显示cnt=0;TR1=1;i=0; key_port = 0xf0;delay_ms(20);while(1){if (key_port != 0xf0){ delay_ms(20);k = key();if ((k<8)&&(k>0)){ err=0;TR0=0;P2=0xff; // 关闭显示b=cyc[k-1]; // 根据基本音阶,求出半周期数H0=(65536-b)/256; // 根据半周期数,计算TO初值的高字节和低字节L0=(65536-b)%256;TRO=1; // 启动定时器O 发音while(key_port != OxfO);delay_ms(2O);TRO=O;while(key_port != OxfO);}}}}2、参考答案://2-用Proteus打开文件”计算器.DSN",当按下键盘上的0〜F十六个键时,能将键值以十六进制形式在四个// 数码管上滚动显示。
#include <REG51.H>#define U8 unsigned char#define key_port P3U8 code tab[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E};codeU8 kcode[]={0xEE,0xDE,0xBE,0x7E,0xED,0xDD,0xBD,0x7D,0xEB,0xDB,0xBB,0x7B,0xE7,0xD7,0xB7,0x77};// 反转码对应键值0 1 2 3 4 5 6 7 8 9 A B C D E FU8 scn[]={0xf7,0xfb,0xfd,0xfe};// 先点亮左边一个数码管U8 buf[4]={0,0,0,0};// 显示缓冲区, 开机先显示"0000"U8 cnt = 0; // 扫描计数void delay_ms(U8 ms){ U8 i,j;for(i=0;i<100;i++){ for(j=0;j<ms;j++);};}U8 key(void){ U8 a,r = 0xff;delay_ms(20); // 延时20 毫秒, 消除按键抖动if(key_port == 0xf0) goto rn;a = key_port;key_port = a | 0x0f;delay_ms(20);a = key_port;for (r = 0;r <= 15;r++){ if(a == kcode[r]) break;}; if(r > 15) r = 0xff;rn: key_port = 0xf0; return r; }// 允许中断 // 设定时器 0 为模式 1(16 位 ) // 定时器 0 中断允许 // 晶振 11.0592MHz,5mS // 开始计数while(1){ if (key_port != 0xf0) { k = key();if (k < 16){ for(i=1;i<=3;i++) buf[i-1]=buf[i];// 数字左移一位 buf[3] = k; // 在个位显示刚按的数字 while(key_port !=0xf0);// 等待按键抬起 delay_ms(20);while(key_port != 0xf0);}3、参考答案/*3、用Proteus 打开文件”频率计.DSN",图中,在单片机的外部中断 0脚INTO 接有一个脉冲信号源,编写程序 实现一个频率计的功能,能够测定该脉冲信号源的频率。