找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4918|回复: 3
收起左侧

单片机与protues控制交通灯 汇编语言程序和仿真

[复制链接]
ID:166903 发表于 2017-2-28 20:34 | 显示全部楼层 |阅读模式
简易的使用PROTUES软件与单片机汇编语言控制交通灯的实验
0.png

汇编语言单片机程序:
  1. ORG   0000H
  2. AJMP  MAIN
  3. ORG   000BH        //T0中断入口地址
  4. LJMP  INT_T0
  5. ORG   0030H
  6. RRR   EQU  0F6H         ;红红都亮
  7. GR   EQU  0DEH   ;东西绿灯亮,南北红灯亮
  8. YR   EQU  0EEH   ;东西黄灯亮,南北红灯亮
  9. RG   EQU  0F3H   ;东西红灯亮,南北绿灯亮
  10. RY   EQU  0F5H   ;东西红灯亮,南北黄灯亮
  11. EW_TIME EQU R0         ;东西方向时间
  12. SN_TIME EQU R1         ;南北方向时间

  13. MAIN:        //I/0口,寄存器初始化
  14.     MOV P1,#RRR
  15.         MOV P3,#0FFH
  16.         LCALL DELAY_1S       
  17.         MOV R2,#20        //定时计数器T0定时50ms,循环20次获得一秒定时
  18.         MOV 50H,#20          //红灯时间
  19.         MOV 51H,#16          //绿灯时间
  20. /*************T0初始化**************/        
  21.         MOV        TMOD,#11H        //定时计数器T0,模式1,16位
  22.         MOV        TH0,#3CH        //50ms定时初值
  23.         MOV        TL0,#0B0H
  24.         SETB        EA        //开总中断
  25.         SETB        ET0        //开T0中断
  26.         SETB        TR0        //T0启动
  27.    
  28.        
  29. /**********************************
  30. 状态1:
  31. 东西绿灯亮16s
  32. 南北红灯亮20s
  33. **********************************/
  34. START:        MOV P1 , #GR
  35.         MOV EW_TIME,50H                //东西方向倒计时初值15
  36.         MOV SN_TIME,51H                //南北方向倒计时初值12
  37. D0:        LCALL  DISPLAY            //调用显示子程序
  38.         CJNE   SN_TIME,#00H,D0

  39. /**********************************
  40. 状态2:
  41. 东西黄灯闪烁4S
  42. 南北还是红灯
  43. **********************************/
  44. MOV A,50H
  45. SUBB A,51H
  46. MOV  SN_TIME,A        //黄灯倒计时初值4
  47. MOV P1 , #YR
  48. D1:LCALL        DISPLAY
  49. CJNE        SN_TIME,#03H,D1
  50. SETB P1.4                    //闪烁
  51. D2:LCALL        DISPLAY
  52. CJNE        SN_TIME,#02H,D2
  53. CLR P1.4
  54. D3:LCALL        DISPLAY
  55. CJNE        SN_TIME,#01H,D3
  56. SETB P1.4
  57. D4:LCALL        DISPLAY
  58. CJNE        SN_TIME,#00H,D4
  59. /**********************************
  60. 状态3:
  61. 南北绿灯亮12s
  62. 东西红灯亮15s
  63. **********************************/  
  64. MOV P1 , #RG            
  65. MOV  SN_TIME,50H
  66. MOV  EW_TIME,51H
  67. D5:LCALL   DISPLAY        
  68. CJNE  EW_TIME,#00H,D5
  69. /**********************************
  70. 状态4:
  71. 东西持续红灯
  72. 南北黄灯亮3s
  73. **********************************/  
  74. MOV P1 , #RY      
  75. MOV A,50H
  76. SUBB A,51H
  77. MOV  EW_TIME,A        //东西绿灯灭,黄灯倒计时初值3s
  78. MOV  P1,#RY
  79. D6:LCALL        DISPLAY
  80. CJNE        SN_TIME,#03H,D6
  81. SETB P1.1                    //闪烁
  82. D7:LCALL        DISPLAY
  83. CJNE        SN_TIME,#02H,D7
  84. CLR P1.1
  85. D8:LCALL        DISPLAY
  86. CJNE        SN_TIME,#01H,D8
  87. SETB P1.1
  88. D9:LCALL        DISPLAY
  89. CJNE        SN_TIME,#00H,D9
  90. /**********************************/
  91.      
  92. LJMP        START       //返回初始状态


  93. //********显示子程序*******//
  94. DISPLAY:MOV DPTR,#TABLE
  95.         MOV A,EW_TIME
  96.         MOV B,#10
  97.         DIV AB
  98.         MOVC A,@A+DPTR
  99.         MOV P3,#0FFH
  100.         MOV P2,A
  101.         MOV P3,#0FEH
  102.         LCALL        DELAY_5MS
  103.         MOV A,B
  104.         MOVC A,@A+DPTR
  105.         MOV P3,#0FFH
  106.         MOV P2,A
  107.         MOV P3,#0FDH
  108.         LCALL        DELAY_5MS
  109.         MOV A,SN_TIME
  110.         MOV B,#10
  111.         DIV AB
  112.         MOVC A,@A+DPTR
  113.         MOV P3,#0FFH
  114.         MOV P2,A
  115.         MOV P3,#0FBH
  116.         LCALL        DELAY_5MS
  117.         MOV A,B
  118.         MOVC A,@A+DPTR
  119.         MOV P3,#0FFH
  120.         MOV P2,A
  121.         MOV P3,#0F7H
  122.         LCALL        DELAY_5MS
  123.         RET


  124. //******T0中断子程序*******//
  125. INT_T0: DJNZ  R2,NT0        //计数寄存器不为0则跳转,T0重新赋初值
  126.         MOV   R2,#20       //计数器重新赋值
  127.         DEC   EW_TIME            //南北方向倒计时数值减1
  128.         DEC   SN_TIME           //东西方向倒计时数值减1
  129. NT0:    MOV  TH0,#3CH          //T0赋50ms初值
  130.         MOV  TL0,#0B0H
  131.         SETB TR0             //启动T0
  132.         RETI        


  133. TABLE:DB 3FH ,06H, 5BH ,4FH ,66H ,6DH ,7DH ,07H ,7FH ,6FH  //段码

  134. DELAY_5MS:MOV   TMOD,#11H        //定时计数器T1,模式1,16位
  135.         MOV   TH1,#0F8H;#0D8H;      //5ms定时初值
  136.         MOV   TL1,#2FH;#0F0H;
  137.         SETB  TR1        //T1启动       
  138. DD1:        JBC TF1 ,TRE
  139.         AJMP DD1
  140. TRE:        RET

  141. DELAY_1S:MOV R3 , #250
  142. DD2:        LCALL DELAY_5MS
  143.         DJNZ R3 ,DD2
  144.         RET

  145. END        
复制代码
0.png

新建文件夹.zip

55.64 KB, 下载次数: 53, 下载积分: 黑币 -5

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:272704 发表于 2018-1-7 20:36 | 显示全部楼层
这里面能加一个紧急处理装置吗?加个按键全变红灯
回复

使用道具 举报

ID:288294 发表于 2018-3-7 09:57 | 显示全部楼层
计时太慢了 怎么改比较好
回复

使用道具 举报

ID:288294 发表于 2018-3-7 18:32 | 显示全部楼层
徐叨叨 发表于 2018-3-7 09:57
计时太慢了 怎么改比较好

我解决啦 改了计时初值和循环次数
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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