找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1783|回复: 1
收起左侧

我的单片机步进电机课程设计 含汇编源码及注释

[复制链接]
ID:394934 发表于 2018-9-7 12:34 | 显示全部楼层 |阅读模式
单片机步进电机课程设计
可实现调速以及正反转等功能
  1. IOY0  EQU  3000H  ;片选IOY0 对应的端口始地址
  2. MY8255_A  EQU  IOY0+00H*4  ;8255 的 A 口地址,输出,键盘列选
  3. MY8255_B  EQU  IOY0+01H*4  ;8255 的 B 口地址,输出,数码管编码
  4. MY8255_C  EQU  IOY0+02H*4  ;8255 的 C 口地址,低四位,读键盘行号,高四位输出,控制步进电机
  5. MY8255_MODE  EQU  IOY0+03H*4  ;8255的控制寄存器地址

  6. STACK1 SEGMENT STACK  ;定义一个栈区
  7.        DW 256 DUP(?)  ;开辟出256个字单元空间
  8. STACK1 ENDS

  9. DATA  SEGMENT
  10. DTABLE1   DB  6DH,79H,73H,77H,39H,06H,5BH,4FH,66H,80H  ;这十个分别表示的数码管显示是 5,E,P,A,C,1,2,3,4,.
  11. DTABLE3   DB  10H,30H,20H,60H,40H,0C0H,80H,90H  ;歩进电机正向转速表
  12. DATA  ENDS

  13. CODE  SEGMENT
  14.       ASSUME CS:CODE,DS:DATA

  15. START: MOV AX,DATA
  16.        MOV DS,AX
  17.        MOV SI,3000H;建立缓冲区,存放要显示的键值
  18. ;[SI][SI+2][SI+4][SI+6]中分别存放四个数码管应显示的编码在DTABLE1中对应的位置
  19.        MOV BYTE PTR [SI],00H;内容s
  20.        MOV BYTE PTR [SI+2],09H;内容.
  21.        MOV BYTE PTR [SI+4],04H;内容c
  22.        MOV BYTE PTR [SI+6],05H;内容1
  23.        MOV BYTE PTR [SI+8],01H;内容E
  24.        MOV DX,MY8255_MODE;初始化8255工作方式
  25.        MOV AL,81H;方式0,A输出(数码管片选)、B口输出(数码管)、C口低四位输入(按键),高四位输出(步进电机)
  26.        OUT DX,AL
  27. KAISHI:
  28. MOV SI,3000H
  29. MOV DH,[SI+8]
  30. CMP DH,08H
  31. JA ZHI1;高于跳转
  32. CMP DH,01H
  33. JB ZHI8;不高于跳转
  34. JMP JIXU

  35. ZHI1:  MOV BYTE PTR[SI+8],01H
  36.        JMP JIXU
  37. ZHI8:  MOV BYTE PTR[SI+8],08H

  38. JIXU:   CALL KEYSCAN
  39.         MOV AH ,1;判断是否有按键按下
  40.         INT 16H ;键盘服务
  41.         JZ  SFRUN;等于0,读入字符,则跳转
  42.         
  43. QUIT:  MOV  AX,4C00H
  44.        INT 21H
  45.       
  46. SFRUN:
  47. MOV SI,3000H
  48. MOV DH,[SI]
  49. CMP DH,01H
  50. JNZ JIXU;为0则跳转
  51. MOV DH,[SI+4]
  52. CMP DH,04H
  53. JNZ ZIJIAN;不为4则跳转
  54. INC BYTE PTR[SI+8]  ;地址si+8处的字节变量加1
  55. JMP RUN

  56. KAISHI1:  JMP KAISHI

  57. ZIJIAN :
  58. DEC BYTE PTR[SI+8]

  59. RUN:
  60. MOV AL,[SI+8]
  61. MOV BX,OFFSET DTABLE3
  62. AND AX,00FFH
  63. ADD BX,AX
  64. DEC BX
  65. MOV AL,[BX]
  66. MOV DX,MY8255_C
  67. OUT DX,AL
  68. DANG1:  MOV DH,[SI+6]
  69.         CMP DH,05H  ;1
  70.         JNZ DANG2
  71.         PUSH CX;cx的值压入堆栈保存
  72.         MOV CX,10H;循环10次
  73. DA1:  CALL DALLY1  ;1档速度
  74.       CALL DALLY
  75.       CALL DALLY1
  76.       CALL DALLY1
  77.       CALL DALLY1
  78.       CALL KEYSCAN
  79.       JMP KAISHI
  80.       
  81. DANG2:  CMP DH,06H;2
  82.         JNZ DANG3


  83. DA2:  CALL DALLY1  ;2档速度
  84.       CALL DALLY1
  85.       CALL DALLY1
  86.       JMP KAISHI

  87. DANG3:  CMP DH,07H;3
  88.         JNZ DANG4
  89.         
  90.         
  91. DA3:  CALL DALLY1  ;3档速度
  92.       CALL DALLY1
  93.       JMP KAISHI

  94. DANG4:  CMP DH,08H;4
  95.         JNZ KAISHI1
  96. DA4:  CALL DALLY1  ;4档速度
  97.       CALL KEYSCAN
  98.       JMP KAISHI
  99.       


  100. DALLY1 PROC NEAR ;软件延迟子程序
  101. PUSH CX
  102. PUSH AX
  103. MOV CX,00AFH
  104. D11:MOV AX,1000H         
  105. D22:  DEC AX
  106.       JNZ D22
  107.       PUSH CX;进栈
  108.       PUSH AX;进栈
  109.       CALL KEYSCAN
  110.       POP AX;出栈
  111.       POP CX;出栈
  112.       LOOP D11
  113.       POP AX;出栈
  114.       POP CX;出栈
  115.       RET;返回      
  116. DALLY1 ENDP

  117. KEYSCAN PROC NEAR;键盘扫描子程序
  118. BEGIN:
  119. CALL DIS;刷新
  120. CALL CLEAR;清屏
  121. CALL CCSCAN;扫描按键
  122. JNZ GETKEY1;有键按下则跳置 GETKEY1
  123. JMP GOBACK1

  124. GETKEY1:  CALL DIS;显示刷新
  125.           CALL DALLY
  126.           CALL DALLY
  127.           CALL CLEAR;清屏
  128.           CALL CCSCAN;再次扫描按键
  129.           JNZ GETKEY2;有键按下则跳置 GETKEY2
  130.           JMP BEGIN;否则跳回开始继续循环
  131.          
  132. GETKEY2:  MOV CH,0FEH;设置当前检测的是第几列
  133.           MOV CL,00H
  134.          

  135.          
  136. COLUM:   MOV AL,CH;选取一列,将x1~x4中一个置0
  137.          MOV DX,MY8255_A
  138.          OUT DX,AL
  139.          MOV DX,MY8255_C;读y1~y4,用于判断是哪一行按键闭合
  140.          IN AL,DX
  141. L1:  TEST AL,01H;是否为第 1 行
  142.      JNZ L2;不是则继续判断
  143.      MOV AL,00H;设置第 1 行第 1 列的对应的键值
  144.      JMP KCODE
  145. BEGIN1: JMP BEGIN
  146. L2:  TEST AL,02H;是否为第 2 行
  147.      JNZ L3;不是则继续判断
  148.      MOV AL,04H;设置第 2 行第 1 列的对应的键值
  149.      JMP KCODE
  150.      
  151. L3:  TEST AL,04H;是否为第 3 行
  152.      JNZ L4;不是则继续判断
  153.      MOV AL,08H;设置第 3 行第 1 列的对应的键值
  154.      JMP KCODE
  155.      
  156. L4:  TEST AL,08H;是否为第 4 行
  157.      JNZ NEXT;不是则继续判断
  158.      MOV AL,0CH;设置第 4 行第 1 列的对应的键值
  159.      
  160. KCODE:  ADD AL,CL;将第一列的值加上当前列数,等于按键值
  161.         CALL PUTBUF;保存按键值
  162.         PUSH AX
  163.         
  164. KON:;显示刷新
  165. CALL DIS;等待按键弹起
  166. CALL CLEAR;清屏
  167. CALL CCSCAN;扫描按键,判断按键是否弹起
  168. JNZ KON;未弹起则继续循环等待弹起
  169. POP AX
  170. NEXT:
  171. INC CL;当前检测的列数递增
  172. MOV AL,CH
  173. TEST AL,08H;检测是否扫描到第 4 列
  174. JZ BEGIN1;是则跳回到开始处
  175. ROL AL,1;没检测到第 4 列则准备检测下一列
  176. MOV CH,AL
  177. JMP COLUM
  178. GOBACK1:  RET
  179. KEYSCAN ENDP
  180.          
  181. CCSCAN PROC NEAR;扫描是否有按键闭合子程序
  182. MOV AL,00H
  183. MOV DX,MY8255_A;将 4 列全选通,X1~X4 置 0
  184. OUT DX,AL
  185. MOV DX,MY8255_C
  186. IN AL,DX;读 Y1~Y4
  187. NOT AL
  188. AND AL,0FH;取出 Y1~Y4 的反值
  189. RET
  190. CCSCAN ENDP
  191. CLEAR PROC NEAR ;清除数码管显示子程序
  192. MOV DX,MY8255_B ;段位置0即可清除数码管显示
  193. MOV AL,00H
  194. OUT DX,AL
  195. RET
  196. CLEAR ENDP
  197. DIS PROC NEAR ;显示键值子程序
  198. PUSH AX ;AX入栈
  199. PUSH SI ;SI入栈,堆栈里保存了AX的0700,SI的3000
  200. MOV SI,3006H ;此处为3006H是先显示的第四个管,下面SI DEC两次即显示第三个数码管
  201. MOV DL,0F7H
  202. MOV AL,DL ;AL 0F7H
  203. AGAIN:
  204. PUSH DX ;DX入栈,堆栈里第一次是保存了DX的C4F7
  205. MOV DX,MY8255_A
  206. OUT DX,AL ;0F7H输出到A口,设置x1~x4,选通一个数码管
  207. MOV AL,[SI] ;SI指向一个缓冲区,取出缓冲区中存放键值在DTABLE1中的偏移量(05H)
  208. MOV BX,OFFSET DTABLE1 ;DTABLE1的偏移地址移入BX
  209. AND AX,00FFH ;AX与00FFH"按位与",和0相与清除,和1相与保留,保留了后8位
  210. ADD BX,AX ;DTABLE1的偏移地址加上键值的偏移量,即要输出的数的地址
  211. MOV AL,[BX]
  212. MOV DX,MY8255_B
  213. OUT DX,AL ;写入数码管A~Dp
  214. CALL DALLY ;过程嵌套,调用DALLY1过程
  215. DEC SI
  216. DEC SI ;取下一个键值
  217. POP DX ;DX出栈
  218. MOV AL,DL ;DL中存放是否显示完的标志
  219. TEST AL,01H ;判断是否显示完?
  220. JZ OUT1 ;显示完,返回
  221. ROR AL,1 ;AL循环右移一位
  222. MOV DL,AL ;存放DL,相当于DL循环右移一位
  223. JMP AGAIN ;未显示完,调回继续

  224. OUT1:  POP SI ;SI出栈
  225.        POP AX ;AX出栈
  226.        RET
  227.        DIS ENDP

  228. PUTBUF PROC NEAR ;保存子键子程序
  229. MOV SI,3000H
  230. CMP AL,00H
  231. JNZ MODE
  232. DIR:
  233. CMP BYTE PTR[SI+4],03H
  234. JZ DIR1
  235. MOV BYTE PTR[SI+4],03H
  236. JMP LAST
  237. DIR1:
  238. MOV BYTE PTR[SI+4],04H
  239. JMP LAST
  240. MODE:
  241. CMP AL,01H
  242. JNZ STOP
  243. CMP BYTE PTR[SI],01H
  244. JZ MODE1
  245. MOV BYTE PTR[SI],01H
  246. JMP LAST
  247. MODE1:
  248. MOV BYTE PTR[SI],02H
  249. JMP LAST
  250. STOP:
  251. CMP AL,02H
  252. JNZ GRD1
  253. MOV BYTE PTR[SI],00H
  254. MOV BYTE PTR[SI+4],04H
  255. MOV BYTE PTR[SI+6],05H
  256. GRD1:
  257. CMP AL,04H
  258. JNZ GRD2
  259. MOV BYTE PTR[SI+6],05H
  260. GRD2:
  261. CMP AL,05H
  262. JNZ GRD3
  263. MOV BYTE PTR[SI+6],06H
  264. GRD3:
  265. CMP AL,06H
  266. JNZ GRD4
  267. MOV BYTE PTR[SI+6],07H
  268. GRD4:
  269. CMP AL,07H
  270. JNZ LAST
  271. MOV BYTE PTR[SI+6],08H
  272. LAST:
  273. CALL DIS
  274. CALL CLEAR
  275. CALL CCSCAN
  276. GOBACK:
  277. RET
  278. PUTBUF ENDP

  279. DALLY PROC NEAR ;软件延迟子程序
  280.       PUSH CX
  281.       MOV CX,00FFH
  282. D1:
  283. MOV AX,00FFH
  284. D2:
  285. DEC AX
  286. JNZ D2
  287. LOOP D1
  288. POP CX
  289. RET
  290. DALLY ENDP
  291. CODE ENDS
  292.      END START
复制代码


新建 Microsoft Word 文档.doc

51 KB, 下载次数: 10, 下载积分: 黑币 -5

回复

使用道具 举报

ID:1 发表于 2018-9-7 16:53 | 显示全部楼层
补全原理图或者详细说明一下电路连接即可获得100+黑币
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表