热身


  测接口实验

    测试实验台的 8255 接口是否完好,可以这么测:按下一个键, LED 显示对应开关的打开与否。我们组运气比较倒霉,第一天时碰到有坏的接口。

    需要注意的地方:把端口号(我们的实验台 IOY0 是 0600H,状态控制字端口是 0606H,控制字 82H 表示 B口输入 其他口输出),状态控制字都检验一遍,查看 8255 每个端口是否能正常输入输出。

;(1)按下任意一个键,LED显示对应开关的打开与否
IOY0  EQU 0600H
AA    EQU IOY0+0*2
BB    EQU IOY0+1*2
CC    EQU IOY0+2*2
MODE  EQU IOY0+3*2
STACK1  SEGMENT STACKDW  256  DUP(?)
STACK1  ENDS
CODE SEGMENTASSUME CS:CODE,SS:STACK1
START:MOV DX,MODEMOV AL,82HOUT DX,AL
NEXT:MOV DX,BBIN  AL,DXMOV DX,AAOUT DX,ALMOV AH,1JMP NEXTMOV AH,4CHINT 21H
CODE ENDSEND START

  流水灯实验要求

    能够在自行设计的接口开发板上,利用不同开关控制 LED 灯的变化。例如:K1 从左往右,K2 从右往左,K3 从中间向两边,K4 从两边向中间依次亮灭变化

    

  解法

    这段代码当时做的时候没存储,不过代码的逻辑很简单:设置好实验台上的端口输出与状态字相关操作后,利用一个十六位的寄存器负责将数据输出到两个八排 LED 灯,每次循环执行 ROR 或者 ROL(根据需求而定)。

    当时的实验台:

      

    下面这段代码只是一个 Demo,可以以此基础上改:

;(2)流水灯实验
IOY0  EQU 0600H
AA    EQU IOY0+0*2
BB    EQU IOY0+1*2
CC    EQU IOY0+2*2
MODE  EQU IOY0+3*2
STACK1  SEGMENT STACKDW  256  DUP(?)
STACK1  ENDS
CODE SEGMENTASSUME CS:CODE,SS:STACK1
START:MOV DX,MODE                这几行是设置控制字MOV AL,80H  ;80H 输出, 82H输入OUT DX,ALMOV BL,80HMOV BH,01H
NEXT:MOV DX,AA            输出步骤:1、设置值  2、设置地址  3、向端口输出MOV AL,BLOUT DX,ALMOV DX,BBMOV AL,BHOUT DX,ALCALL DELAYROR BL,1ROL BH,1JMP NEXTMOV AH,4CHINT 21H
DELAY PROC NEARMOV CX,20H
D1:MOV AX,0FFFFH
D2:DEC AXJNZ D2LOOP D1RET
DELAY ENDP
CODE ENDSEND START

  数码管实验要求

    能够在自行设计的接口开发板上,上电数码管显示 0-7,实现拨动不同开关,数码管显示该开关位置(1-8);若拨动两个及以上的开关,数码管显示“E”

    

  解法

    B口读取开关并进行条件判断,并利用右移判断有几个0,再根据这个信息找到段码中对应的值并显示在数码管上。没有啥很难的算法,当时被坑的地方主要在于段寄存器没有初始化,使得数码管半天不亮。

IOY0 EQU 0600H
AA EQU IOY0 + 0 * 2
BB EQU IOY0 + 1 * 2
CC EQU IOY0 + 2 * 2
MODE EQU IOY0 + 3 * 2DATA SEGMENTCODES db 00h, 3fh, 06h, 5bh, 4fh, 66h, 6dh, 7dh, 07h, 7fh, 6fh, 79hLEN EQU $-CODES
DATA ENDSSTACK1 SEGMENT STACKDW 256 DUP(?)
STACK1 ENDSCODE SEGMENTassume cs:CODE, ds:DATA, ss:STACK1
START:;set control-wordMOV DX, MODEMOV AL, 82HOUT DX, AL;set dsMOV AX, DATAMOV DS, AXL:;GET KEY VALUEMOV DX, BBIN AL, DXCALL FUNCTIONJMP LFUNCTION PROCCMP AL, 00H JZ DEFAULTCMP AL, 01HJZ SHOWCMP AL, 02HJZ SHOWCMP AL, 04HJZ SHOWCMP AL, 08HJZ SHOWCMP AL, 10HJZ SHOWCMP AL, 20HJZ SHOWCMP AL, 40HJZ SHOWCMP AL, 80HJZ SHOWJMP EXCEPTION                SHOW:;MOV AH, 00H;MOV BL, 02H;DIV BLMOV CL, 0;get Codes address;ADD SI, AX;ADD SI, 01HJMP COUNTDEFAULT:MOV SI, OFFSET CODESMOV AL, DS:[SI] ;set original valueMOV DX, AA ;set addressOUT DX, ALCALL DELAYJMP LNEXT:MOV SI, OFFSET CODESMOV AH, 00HMOV AL, 00HMOV AL, CLADD SI, AXMOV AL, DS:[SI] ;set original valueMOV DX, AA ;set addressOUT DX, ALCALL DELAYRETEXCEPTION:MOV SI, OFFSET CODESADD SI, len DEC SIMOV AL, DS:[SI] ;set original valueMOV DX, AA ;set addressOUT DX, ALCALL DELAYRETCOUNT:ADD CL, 01HSHR AL, 1JNC COUNTJMP NEXTFUNCTION ENDPEXIT :MOV AH, 4CHINT 21HDELAY PROCPUSH CXPUSH BXMOV BX, 0FFFHD1: MOV CX, 010HD2: LOOP D2DEC BXJNZ D1POP BXPOP CXRETDELAY ENDPCODE ENDS
END START

汽车控制


  我们的汽车控制逻辑是这样:利用两个数码管显示汽车速度,一个数码管显示档位,4个开关控制速度的增加与减少,K1 为 1 挡(10 km/h),K2 为 2 挡(20 km/h),K3 为 4挡(40km/h),K4 为 6挡(60km/h),加速时只能依次加,而不能直接增加到 6挡,减速时可以直接从 60 减速到 0。

  实现难点在于数码管的动态显示:由于四位一体数码管同用一个串口进行输入,这样的话我们就不能分别送不同的值给四个数码管,所以需要通过 8255 的 C 口输出数码管地址口而不是将数码管地址口全部接 GND,使其中三个通高电平,一个接地(共阴极数码管,相当于这个口输入为 0),使得某一个数码管亮而其他几个是熄灭的。然后再传值,传入的值是将速度除以 10 之后的十位数字或者是各位数字,采用 div 指令实现。然后我们通过改变延时时长与 call 子程序的次数,改变每个灯亮的间隔,让肉眼感觉多个数码管同时在改变数字。

  代码部分

IOY0         EQU   0600H          ;片选IOY0对应的端口始地址
MY8255_A     EQU    IOY0+00H*2     ;8255的A口地址
MY8255_B     EQU   IOY0+01H*2     ;8255的B口地址
MY8255_C     EQU   IOY0+02H*2     ;8255的C口地址
MY8255_MODE  EQU   IOY0+03H*2     ;8255的控制寄存器地址
SSTACK    SEGMENT STACKDW 32 DUP(?)
SSTACK    ENDS
DATA SEGMENTNUMS DB 3FH,06H,5BH,4FH,66h,6dh,7dh,07h,7fh,6fh,79H  ;
    ;SELECT_OUTSMG1  DB  0H, 0FEH, 0FDH, 0FBH, 0F7H
    DATA ENDS
CODE    SEGMENTASSUME CS:CODE,SS:SSTACK
START:    MOV AX,DATAMOV DS,AXMOV AX,SSTACKMOV SS,AXMOV DX, MY8255_MODEMOV AL, 82H    ;1000 0001 表示A口C口高四位低四位输出,B口为输入OUT DX, AL    ;控制字送控制寄存器MOV BX, 0    ;清零CTRL:        MOV DX , MY8255_BIN AL, DX    ;C口值送AL,进行输入MOV AH,0    ;AX的高8位清零TEST AL,1H    ;AL是否等于1,进行and操作,影响标志位JNZ T1           ;若AL为XXXX XXX1,跳T1MOV  CX ,00      ;CX送0JMP A1T1:        TEST AL, 2HJNZ T2           ;若AL为XXXX XX1X,跳T2MOV CX,10        ;CX送10MOV DX , MY8255_Bmov AL,00010000B ;
    out DX, AL    ;将AL的值给C口JMP A1T2:        TEST AL, 4HJNZ T3           ;若AL为XXXX X1XX,跳T3MOV CX, 20        ;CX送20MOV DX , MY8255_Bmov AL, 00100000Bout DX, ALJMP A1T3:        TEST AL,8HJNZ T4           ;若AL为XXXX 1XXX,跳T4MOV CX,40MOV DX , MY8255_Bmov AL,01000000Bout DX, ALJMP A1T4:        MOV CX,60        ;CX送60MOV DX , MY8255_Bmov AL,10000000Bout DX, ALJMP A1A1:        CMP BX,CXJNZ AMD  ;ZF=0,跳AMDCMP BX,0JE CWT    ;ZF=1,跳CWTAMD:        CMP CX,BXJB ASD   ;CX小于BX,跳ASDCALL PRINT1  ;执行子程序,会返回JMP CTRL
ASD:CALL PRINT2JMP CTRLCWT:        CALL PRIJMP CTRL    PRINT1 PROC;因为每次只能亮1个的原因,所以要call多次实现肉眼错觉CALL PRICALL PRICALL PRICALL PRICALL PRICALL PRICALL PRICALL PRICALL PRICALL PRICALL PRI;CALL PRI;CALL PRI;CALL PRIINC  BXCMP BX,CXJB  PRINT1MOV BX,CXRET
PRINT1 ENDPPRINT2 PROCCALL PRICALL PRICALL PRICALL PRICALL PRICALL PRICALL PRICALL PRICALL PRICALL PRICALL PRI;CALL PRI;CALL PRI;CALL PRIDEC  BXCMP CX,BXJB  PRINT2MOV BX,CXRET
PRINT2 ENDPPRI PROC    PUSH CXPUSH DXPUSH AXPUSH BX;速度高位MOV AX,BXMOV CL,10DIV CL        ;  AH 余数  AL  商  36 / 10 = 3 ..... 6  MOV CX,0MOV CX,14 ;0000 1110b,就是设置第一个数码管亮MOV BL,AL   ; 3   CALL HUACALL YANSHI;速度低位    MOV BL,AHMOV CX,13 ;0000 1101b,就是设置第二数码管亮CALL HUACALL YANSHI;档位MOV BL, ALMOV CX,7 ;0000 0111b,就是设置第4个亮CALL HUACALL YANSHIPOP BXPOP AXPOP DXPOP CXRET
PRI ENDPHUA PROCPUSH BXPUSH AX;控制第XXX灯亮MOV DX, MY8255_CMOV AX,CXOUT DX,AX   ;B口输出CX;输出值到数码管MOV BH,0MOV DX,MY8255_AMOV SI,OFFSET NUMSMOV AX,[SI+BX]OUT DX,AX   ;A口输出BX,也就是NUMS[BX]POP AXPOP BXRET
HUA ENDP    YANSHI PROCPUSH CXMOV CX,2000
YS:CALL YANSHI2DEC CXJNZ YS
POP CXRET
YANSHI ENDPYANSHI2 PROCPUSH CXMOV CX,1
TYUY:DEC CXJNZ TYUYPOP CXRET
YANSHI2 ENDP
CODE    ENDS
END START

  实验台接法

    注意实验台部分 B C 口对调,C 口低四位输入控制开关 ,所以代码需要将状态控制字改成 81 H 并且将下面的 MY8255_C 和 MY8255_B 对调

    

  实验台效果展示

    拨动 K1 K2,汽车速度为 20 km/h,档位为 2 挡

    

  

  电路布线图

    四位一体数码管的引脚可能会不一样,另外推荐做一个镜像图,焊板子背面的时候方便

    

  

  洞洞板实物图

    需要注意的是老师不让用飞线,而我嫌背面太丑用了两个飞线焊到了洞洞板的正面,所以得去掉这两个飞线,换成背面的导线

    

    飞线版本的洞洞板(老师不让用)

    

      

    

    无飞线版本

    

    

    

感悟


  因为自己大一是电路相关专业的,有学过 C51 和 STM32 ,以及大二自己看了一点王爽的汇编,所以这次实验总体难度不大,但是周围的同学普遍对硬件有排斥的心理,而幸运的是我的队友们比较好,原意去学一下这次实验的东西。发现软工学生硬件真是一个硬伤,硬件课程少,没焊过甚至没见过电路板,感觉有点可惜

转载于:https://www.cnblogs.com/Bw98blogs/p/10209491.html

微机原理课设 汽车速度控制相关推荐

  1. 微机原理实验8254计算机钢琴,GitHub - SincereXIA/PianoMFC: 西电微机原理课设项目,键盘电子乐器演奏程序设计(电子琴),MFC...

    PianoMFC 西电微机原理课设项目,键盘电子乐器演奏程序设计(电子琴),MFC 需要连接西电微机原理实验室提供的 QTH9054 微机试验箱,使用其蜂鸣器发声,若不连接,程序会直接播放 mp3 文 ...

  2. 计算机微机原理心得体会,微机原理课设体会心得体会

    微机原理课程设计心得体会 实得这学期通过对微机原理和微机实验学习,对微机系统和它的工作原理有了的了解. 微机实验课,总共做了十几个实验,回想起来受益匪浅,主要是加深了对计算机的一些硬件情况和运行原理的 ...

  3. 微型计算机原理兰州大学出版社,10软件微机原理课设任务书.doc

    附件三: 兰州工业高等专科学校 微机原理及应用课程设计任务书 软件 系 10 级 软件.网络10 专业 课程设计任务书 组网实习题目电子表.交通灯控制指导教师职 称工作单位及部门联系方式曹建文软件工程 ...

  4. 微机接口课设 汽车控制系统 C语言源代码 Proteus 8086

    前言:经过这次微机接口课程设计之后,更加深入理解了:总线.IO端口地址译码.可编程接口芯片.和外设四者之间的关系.自己亲自连接的线路.自己写的C语言代码,想想编程调试代码时候的遇到的困难,令人回味无穷 ...

  5. 数电课设汽车尾灯控制电路

    1.设计任务与指标 假设汽车尾部左右两侧各有3个指示灯(用发光二极管模拟),设计并制作一个汽车尾 灯控制电路,要求如下. (1)汽车正常运行时指示灯全部熄灭. (2)右转弯时,右侧3个指示灯按右循环顺 ...

  6. 微型计算机原理课设抢答器,微机原理课程设计抢答器.doc

    西安郵電大学 硬件课程设计报告 题 目: 抢 答 器 院系名称:计算机学院 专业名称:班 级: 学生姓名:学号(8位):指导教师:设计起止时间 设计目的 用逻辑开关模拟竞赛抢答器按钮(共8个开关:K0 ...

  7. 计算机原理课设,计算机组成原理课设文档

    计算机组成原理课设文档 (29页) 本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦! 19.90 积分 第 1 页第 1 页一.一.课设题目:课设题目:设计一台嵌 ...

  8. 编译原理课设---表驱动LL(1)语法分析器的设计

    前言:表驱动LL(1)语法分析程序是本人在大三上学期的<编译原理>这门课程的课程设计选做题目,在这次的课程设计中,主要实现判断给定文法是否为LL(1)文法,若是,则给出其预测分析表及对给定 ...

  9. 数据库课设——汽车信息租赁管理系统

    目录 课程设计目的   时间及任务安排 基本要求      系统实现     功能需求     系统分析与设计 数据库设计    运行结果截图   开发环境        个人总结        此处 ...

最新文章

  1. NETGEAR拒绝连接请求_3分钟理解HTTP的请求与响应
  2. 47.2. 配置 Tomcat 服务器
  3. 数据库水平切分的实现原理解析---分库,分表,主从,集群,负载均衡器
  4. laravel5 centos6.4下的配置体验
  5. js当中null和{}区别
  6. 代理网络中安装tomcat的注意事项
  7. 游戏筑基开发之利用文件函数取出配置文件(ini文件)的数据实体(C语言)
  8. Spring Data REST PATCH请求远程代码执行漏洞(CVE-2017-8046) 本地复现方法
  9. C/C++和MFC的批处理特定文件
  10. android6.0 goldfish内核,ubuntu16.04下编译android-goldfish-3.4内核源码(android6.0.1系统源代码)...
  11. SQL 建表与索引
  12. 链路状态路由协议-OSPF
  13. js室内地图开发_支付宝小程序室内地图导航开发-支付宝小程序JS加载esmap地图...
  14. jsf服务_JSF ManagedBean ManagedProperty
  15. 百度云SMS发短信接口 PHP版本SDK TP5.0
  16. 【CTF】记录一次CTF比赛的Writeup(附题目下载地址)
  17. 「硬见小百科」15个有趣的555电路
  18. matlab SOR统计滤波
  19. RabbitMQ消费端报:delivery acknowledgement on channel 5 timed out. Timeout value used: 1800000 ms. This t
  20. 中控屏成智能家居新宠?

热门文章

  1. 【BDTC2016】D-uni FounderCEO查理:数据敏捷性,数据时代的云架构
  2. 通向 UNIX 天堂的 10 个阶梯
  3. 不到20元成本 自己做一个小程序 远程开关 远程通断器
  4. android vold 挂载读写,【转】 android vold浅析(1)
  5. DeepDB:Learn From Data,not from Queries 解读
  6. 蓝牙耳机哪一款好用?学生党开学最值得入手的真无线蓝牙耳机
  7. 4000万股民已成为金融买办要挟中央的人质
  8. java visitor_Java设计模式(三) Visitor(访问者)模式及多分派场景应用
  9. 计算机网络协议第二章,链路层协议
  10. Keras - GPU ID 和显存占用设定