微处理器原理与应用实验(51单片机部分)——实验4.1 按键声光报警实验
实验具体内容本实验联系静态按键识别,发光二极管驱动,以及外部中断的使用方法,实验原理图如下图 4.1.1 所示(注:图中元件编号中括号里面的内容表示该元件所在的板子名称,如CPU 表示该元器件位于 CPU 板,以下类同)。
要求利用外部硬件中断,按键按下一次产生一次外部中断,在中断服务程序中计数器加 1,同时,通过发光二极管的闪烁和蜂鸣器响的次数,指示计数器的当前值。当计数到10 时,再次按键将重新从 1 开始计。
连线关系:
实验中端子连接关系如下:
流程图
实验过程
关掉实验箱电源。将 MCU 板插接在母板上,按照前面连接关系表将硬件连接好。
在仿真器断电情况下将仿真器的仿真头插在 MCU 板的 MCU 插座上。将仿真器与开发 PC 机的通信口连接好,打开实验箱及仿真器的电源。
运行 Keil uVision2 开发环境,建立工程 int0_c.uV2,MCU 为 AT89S51,包含启动文件 STARTUP.A51。
按照实验功能要求创建源程序 int0.c 并加入到工程 int0_c.uV2,并设置工程int0_c.uV2 属性,将其晶振频率设置为 11.0592MHz,选 ...
微处理器原理与应用实验(51单片机部分)——实验3.8 ADC0808/9信号采集实验
实验具体内容在 Proteus 环境下搭建如下图所示的电路图:
控制要求:
本实验利用 LCD1602 和 AD0808 实现简单的交流信号过零检测与频率分析。要求信号幅度变化时(满量程的 5%-95%) ,不影响检测的结果。频率检测的结果通过 LCD1602 的第一行显示出来,信号过零时,能够通过 P2.6 输出一个脉冲宽度为 5us 的脉冲信号。
编程思路LCD1602 的控制方法按 3.7 节所示方法进行 ADC0808 的控制方法按 3.8.1 所示方法进行。这里主要是过零点的检测方法如何实现。不能采用判断所采集到的数据是否为 0 的方法来实现,因为你的采集时刻不一定能够严格对准过零时刻。但是,我们注意到在 0 点的两边信号的极性是发生变化的,我们可以利用这一特点来实现过零检测。正弦波每个周期有两个过零点,因此,1s 内过零次数除以 2 就是信号的频率。因此,在程序中可以这样实现 。当每次采集到一个新的数据之后都要看一下这个数据是正数还是负数。当这个数大于 128 时是正数,当它小于 128 时是负数。判断当前数据的正负极性和上一个数据的正负极性是否一致,如果不一致,则说明经 ...
微处理器原理与应用实验(51单片机部分)——实验3.7 LCD1602显示实验
实验具体内容在 Proteus 环境下搭建如下图所示的电路图:
控制要求:
本实验利用 LCD1602 和 16 个按键实现简单的十进制数加减乘除四则混合运算。其中按键 KEY0-KEY9 分别代表了数字 0-9,按键 10-13 分别代表了运算符“+,-,*,/”,按键“15”代表“=”,按键 14 代表清除命令,以便进行下一次的输入和计算。不管什么时候按下清除按键计算过程停止,两个输入变量都将清 0,屏幕将清屏。
LCD1602 的第一行用于显示所输入的两个计算数以及计算符,第二行用于显示计算结果。结果允许为负数,但输入的两个输入数都必须是双字节正整数范围内的数,即:0-32767之间。除数必须保证不为 0,否则将报错。除数时必须能同时显示商与余数。
编程思路按键的扫描与识别可以参考“3.4.1 示例实验”中的方法。LCD1602 的显示控制可以
参考“3.7.2 LCD1602 示例实验”。
编成时要有一个状态变量,该变量用于记录当前是输入的哪个变量。输入第一个变量,遇到输入运算符时结束第一个变量的输入。输入第二个变量,遇到“=”号时结束第二个变量 ...
微处理器原理与应用实验(51单片机部分)——实验3.3 静态LED显示实验
实验具体内容在 Proteus 环境下搭建如下图所示的电路图:
控制要求
图 3.9 中 7SEG2 为十位显示数码管,7SEG1 为个位显示数码管,KEY_LOAD 为倒计时初值按钮,KEY_START 为倒计时启动按钮。要求实现的功能是:当 KEY_LOAD 按钮按下时加载倒计时初值(如:10s),当按下 KEY_START 按钮时,开始倒计时,每过 1s,计时器减 1,直到减到“00”为止。减到“00”时使P3.0 引脚上的 LED 按 10Hz 频率进行闪烁,直到再次 按下 KEY_LOAD 按钮才重新加载初值,并熄灭 LED。再次按下 KEY_START 按钮又一次开始倒 计时,如此反复。
编程思路分析两个 373 的地址:
假定所有无关地址均定义为 1,那么 U2的锁存地址为:#0FE00H,U3的锁存地址为:#0FD00H。
流程图
实验过程① 根据上述实验内容,在 Proteus 环境下建立如上图所示原理图,并将其保存为 staticLED_self.DSN 文件。
② 根据编程思路和流程图编写控制源程序,将其保存为 staticLED_self.asm。
③ 将源程 ...
微处理器原理与应用实验(51单片机部分)——实验3.2 扩展并行I / O口实验
实验内容在 Proteus 环境下搭建如下图所示的电路图:
图3.2.1 电路原理图
实验功能为:
仿真实现交通信号灯控制功能。
控制顺序为:
① 南北绿灯亮,同时东西红灯亮 10s;
② 南北黄灯亮,同时东西红灯亮 2s;
③ 南北红灯亮,同时东西绿灯亮 10s;
④ 东西黄灯亮,同时南北红灯亮 2s;
⑤ 重复①~④。
编程思路①进行初始化工作,包括设置堆栈指针 SP,将两个 373 的输出口所有位均设置为 1,使所有发光二极管全部熄灭。
②分析两个 373 的地址:
假定所有无关地址均定义为 1,那么 U4的锁存地址为:#0FE00H,U5的锁存地址为:#0FD00H。
③分析 4 个状态下两个 373 的输出数据值:
假定“南北绿灯亮,同时东西红灯亮”为状态 1,即:STATUS1;“南北黄灯亮,同时东西红灯亮”为状态 2,即:STATUS2;“南北红灯亮,同时东西绿灯亮”为状态 3,即:STATUS3;“东西黄灯亮,同时南北红灯亮”为状态 4,即:STATUS4。
流程图
实验过程① 根据上述实验内容,在 Proteus 环境下建立如上电路图所示原理图,并将其保
存为 ex ...
微处理器原理与应用实验(51单片机部分)——实验3.1 基本并行I / O口实验
实验具体内容在 Proteus 环境下搭建如下图所示的电路图:
实验功能为:
当按键 SW1 按下之后,D1-D8 轮流点亮,点亮时间为 100ms,当按键停下后,停止轮换,
再次按下后继续轮换。
编程思路①进行初始化工作,包括设置堆栈指针 SP,将 P2 口所有位设置为 1,使 P2 口所接发光二极管全部熄灭。将显示缓冲单元(设为 20H 单元)初始化为 FEH。
② 从 P1 口读数据,查看 P1.0 位,如果 P1.0 位为 0,则执行如下循环:将显示缓冲元的值送给 P2 口,调用 100ms 延时程序,将显示缓冲单元的值循环左移 1 位,再送回显缓冲单元。如果 P1.0 位不为 0 则不执行上述循环。
③重复上面的操作②
流程图
实验过程① 根据上述实验内容,在 Proteus 环境下建立上电路图所示原理图,并将其保存为 basicIO_self.DSN 文件。
② 根据编程思路和流程图编写控制源程序,将其保存为 basicIO_self.asm。
③ 将源程序添加到 U1 中,并构造(build)该程序。
④ 执行仿真过程观察 D1-D8 的指示,查看程序功能是否正确。
⑤ ...
微处理器原理与应用实验(51单片机部分)——实验2.3 C语言程序实验
实验具体内容实验具体内容同实验2.2
编程思路编程思路参考2.2
流程图
实验过程① 根据上述实验内容,参考 2.3.1,编写 C 语言源程序,并加上相应注释,注意扩展名为“*.c”,将其保存。
② 运行 Keil uVision2 开发环境,按照 1.1.3 节介绍的方法建立工程 simlab3.uV2,CPU为 AT89C51,包含启动文件 STARTUP.A51。
③ 编写好的源程序加入工程 simlab3.uV2,并设置工程 simlab3.uV2 属性,将其晶振频率设置为 12MHz,选择输出可执行文件,仿真方式为“Use Simulator”。
④ 构造(Build)工程 simlab3.uV2。如果输入有误进行修改,直至构造正确,生成可执行程序 simlab3.hex 为止。
⑤ 运行程序,并用存储器观察窗口,观察内部 RAM 30H-4FH 单元排序前后的数值。
实验截图:
将数组转移到以30H开始的32字节内部RAM单元中:
调用排序函数后:
实验源程序12345678910111213141516171819202122232425262728293031323 ...
微处理器原理与应用实验(51单片机部分)——实验2.2 汇编程序实验2
实验内容将片内 RAM 30H 开始的 32 个单元中分布着随机的有符号 8 位二进制数,请按从小到大的顺序进行排序,排序后的数据仍然保存到 30H 开始的 32 个单元中(低地址存放小数据)。
编程思路首先,在程序存储器中构建一个表格,该表格具有 32 个随机产生的 8 位二进制数,如:
TABLE: DB 1,3,9,2,17,4,11,6
DB 5,20,100,64,21,14,79,35
DB 92,7,91,23,65,16,13,18
DB 18,73,65,101,27,19,62,69
然后利用查表指令“MOVC A,@A+DPTR”将它们读取到 30H-4FH 单元中,然后再利用“冒泡法排序法”将它们排序即可。“冒泡法排序法”的基本原理是:
遍历所有 32 个数据找出其中的最大者,并记下最大数据所在的存储位置,然后将这个最大的数据放置在最后一个单元,同时,将最后一个单元原来的数据保存到这个最大值原来所处的位置,完成第一轮的排序。
然后,再遍历除了最后一个单元以外的前面 31 个单元的数据并找出其中最大者,并记下其所在位置,遍历完这一遍后将找到的最大数据保存在倒数第二 ...
微处理器原理与应用实验(汇编部分)——实验4 汇编程序编写和提高
实验具体内容
编写一个汇编程序,实现字符串的复制功能,并且将复制的字符串显示出来。(选做部分:倒序显示复制字符串)
利用中断调用,在屏幕上显示1—9之间随机数。中断号86H。
键盘输入10个学生的成绩,编写一个程序统计60 - 69分,70 - 79分,80 - 89分,90 - 99分及100分的人数,分别存放在Score6,Score7,Score8,Score9和Score10单元中。输出10个学生的成绩如下:65 98 78 82 88 95 72 62 90 100
1. 字符串复制显示(1)流程图
正序输出:
倒序输出:
(2)汇编源代码
正序输出:
1234567891011121314151617181920212223242526272829303132333435363738DATAS SEGMENTstring_a db 'The School of Information Science and Engineering Shandong University','$'COUNT DW $-OFFSET STRING_ ...
微处理器原理与应用实验(汇编部分)——实验3 子程序汇编实验学习和提高
实验具体内容
十六进制转换十进制数
判断闰年
两个十进制数相加
1. 十六进制转换十进制数(1)流程图
(2)汇编源代码
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899DATAS SEGMENTstr1 db 10,13,'Please input a hex number(Support up to 4 hexadecimal numbers):',13,10,'$'str2 db 'the dec number:',13,10,'$'str3 db 'the bin number:',13,10,'$'str4 db 'th ...