论坛风格切换切换到宽版
  • 2243阅读
  • 4回复

最近这里有点冷清啊! [复制链接]

上一主题 下一主题
离线oxalis
 
发帖
958
只看楼主 倒序阅读 0楼 发表于: 2004-06-26
如题。。。。。。。。
大家多来讨论啊!
离线oxalis
发帖
958
只看该作者 1楼 发表于: 2004-06-26
转贴-交通灯实验
贴个51交通灯实验。从电子世界论坛来的。
离线oxalis
发帖
958
只看该作者 2楼 发表于: 2004-06-26
相关程序
;程序功能:如题
;采用定时中断方式
;单片机平常处于“睡眠”(省电)状态
;单片机型号:89c51
;晶振频率:12mhz
m_time30     equ   7fh         ;倒计时单元
m_time1       equ   7fh-1       ;1s计时单元

ledx_r       bit   p1.5
ledx_y       bit   p1.4
ledx_g       bit   p1.3
ledy_r       bit   p1.2
ledy_y       bit   p1.1
ledy_g       bit   p1.0

          org   0           ;复位入口,所有灯均为“灭”
          sjmp   main         ;转至main

          org   0bh         ;定时器0中断入口
          ljmp   timer0       ;转至timer0

          org   30h
main:       mov   tmod,#1       ;设定时器0工作方式1:16位计时器方式
          mov   th0,#3ch     ;置50ms定时器定时初值
          mov   tl0,#0b0h     ;置50ms定时器定时初值
          mov   r0,#10       ;r0做定时累计单元,10*50ms=0.5s
          setb   et0         ;允许定时器0中断
          setb   ea         ;总中断允许

          mov   m_time1,#20   ;1s计时单元置初值:20*50ms=1s
          mov   m_time30,#30h   ;倒计时单元置初值:30秒
          lcall   dsp_time     ;调用倒计时显示输出子程序

          clr   ledx_g       ;“亮”x向绿灯
          clr   ledy_r       ;“亮”y向红灯

          setb   tr0         ;启动定时器0

sleep_loop:   orl   pcon,#1       ;进入省电方式
          sjmp   sleep_loop     ;转至sleep_loop重新进入省电方式

timer0:       orl   tl0,#0b0h     ;重置50ms定时器定时初值
          mov   th0,#3ch     ;重置50ms定时器定时初值

          djnz   m_time1,timer0_1;1s计时单元减1不为零转至timer0_1返回中断
          mov   m_time1,#20   ;1s计时单元减1为零重置初值

          mov   a,m_time30     ;倒计时单元减1
          add   a,#99h
          da     a
          mov   m_time30,a

          jnz   timer0_2     ;倒计时单元不为零转至timer0_2

                          ;倒计时单元等于零时的处理程序
          setb   ledx_y       ;“灭”黄灯
          setb   ledy_y       ;“灭”黄灯
          mov   c,ledx_g     ;以当前x方向绿灯状态作为参考
          mov   ledx_r,c     ;改变x向红灯
          mov   ledy_g,c     ;改变y向绿灯
          cpl   c
          mov   ledx_g,c     ;改变x向绿灯
          mov   ledy_r,c     ;改变y向红灯

          mov   m_time30,#30h   ;重置倒计时单元初值:30秒

timer0_0:     lcall   dsp_time     ;调用倒计时显示输出子程序
timer0_1:     reti             ;开中断返回

timer0_2:     cjne   a,#5,timer0_0   ;倒计时单元不等于5转至timer0_0

                          ;倒计时单元等于5处理程序
          clr   ledx_y       ;“亮”x向黄灯
          clr   ledy_y       ;“亮”y象黄灯
          sjmp   timer0_0     ;转至timer0_0

                          ;倒计时显示输出子程序
dsp_time:     mov   dptr,#dsp_lab   ;取显示码表地址指针

          mov   a,m_time30     ;取倒计时高位显示码
          swap   a
          anl   a,#0fh
          movc   a,@a+dptr
          mov   p0,a         ;倒计时高位显示码由p0输出

          mov   a,m_time30     ;取倒计时低位显示码
          anl   a,#0fh
          movc   a,@a+dptr
          mov   p2,a         ;倒计时低位显示码由p2输出

          ret               ;子程序返回

dsp_lab:
    ;dpgfedcba
db     11000000b   ;“0”显示码
db     11111001b   ;“1”显示码
db     10100100b   ;“2”显示码
db     10110000b   ;“3”显示码
db     10011001b   ;“4”显示码
db     10010011b   ;“5”显示码
db     10000010b   ;“6”显示码
db     11111000b   ;“7”显示码
db     10000000b   ;“8”显示码
db     10010000b   ;“9”显示码
离线oxalis
发帖
958
只看该作者 3楼 发表于: 2004-06-26
自己顶自己顶,自己顶
离线berger
发帖
280
只看该作者 4楼 发表于: 2004-06-30
我帮顶下,这时期的人可能都埋头苦干中.
像我前两天才收到编程器,现在正在学习中... :d .
还好以前读书时学过汇编和C :p
现正在找lcd做一个频率计什么的.