打印
[AVR单片机]

帮一下忙...

[复制链接]
1935|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
Karlshen|  楼主 | 2009-11-14 22:18 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
沙发
laslison| | 2009-11-15 22:00 | 只看该作者
:dizzy:,有时要程序啊

使用特权

评论回复
板凳
lovelyegle| | 2009-11-16 23:05 | 只看该作者
应该有专门讨论程序论坛,去逛逛

使用特权

评论回复
地板
suoma| | 2009-11-17 14:18 | 只看该作者
要AT89S51的按键程序?给你个参考程序

利用单片机来制作一个事件统计与显示电路,当某事件出现时,送来一个负脉冲。显示器由两位七段LED数码管组成,初始状态显示“00”,以后每送来一个负脉冲,则显示内容加1,当显示“99”时,若再送来一个负脉冲,则又显示“00”,同时使蜂鸣器以1000Hz的频率响10秒钟。

所用器件:AT89S51,7段数码管,LM386,电阻,电容,12MHz晶振,扬声器等。
在AT89S51单片机的P3.7管脚接一个轻触开关,作为手动计数的按钮,用单片机的P2.0-P2.7接一个共阴数码管,作为00-99计数的个位数显示,用单片机的P0.0-P0.7接一个共阴数码管,作为00-99计数的十位数显示。
利用P1.0作为1KHz声波输出端,经过以LM386为中心的音频处理模块放大后从扬声器中输出10秒钟1KHz方波。

程序设计内容
(1.单片机对按键的识别的过程处理。
(2.单片机对正确识别的按键进行计数,计数满时,使蜂鸣器以1000Hz的频率响10秒钟。
(3.输出10秒钟后,从“00”开始重新计数。
(4.单片机对计的数值要进行数码显示,计得的数是十进数,含有十位和个位,我们要把十位和个位拆开分别送出这样的十位和个位数值到对应的数码管上显示。如何拆开十位和个位我们可以把所计得的数值对10求余,即可个位数字,对10整除,即可得到十位数字。
(5.通过查表方式,分别显示出个位和十位数字。
(6.因为1KHZ的方波信号周期为1ms,高电平占用0.5ms,低电平占用0.5ms,如果要产生1KHz方波信号,且占用时间为10s,我们利用定时器T0来完成0.5ms的定时,关于怎样实现10s定时输出,本文给出两种方案:
方法一: 当选定定时/计数器T0的定时时间为0.5ms时,而要定时10s则是0.5ms的20000倍,也就是说以0.5ms定时20000次就达到定时时间10s。
方法二: 当选定定时/计数器T0的定时时间为0.5ms时,我们通过调用10s子程序实现定时10s。

使用特权

评论回复
5
suoma| | 2009-11-17 14:19 | 只看该作者
实现方法一:
;通过对0.5ms的若干次循环实现1KHz方波的10s输出

Count EQU 30H
    SP1 BIT P3.7
    T02SA EQU 31H
    T02SB EQU 32H
FLAG BIT 00H                   ;伪指令
        
ORG 00H
    LJMP START
    ORG 0BH
    LJMP INT_T0
START:      
MOV SP,50H                        ;设定堆栈区
    MOV Count,#00H                    ;显示部分初始化
NEXT1:                                ;显示程序     
MOV A,Count
    MOV B,#10
    DIV AB
    MOV DPTR,#TABLE                             
    MOVC A,@A+DPTR                    ;用查表法实现显示
    MOV P0,A                          ;显示十位
    MOV A,B   

;   MOVC A,@A+DPTR
    MOV P2,A                          ;显示个位
WT:           

;                       ;判断按键是否按下?
JNB SP1,WT
WAIT:           
JB SP1,WAIT
LCALL DELY10MS                    ;调用DELY10MS延时10ms实现消抖
JB SP1,WAIT
    INC Count
    MOV A,Count
    CJNE A,#100,NEXT1                 ;判断计数是否达到100?
START1:         
MOV T02SA,#00H
    MOV T02SB,#00H                             
CLR FLAG                          ;发声部分初始化
MOV TMOD,#01H                     ;置T0为模式1
    MOV TH0,#(65536-500) / 256               
    MOV TL0,#(65536-500) MOD 256      ;计数器置初值,实现0.5ms定时
    SETB TR0                          ;启动计数器
    SETB ET0  
    SETB EA                           ;开中断
    JNB FLAG,$                        ;若FLAG为1,


则跳出10S定时,否则等待中断
    CLR EA                           
    CLR ET0                           ;关中断
CLR P1.0                          ;置P1.0为0,使之停止发声
LJMP START                        ;跳转到程序起始端实现总体程序循环
INT_T0:                               ;中断服务程序
MOV TH0,#(65536-500) / 256   
    MOV TL0,#(65536-500) MOD 256      ;自动载入初值,实现0.5ms循环定时
    INC T02SA                         ;实现10s定时
    MOV A,T02SA
    CJNE A,#100,NEXT                  
    INC T02SB
    MOV A,T02SB
    CJNE A,#76,NEXT                    
    MOV T02SA,#00H                    ;定时达10s后,进行变量清空
    MOV T02SB,#00H
    SETB FLAG                    


sp; ;置FLAG为1,方便跳出10s定时
NEXT:           
CPL P1.0                          ;高低电平交替变换实现1KHz输出
DONE:           
RETI
DELY10MS:                             ;延迟10ms子程序
MOV R6,#20
D1: MOV R7,#248
    DJNZ R7,$
    DJNZ R6,D1
    RET
TABLE:      DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH
    END

使用特权

评论回复
6
suoma| | 2009-11-17 14:20 | 只看该作者
实现方法二:
;通过调用10s子程序实现1KHz方波的10s输出
Count EQU 30H
SP1 BIT P3.7                      ;伪指令

ORG 00H

LJMP START
    ORG 0BH
    LJMP INT_T0
               
START:      
MOV SP,#50H                       ;设定堆栈区
    MOV Count,#00H                    ;显示部分初始化
NEXT1:                                ;显示程序
MOV A,Count
    MOV B,#10
    DIV AB
    MOV DPTR,#TABLE
    MOVC A,

@A+DPTR                    ;用查表法实现显示
MOV P0,A                          ;显示十位
    MOV A,B
    MOVC A,@A+DPTR
    MOV P2,A                          ;显示个位
WT:                                   ;判断按键是否按下?
JNB SP1,WT
WAIT:           
JB SP1,WAIT
    LCALL DELY10MS                    ;调用10ms延时子程序实现消抖
    JB SP1,WAIT
INC Count
    MOV A,Count
    CJNE A,#100,NEXT1                 ;判断计数是否达到100?
START1:        
    MOV TMOD,#01H                     ;设置计数器T0为工作模式1
    MOV TH0,#(65536-500) / 256
    MOV TL0,#(65536-500) MOD 256      ;计数器置初值,实现0.5ms定时
    SETB TR0                          ;启动计数器
    SETB ET0                     
    SETB EA


;                        ;开中断
    LCALL DELY10S                     ;调用DELY10S,实现输出方波10s定时
    CLR EA                            ;子程序执行完的后期处理
    CLR ET0                        
    CLR P1.0                          ;置P1.0为0,使之停止发声
    LJMP START                       ;跳转到程序起始端实现总体程序循环
INT_T0:                               ;定时0.5ms中断服务程序
    MOV TH0,#(65536-500) / 256
    MOV TL0,#(65536-500) MOD 256      ;自动载入初值,实现0.5ms循环定时
    CPL P1.0                          ;高低电平交替变换实现1KHz输出
RETI
DELY10MS:                             ;延时10ms子程序
MOV R6,#20
D1:     
MOV R7,#248
    DJNZ R7,$
    DJNZ R6,D1
RET
DELY10S:   


sp;                      ;延时10s子程序
MOV R3,#95    ;
D2: MOV R4,#200
D3: MOV R5,#248
DJNZ R5,$
    DJNZ R4,D3
DJNZ R3,D2
RET
TABLE:      DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH
        END

使用特权

评论回复
7
suoma| | 2009-11-17 14:21 | 只看该作者
上述汇编源程序仅供参考,:)

使用特权

评论回复
8
Karlshen|  楼主 | 2009-12-8 22:48 | 只看该作者
非常感谢,实际能用上的不多,还是谢谢

使用特权

评论回复
9
lvg2020| | 2009-12-9 09:57 | 只看该作者
这个不是矩阵键盘程序嘛,网上好多例子的啊

使用特权

评论回复
10
huamunv| | 2009-12-9 22:16 | 只看该作者
鼓励下suoma,回帖还蛮认真的

使用特权

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

本版积分规则

81

主题

734

帖子

1

粉丝