找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3211|回复: 0
打印 上一主题 下一主题
收起左侧

汽车传感器控制仪程序代码

[复制链接]
跳转到指定楼层
楼主
ID:76127 发表于 2015-4-16 03:03 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
  1. ;**************************************************
  2. ;平凡单片机工作室 作者:周坚
  3. ;(c) Copyright 2003 Pingfan's McuStudio
  4. ;All rights Reserved
  5. ;cntrl.asm
  6. ;实验:姬家寨电子科技实验室:姬学瑞
  7. ;功能描述:汽车传感器控制仪程序,具体内容请参考书
  8. ;**************************************************
  9. ;键盘缓冲区
  10. FIFO1    DATA    30H
  11. FIFO2    DATA    31H
  12. FIFO3    DATA    32H
  13. ;以下显示缓冲区
  14. DISP1    DATA    40H
  15. DISP2    DATA    41H
  16. DISP3    DATA    42H
  17. DISPCTRL   DATA    43H
  18. ;显示控制字
  19. DISP_CTRL  BIT     42H     ;显示控制字,如果为1显示,为0不显示
  20. ;键盘有键按下标志
  21. K_MARK BIT  41H
  22. ;控制字堆栈
  23. STAC     DATA    50H   
  24. ;由FIFO得到的控制字
  25. CTRL     DATA    33H
  26. ORG     0000H
  27. AJMP    START
  28. ORG     40H  
  29. START:
  30. MOV    SP,#5FH   ; 设置堆栈
  31. MOV   P1,#0FFH   
  32. MOV   P2,#00H  
  33. MOV   P0,#0FFH
  34. SETB    DISP_CTRL   ;调用显示程序前设置该位,要求显示出来
  35. MOV    DISP3,#8
  36. MOV    DISP2,#8
  37. MOV    DISP1,#8
  38. ACALL  DISP   ;显示888
  39. ACALL  D1S        ;延时1S
  40. MOV    DISP3,#16   ;H字符的代码
  41. MOV    DISP2,#17   ;消隐代码
  42. MOV   DISP1,#17  
  43. ACALL  DISP   
  44. CLR     A
  45. MOV   DISPCTRL,A ;
  46. MOV   R0,#20H
  47. MOV   R7,#10H
  48. INIT:
  49. MOV   @R0,A
  50. INC     R0
  51. DJNZ   R7,INIT      ;清除20H到2FH单元的内容
  52. SETB   DISP_CTRL      
  53. MOV DISPCTRL,#10
  54. MOV FIFO1,#0
  55. MOV FIFO2,#0
  56. MOV FIFO3,#0
  57. MAIN:
  58. INC    DISPCTRL
  59. MOV   A,DISPCTRL
  60. JZ      RDISP
  61. AJMP   MKEY
  62. RDISP:
  63. MOV DISPCTRL,#10
  64. ACALL  DISP      ;如果计数到255次,则刷新一次显示
  65. MKEY:  
  66. ACALL  KEY           ;调用键盘处理程序
  67. JB      K_MARK,KEY_PROC   ;如果有键被按下,则转去键盘处理
  68. ;***************************以下将内存对应内容输出
  69. MOV   A,20H
  70. NOP
  71. MOV   20H,A     ;取出20H内容,再转入20H
  72. MOV    P0,A
  73. SETB    P2.3
  74. ACALL  DOUT           
  75. CLR     P2.3   ;延时形成下降沿脉冲
  76. ;*******************************
  77. MOV    A,21H
  78. NOP
  79. MOV   21H,A
  80. MOV    P0,A
  81. SETB    P2.4
  82. ACALL  DOUT
  83. CLR     P2.4
  84. ;*******************************
  85. MOV    A,22H
  86. NOP
  87. MOV    22H,A
  88. MOV    P0,A
  89. SETB    P2.5
  90. ACALL  DOUT
  91. CLR     P2.5
  92. ;*********************************
  93. MOV    A,23H
  94. NOP
  95. MOV    23H,A
  96. MOV P0,A
  97. SETB    P2.6
  98. ACALL  DOUT
  99. CLR    P2.6
  100. MOV   A,24H
  101. ;********************************
  102. MOV   A,24H
  103. NOP
  104. MOV    24H,A
  105. MOV P0,A
  106. SETB    P2.7
  107. ACALL  DOUT
  108. CLR     P2.7
  109. AJMP   MAIN
  110. ;用于输出的延时程序
  111. DOUT:
  112. PUSH PSW
  113. SETB RS1
  114. MOV R6,#3
  115. DJNZ R6,$
  116. POP  PSW
  117. RET
  118. ;*****************************键盘处理
  119. ;数字键直接进入键值FIFO
  120. ;功能键分别处理
  121. ;A:判断待显示的是否是合法的代码,是则接受,并根据代码作相应动作,显示闪烁
  122. ;一次,如果不是合法的代码,则不接受,并不闪烁
  123. ;合法的代码为: 001-032,使各相位置1,使各继电器吸合,断路
  124. ;              033-040,使相应位置1,串入电阻
  125. ;              101-132,使相应位清0,各继电器触点吸合
  126. ;注意:
  127. ;     033-040代码将相应的0-7位清0,以防止继电器触点断路.
  128. ;     101-108代码在除将相应的0-7位清0外,还要将32-39相应位清0,防止串入电阻
  129. ;B键:显示和消隐的切换开关
  130. ;C键:复位开关,按下此键,将所有位(00-40)全部清0,使所有继电器断电(即全部触点处
  131. ;于吸合状态).
  132. KEY_PROC:
  133. CLR  K_MARK  ;清除有键按下标志
  134. CLR    C         ;清进位位
  135. MOV    A,B       ;取键值
  136. CJNE   A,#10,KEY_NEXT1
  137. AJMP   FUN_PROC     ;如果键值等于10转功能键处理
  138. KEY_NEXT1:
  139. JC      DATA_PROC    ;如果小于10,则到数字键处理
  140. AJMP   FUN_PROC     ;如果键值大于10则转功能键处理      
  141. DATA_PROC:               ;数字键处理
  142. MOV   FIFO3,FIFO2
  143. MOV   FIFO2,FIFO1
  144. MOV   FIFO1,B      ;如果是数字键,则将数字进入FIFO
  145. MOV   DISP3,FIFO3
  146. MOV   DISP2,FIFO2
  147. MOV   DISP1,FIFO1
  148. ACALL  DISP          ;调用显示程序
  149. AJMP   MAIN          ;数字程序处理完毕,重新开始循环
  150. ;***************************以下各功能键处理部份
  151. A_PROC:                  ;A键处理
  152. MOV   A,FIFO3      ;取FIFO的首字节
  153. CLR    C
  154. CJNE    A,#2,A_1
  155. A_ERR:
  156. AJMP   MAIN        
  157. A_1:
  158. JC      A_2
  159. AJMP   MAIN        
  160. A_2:
  161. MOV   A,FIFO3     ;取首字节
  162. MOV   B,#100         
  163. MUL   AB
  164. MOV   R0,A           
  165. MOV   A,FIFO2   
  166. MOV   B,#10
  167. MUL   AB
  168. ADD   A,R0      
  169. ADD   A,FIFO1   
  170. MOV   R0,A      
  171. CJNE   A,#141,A_3
  172. AJMP   MAIN         
  173. A_3:
  174. JC      A_4
  175. AJMP   MAIN         
  176. A_4:
  177. MOV   A,R0         
  178. CJNE   A,#100,A_5     
  179. AJMP   MAIN         
  180. A_5:
  181. JC      A_6            
  182. AJMP   A_ACTION1   
  183. A_6:
  184. MOV   A,R0
  185. CJNE   A,#41,A_7
  186. AJMP   MAIN         
  187. A_7:
  188. JC      A_8           
  189. AJMP   MAIN        
  190. A_ACTION1:               
  191. DEC    R0           
  192. MOV   CTRL,R0     
  193. ACALL  CLR_OUT   
  194. CLR     DISP_CTRL
  195. ACALL  DISP         
  196. ACALL  D1S           
  197. SETB    DISP_CTRL      
  198. ACALL  DISP       ;开显示并闪烁一次
  199. AJMP   MAIN
  200. A_8:
  201. MOV    A,R0
  202. JNZ     A_ACTION2
  203. AJMP   MAIN
  204. A_ACTION2:               
  205. DEC    R0            
  206. MOV    CTRL,R0
  207. ACALL  SET_OUT      
  208. CLR     DISP_CTRL
  209. ACALL  DISP          ;关显示
  210. ACALL  D1S            
  211. SETB    DISP_CTRL
  212. ACALL  DISP    ;闪烁一次
  213. AJMP   MAIN
  214. FUN_PROC:                  
  215. MOV   A,B            
  216. SUBB  A,#10           
  217. JZ     A_PROC         
  218. DEC   A              
  219. JZ     B_PROC       ;B键处理
  220. DEC   A
  221. JZ     C_PROC         ;C 键处理
  222. DEC   A
  223. JZ     D_PROC        ;D键处理
  224. DEC   A
  225. JZ     E_PROC        ;E 键处理
  226. DEC   A
  227. JZ     F_PROC        ;F键处理
  228. KEY_ERR:                ;如果不是以上键(可能双键同时按下之类)
  229. NOP                   ;错误处理,在此直接返回即可。
  230. AJMP  MAIN
  231. B_PROC:
  232. CPL    DISP_CTRL     ;取反显示控制
  233. ACALL DISP
  234. LJMP    MAIN
  235. C_PROC:
  236. MOV    20H,#00H
  237. MOV    21H,#00H
  238. MOV   22H,#00H
  239. MOV   23H,#00H
  240. MOV   24H,#00H     ;C键是开关重置键,将所有位清零
  241. MOV   DISP3,#16     ;'H'
  242. MOV   DISP2,#17     ;消隐
  243. MOV   DISP1,#17     ;消隐
  244. ACALL  DISP
  245. LJMP    MAIN
  246. D_PROC:
  247. LJMP   MAIN
  248. E_PROC:
  249. LJMP   MAIN
  250. F_PROC:
  251. LJMP   MAIN     ;这四个键暂不使用
  252. ;**************************************置位
  253. SET_OUT:
  254. CLR    C
  255. MOV   A,CTRL    ;CTRL是要设置的位
  256. CJNE   A,#32,SET1
  257. AJMP   SETPROC     ;等于32要特殊处理
  258. SET1:
  259. JNC    SETPROC     ;大于32要特殊处理
  260. SET2:                     ;是1-32中的一个值
  261. MOV   A,CTRL
  262. ACALL  SETOUT1
  263. SETPROC:                ;如果大于等于32,则作两个动作:
  264. MOV    A,CTRL     ;1.将相应位置1,以串入电位器
  265. ACALL  SETOUT1     ;将相应的1-8位清0,以接通电路
  266. MOV    A,CTRL
  267. SUBB   A,#31
  268. ADD    A,#100
  269. ACALL  CLROUT1
  270. RET
  271. SETOUT1:
  272. MOV   B,#8       ;先将哪个字节要设置求出
  273. DIV     AB
  274. PUSH   PSW
  275. SETB   RS0      ;选第二工作区
  276. MOV    R0,#1FH   ;用R0作间址寻址
  277. INC    A
  278. MOV   R7,A
  279. LP:
  280. INC    R0
  281. DJNZ   R7,LP      ;确定是哪个字节
  282. ;**************************************
  283. MOV    A,B       ;将除得的结果送A(哪一位)
  284. JZ      LP3         ;如果是0,直接转,否则会有错
  285. MOV   A,@R0     ;取这个字节
  286. MOV    R7,#8       ;将这个字节循环右移8次
  287. MOV    R6,B        ;分两段,一段由R6控制,正好将该位移到ACC.0的位置
  288. LP1:
  289. DEC    R7          ;R7中减去R6已移的次数
  290. RR     A
  291. DJNZ   R6,LP1
  292. SETB   ACC.0       ;由R6控制的移动结束,该位处于ACC.0位置,置该位
  293. LP2:
  294. RR     A      
  295. DJNZ   R7,LP2      ;剩下来该移动的次数由R7中的值决定     
  296. AJMP   LP4
  297. LP3:                     ;这个是用来处理一种特殊情况,即某一字节的最低位
  298. MOV   A,@R0     ;此时B中是0,如果仍用上法处理,会出错,只要直接将
  299. SETB   ACC.0       ;该位置1即可
  300. LP4:
  301. MOV  @R0,A
  302. POP    PSW
  303. RET
  304. CLR_OUT:
  305. CLR    C
  306. MOV   A,CTRL     ;CTRL是要清的位
  307. CJNE   A,#107,CLR1
  308. AJMP   CLRPROC    ;等于107,转
  309. CLR1:
  310. JC      CLRPROC    ;小于107,转
  311. MOV    A,CTRL
  312. ACALL  CLROUT1
  313. CLRPROC:               ;如果输入的代码是101-108,则作如下2个动作:
  314. MOV    A,CTRL     ;1.将相应位清0,使继电器触点吸合
  315. ACALL  CLROUT1    ;2.将133-140相应位清0,使继电器触点吸合
  316. MOV    A,CTRL     ;防止串入电阻
  317. ADD    A,#32
  318. ACALL  CLROUT1   
  319. RET
  320. CLROUT1:
  321. CLR C
  322. SUBB   A,#100     ;先减去100 (因为该位为位数加上100构成)
  323. MOV    B,#8        ;先将要清零的字节求出     
  324. DIV     AB
  325. PUSH   PSW
  326. SETB    RS0         ;选第二工作区
  327. MOV    R0,#1FH     ;用R0作间址寻址
  328. INC     A
  329. MOV    R7,A
  330. CLP:
  331. INC     R0
  332. DJNZ    R7,CLP      ;确定是哪个字节
  333. ;**************************************
  334. MOV    A,B         ;将除得的结果送A(哪一位)
  335. JZ      CLP3         ;如果是0,直接转,否则会有错
  336. MOV    A,@R0      ;取这个字节
  337. MOV    R7,#8       ;将这个字节循环右移8次
  338. MOV    R6,B        ;分两段,一段由R6控制,正好将该位移到ACC.0的位置
  339. CLP1:
  340. DEC    R7          ;R7中减去R6已移的次数
  341. RR     A
  342. DJNZ   R6,CLP1
  343. CLR    ACC.0        ;由R6控制的移动结束,该位处于ACC.0位置,清该位
  344. CLP2:
  345. RR     A      
  346. DJNZ   R7,CLP2     ;剩下来该移动的次数由R7中的值决定     
  347. AJMP   CLP4
  348. CLP3:                     ;这个是用来处理一种特殊情况,即某一字节的最低位
  349. MOV    A,@R0      ;此时B中是0,如果仍用上法处理,会出错,只要直接将
  350. CLR     ACC.0       ;该位清0即可
  351. CLP4:
  352. MOV    @R0,A
  353. POP    PSW
  354. RET
  355. ;显示子程序
  356. DISP:
  357. PUSH   DPH
  358. PUSH   DPL
  359. MOV SCON,#00H   ;置串行口工作方式0
  360. JNB     DISP_CTRL,HIDDEN ;如果DISP_CTRL位为0,则消隐处理
  361. AJMP   DISP_NEXT  ;要求消隐,则消隐处理
  362. HIDDEN:
  363. MOV    A,#0FFH    ;消隐代码
  364. ACALL  DISP_LED
  365. ACALL  DISP_LED
  366. ACALL  DISP_LED    ;三次调用显示子程序,发出3位
  367. POP     DPL
  368. POP    DPH
  369. RET                  ;消隐处理完毕,直接返回
  370. DISP_NEXT:
  371. MOV    DPTR,#DISP_TAB
  372. MOV    A,DISP3      ;显示缓冲区的最高位
  373. MOVC  A,@A+DPTR
  374. LCALL  DISP_LED     ;显示最高位      
  375. MOV    A,DISP2
  376. MOVC  A,@A+DPTR
  377. LCALL  DISP_LED     ;显示中间位
  378. MOV    A,DISP1
  379. MOV    DPTR,#DISP_TAB
  380. MOVC   A,@A+DPTR
  381. LCALL   DISP_LED     ;显示低位
  382. POP     DPL
  383. POP     DPH
  384. RET
  385. ;以下显示子程序
  386. DISP_LED:
  387. MOV  SBUF,A
  388. DISP_L1:
  389. JNB    TI,DISP_L1    ;发送第一位
  390. CLR    TI
  391. RET
  392. DISP_TAB:
  393. DB     88H,   0BEH, 0C4H, 94H,  0B2H,  91H
  394. ;       0       1       2       3       4       5
  395. DB      81H,   0BCH, 80H,  090H,  0A0H, 83H
  396. ;       6       7       8       9       A       B
  397. DB      0C9H,  86H,   0C1H, 0E1H, 0A2H,  0FFH
  398. ;       C       D       E       F       H       消隐
  399. ;键盘程序
  400. ;返回的键值在B中
  401. KEY:
  402. CLR     K_MARK
  403. MOV    B,#0
  404. MOV    R0,#0
  405. MOV    R1,#0F7H
  406. MOV    R7,#4
  407. MOV    A,R1
  408. K_LOOP:
  409. MOV    P1,A  ;输出到P1口
  410. MOV    A,P1
  411. ORL    A,#0FH   ;高4位为1
  412. CPL    A        ;如果低4位也为1,取反后为0,无键按下
  413. JZ      K_NEXT
  414. AJMP   K_NEXT1
  415. K_NEXT:
  416. INC     R0
  417. MOV    A,R1
  418. RR      A
  419. MOV    R1,A
  420. DJNZ    R7,K_LOOP
  421. AJMP   NO_KEY
  422. K_NEXT1:
  423. JB      ACC.4,K_RET   ;0键被按下
  424. INC     B
  425. INC     B
  426. INC     B
  427. INC     B
  428. JB      ACC.5,K_RET  ;4键被按下
  429. INC     B
  430. INC     B
  431. INC     B
  432. INC     B
  433. JB      ACC.6,K_RET  ;8
  434. INC     B
  435. INC     B
  436. INC     B
  437. INC     B
  438. JB      ACC.7,K_RET
  439. K_ERR:
  440. AJMP   NO_KEY
  441. MOV    A,R1
  442. RR      A         ;右移(F7--FB)
  443. MOV    R1,A      ;回存
  444. INC     R0
  445. DJNZ    R7,K_LOOP
  446. K_RET:
  447. MOV    P1,#0F0H
  448. NOP
  449. MOV    A,P1
  450. ORL    A,#0FH
  451. CPL    A
  452. JNZ     K_RET    ;循环直到所有按键被释放
  453. SETB   K_MARK   ;置有键按下标志
  454. MOV   A,B
  455. ADD    A,R0
  456. MOV    B,A
  457. RET
  458. NO_KEY:
  459. RET
  460. ;1秒延时子程序
  461. D1S:
  462. PUSH   PSW
  463. SETB   RS1
  464. MOV    R7,#7FH
  465. DLP1:
  466. MOV    R6,#8FH
  467. DLP2:
  468. MOV    R5,#3
  469. DJNZ    R5,$
  470. DJNZ    R6,DLP2
  471. DJNZ   R7,DLP1
  472. POP    PSW
  473. RET
  474. ;10毫秒延时子程序
  475. D10MS:
  476. PUSH   PSW
  477. MOV   R7,#20
  478. D1:   
  479. MOV   R6,#250
  480. DJNZ   R6,$
  481. DJNZ    R7,D1
  482. POP    PSW
  483. RET
  484. END
复制代码


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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