打印
[51单片机]

单键循环

[复制链接]
1551|18
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
qinnengbuzuo|  楼主 | 2013-11-28 17:03 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 qinnengbuzuo 于 2013-11-29 15:39 编辑

求一个简单程序,要汇编语言的,请使用定时器中断编写,指示灯以500毫秒的速率闪烁
上电的时候,L1接在P1.0管脚上的发光二极管在闪烁,
当第一次按下开关SP1的时候,L2接在P1.1管脚上的发光二极管在闪烁,
第二次按下开关SP1的时候,L3接在P1.2管脚上的发光二极管在闪烁,
第三次按下开关SP1的时候,L4接在P1.3管脚上的发光二极管在闪烁,
第四次按下开关SP1的时候,又轮到L1在闪烁了,


看了很多大哥的回复,大家误解了,我这求教不是为了做项目,我刚学51单片机,只是自己试着编的,编了好久都搞不好,这才求教的。

相关帖子

沙发
ayb_ice| | 2013-11-28 17:23 | 只看该作者
多少分

使用特权

评论回复
板凳
51armfpga| | 2013-11-28 17:41 | 只看该作者
是作业吧,

使用特权

评论回复
地板
NE5532| | 2013-11-28 20:11 | 只看该作者
ayb_ice 发表于 2013-11-28 17:23
多少分

多少钱?

使用特权

评论回复
5
ZG11211| | 2013-11-28 21:46 | 只看该作者
多少K?

使用特权

评论回复
6
戈卫东| | 2013-11-28 22:07 | 只看该作者
这么简单的作业都不愿自己做.....

使用特权

评论回复
7
banalmaster| | 2013-11-29 00:11 | 只看该作者
多少钱?:lol

使用特权

评论回复
8
ayb_ice| | 2013-11-29 09:16 | 只看该作者
;//求一个简单程序,要汇编语言的,请使用定时器中断编写,指示灯以500毫秒的速率闪烁
;//上电的时候,L1接在P1.0管脚上的发光二极管在闪烁,
;//当第一次按下开关SP1的时候,L2接在P1.1管脚上的发光二极管在闪烁,
;//第二次按下开关SP1的时候,L3接在P1.2管脚上的发光二极管在闪烁,
;//第三次按下开关SP1的时候,L4接在P1.3管脚上的发光二极管在闪烁,
;//第四次按下开关SP1的时候,又轮到L1在闪烁了,


#include <REGX51.H>


;_______________________________
; GPIO定义
        led0        bit                090h.0
        led1        bit                090h.1
        led2        bit                090h.2
        led3        bit                090h.3

        key                bit                090h.7

;_______________________________
; 变量定义
        dseg        at                030h
counter_500ms:                ds        1
stage:                                ds        1


        bseg        at                00h
bkp_key:        dbit        1
flash:                dbit        1


;_______________________________
; 程序开始
        cseg        at        0
        ljmp        reset_init

        cseg        at        0bh
        ljmp        isr_t0



reset_init:
        mov                sp,#07fh-32

        clr                a
        mov                counter_500ms,a
        mov                stage,a

        setb        key
        setb        bkp_key
        clr                flash


        mov                tmod,#01h
        mov                th0,#high(65536-1000)
        mov                tl0,#high(65536-1000)
        clr                tf0
        setb        et0

        setb        ea
        setb        tr0


main_loop:
        jmp                $

        ret




;_______________________________
; T0中断程序
isr_t0:
        push        psw
        push        acc
        push        b

        clr                tr0
        mov                th0,#high(65536-1000)
        mov                tl0,#high(65536-1000)
        setb        tr0

        ;_______________________________
        ; led0
        inc                counter_500ms
        mov                a,counter_500ms
        xrl                a,#50
        jnz                label_10
        cpl                led0
        cpl                flash

        ;_______________________________
        ; key
label_10:
        setb        key
        mov                c,key
        mov                f0,c
        jb                f0,label_11
        jnb                bkp_key,label_11
        inc                stage
        mov                a,stage
        setb        c
        subb        a,#2
        jc                label_11
        mov                stage,#0h

label_11:
        mov                c,f0
        mov                bkp_key,c

        ;_______________________________
        ; led1,led2,led3
label_00:
        mov                a,stage
        cjne        a,#0,label_01
        mov                c,flash
        mov                led1,c
        jmp                label_xx

label_01:
        cjne        a,#1,label_02
        mov                c,flash
        mov                led2,c
        jmp                label_02

label_02:
        cjne        a,#2,label_xx
        mov                c,flash
        mov                led3,c
        jmp                label_xx



label_xx:
        pop                b
        pop                acc
        pop                psw
        reti







        end

使用特权

评论回复
9
旭日东起| | 2013-11-29 10:10 | 只看该作者
这东西,还是经自己用动手吧,都不好意思叫别人搞

使用特权

评论回复
10
食肉狼| | 2013-11-29 10:39 | 只看该作者
ayb_ice 发表于 2013-11-29 09:16
;//求一个简单程序,要汇编语言的,请使用定时器中断编写,指示灯以500毫秒的速率闪烁
;//上电的时候,L1接 ...

:$你真有心

使用特权

评论回复
11
老鱼探戈| | 2013-11-29 10:41 | 只看该作者
现在的学生啊。

使用特权

评论回复
12
ayb_ice| | 2013-11-29 10:48 | 只看该作者
修正点小bug
;//求一个简单程序,要汇编语言的,请使用定时器中断编写,指示灯以500毫秒的速率闪烁
;//上电的时候,L1接在P1.0管脚上的发光二极管在闪烁,
;//当第一次按下开关SP1的时候,L2接在P1.1管脚上的发光二极管在闪烁,
;//第二次按下开关SP1的时候,L3接在P1.2管脚上的发光二极管在闪烁,
;//第三次按下开关SP1的时候,L4接在P1.3管脚上的发光二极管在闪烁,
;//第四次按下开关SP1的时候,又轮到L1在闪烁了,


#include <REGX51.H>


;_______________________________
; GPIO定义
        led0        bit                090h.0
        led1        bit                090h.1
        led2        bit                090h.2
        led3        bit                090h.3

        key                bit                090h.7

;_______________________________
; 变量定义
        dseg        at                030h
counter_500ms:                ds        1
stage:                                ds        1


        bseg        at                00h
bkp_key:        dbit        1
flash:                dbit        1


;_______________________________
; 程序开始
        cseg        at        0
        ljmp        reset_init

        cseg        at        0bh
        ljmp        isr_t0



reset_init:
        mov                sp,#07fh-32

        clr                a
        mov                counter_500ms,a
        mov                stage,a

        setb        key
        setb        bkp_key
        clr                flash


        mov                tmod,#01h
        mov                th0,#high(65536-1000)
        mov                tl0,#low(65536-1000)
        clr                tf0
        setb        et0

        setb        ea
        setb        tr0


main_loop:
        jmp                $

        ret




;_______________________________
; T0中断程序
isr_t0:
        push        psw
        push        acc
        push        b

        clr                tr0
        mov                th0,#high(65536-1000)
        mov                tl0,#low(65536-1000)
        setb        tr0

        ;_______________________________
        ; led0
        inc                counter_500ms
        mov                a,counter_500ms
        xrl                a,#50
        jnz                label_10
        cpl                led0
        cpl                flash

        ;_______________________________
        ; key
label_10:
        setb        key
        mov                c,key
        mov                f0,c
        jb                f0,label_11
        jnb                bkp_key,label_11
        inc                stage
        mov                a,stage
        setb        c
        subb        a,#2
        jc                label_11
        mov                stage,#0h

label_11:
        mov                c,f0
        mov                bkp_key,c

        ;_______________________________
        ; led1,led2,led3
label_00:
        mov                a,stage
        cjne        a,#0,label_01
        mov                c,flash
        mov                led1,c

;        clr                led1
        clr                led2
        clr                led3
        jmp                label_xx

label_01:
        cjne        a,#1,label_02
        mov                c,flash
        mov                led2,c

        clr                led1
;        clr                led2
        clr                led3
        jmp                label_xx

label_02:
        cjne        a,#2,label_xx
        mov                c,flash
        mov                led3,c

        clr                led1
        clr                led2
;        clr                led3
        jmp                label_xx



label_xx:
        pop                b
        pop                acc
        pop                psw
        reti







        end

使用特权

评论回复
13
江枫渔火| | 2013-11-29 11:47 | 只看该作者
老板最爱这样的学生了。会抄会作弊能把事情做出来就行了,会利用各种现有资源,搜索也好,求教也好,把已有的资源,他人的资源整合来自己用就行了。大多数小企业都不是做什么高精尖的东西,都是炒来炒去~需要的就是这样低成本,高速度的模仿。

使用特权

评论回复
14
石头记| | 2013-11-29 14:18 | 只看该作者
这么简单的系统,一定要用单片机吗?CD4017+NE555便能轻松搞定

使用特权

评论回复
15
qinnengbuzuo|  楼主 | 2013-11-29 16:46 | 只看该作者
ayb_ice 发表于 2013-11-29 10:48
修正点小bug
;//求一个简单程序,要汇编语言的,请使用定时器中断编写,指示灯以500毫秒的速率闪烁
;//上电 ...

我这样写哪里不对呢?大哥能否指点一下?
                ID          EQU 33H
                K1         BIT P3.4
                L1          BIT P1.0
                L2          BIT P1.1
                L3          BIT P1.2
                L4          BIT P1.3
                ORG                00H                                ; 起始地址00H
                JMP                MAIN                        ; 跳转到MAIN
                ORG                0BH                                ; Timer 0中断向量地址
                JMP                TIM0                        ; 跳转到TIM0



MAIN:
                MOV ID,#00H
       
                SETB EA
                SETB ET0              
                MOV                TMOD, #01H                ; 使用Timer 0工作在模式1下
                MOV                TH0, #0D8H                ; 装载计数初始值,10000?s延时
                MOV                TL0, #0F0H                       
                MOV                R1, #50                ; Timer 0中断次数为50次,即延时0.5秒
       
                SETB        TR0                                ; 启动Timer 0
LOOP:
                 JB K1,$
            LCALL DELAY10MS
            JB K1,LOOP
            INC ID
            MOV A,ID
            CJNE A,#04,LOOP1
            MOV ID,#00H
LOOP1:       
                JNB K1,$ ;等待SP1释放
                JMP                LOOP                        ; 循环


                ; 这里是Timer 0中断服务子程序
TIM0:       
                ;PUSH ACC
                ;PUSH PSW
                MOV                TH0, #0D8H       
                MOV                TL0, #0F0H                       
                DJNZ        R1, IS4
                MOV                R1, #50       

                MOV A,ID
       
                CJNE A,#00H,IS1
                SETB L4       
                SETB L3
                SETB L2
                CPL L1
                JMP IS4
IS1:
                CJNE A,#01H,IS2
                SETB L1
                SETB L3
                SETB L4
                CPL L2
                JMP IS4
IS2:
                CJNE A,#02H,IS3
                SETB L2
                SETB L1
                SETB L4
                CPL L3
                JMP IS4
IS3:
                CJNE A,#03H,IS4
                SETB L3
                SETB L1
                SETB L2
                CPL L4
                JMP IS4

IS4:
                ;POP ACC
                ;POP PSW
                RETI                                        ; 返回主程序

DELAY10MS:                                                ; 按钮开关过滤抖动子程序
       
                MOV        R3,#20 ;10ms
F1:               
                MOV                R4,#248
                DJNZ        R4,$
                DJNZ        R3,F1
       
                RET       
       
                END                                                ; 程序结束

使用特权

评论回复
16
qinnengbuzuo|  楼主 | 2013-11-29 16:47 | 只看该作者
ayb_ice 发表于 2013-11-29 10:48
修正点小bug
;//求一个简单程序,要汇编语言的,请使用定时器中断编写,指示灯以500毫秒的速率闪烁
;//上电 ...

我这样写是哪里不对呢?请大哥指点
                ID          EQU 33H
                K1         BIT P3.4
                L1          BIT P1.0
                L2          BIT P1.1
                L3          BIT P1.2
                L4          BIT P1.3
                ORG                00H                                ; 起始地址00H
                JMP                MAIN                        ; 跳转到MAIN
                ORG                0BH                                ; Timer 0中断向量地址
                JMP                TIM0                        ; 跳转到TIM0



MAIN:
                MOV ID,#00H
       
                SETB EA
                SETB ET0              
                MOV                TMOD, #01H                ; 使用Timer 0工作在模式1下
                MOV                TH0, #0D8H                ; 装载计数初始值,10000?s延时
                MOV                TL0, #0F0H                       
                MOV                R1, #50                ; Timer 0中断次数为50次,即延时0.5秒
       
                SETB        TR0                                ; 启动Timer 0
LOOP:
                 JB K1,$
            LCALL DELAY10MS
            JB K1,LOOP
            INC ID
            MOV A,ID
            CJNE A,#04,LOOP1
            MOV ID,#00H
LOOP1:       
                JNB K1,$ ;等待SP1释放
                JMP                LOOP                        ; 循环


                ; 这里是Timer 0中断服务子程序
TIM0:       
                ;PUSH ACC
                ;PUSH PSW
                MOV                TH0, #0D8H       
                MOV                TL0, #0F0H                       
                DJNZ        R1, IS4
                MOV                R1, #50       

                MOV A,ID
       
                CJNE A,#00H,IS1
                SETB L4       
                SETB L3
                SETB L2
                CPL L1
                JMP IS4
IS1:
                CJNE A,#01H,IS2
                SETB L1
                SETB L3
                SETB L4
                CPL L2
                JMP IS4
IS2:
                CJNE A,#02H,IS3
                SETB L2
                SETB L1
                SETB L4
                CPL L3
                JMP IS4
IS3:
                CJNE A,#03H,IS4
                SETB L3
                SETB L1
                SETB L2
                CPL L4
                JMP IS4

IS4:
                ;POP ACC
                ;POP PSW
                RETI                                        ; 返回主程序

DELAY10MS:                                                ; 按钮开关过滤抖动子程序
       
                MOV        R3,#20 ;10ms
F1:               
                MOV                R4,#248
                DJNZ        R4,$
                DJNZ        R3,F1
       
                RET       
       
                END                                                ; 程序结束

使用特权

评论回复
17
ayb_ice| | 2013-11-29 17:03 | 只看该作者
你不说我怎么知道哪里有错呢

使用特权

评论回复
18
ayb_ice| | 2013-11-29 17:05 | 只看该作者
再次修正的小BUG

        ;_______________________________
        ; led0
        inc                counter_500ms
        mov                a,counter_500ms
        xrl                a,#50
        jnz                label_10
        mov                counter_500ms,a    ; 添加此句
        cpl                led0
        cpl                flash

使用特权

评论回复
19
qinnengbuzuo|  楼主 | 2013-11-29 17:27 | 只看该作者
ayb_ice 发表于 2013-11-29 17:03
你不说我怎么知道哪里有错呢

就是那个按键按下的时候,很乱,不能按L1   L2   L3   L4的顺序执行

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

5

帖子

0

粉丝