cpubbs论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

LabVIEW+单片机学习套件全套教程资料下载[免费]LabVIEW论坛精华列表贴USB0816数据采集卡《LabVIEW宝典》
LabWindows/CVI论坛精华贴NET0816以太网数据采集卡RC0210远程设备授权系统 关闭关停锁定打开设备 户外分布式数据采集
NET1624低速高精度以太网数据采集卡WIFI0824SD无线WIFI网络数据采集卡脱机运行 SD存储 小尺寸微型 串口采集远程采集 安卓 手持移动采集 纪录仪
查看: 1846|回复: 0

at89c2051模拟串口(中断接收,9600PBS,11.0592M晶振),

[复制链接]
发表于 2004-11-6 02:41:21 | 显示全部楼层 |阅读模式
<>;模拟串行通讯程序</P>
<> io_rxd  equ  p3.2           ;模拟rxd,中断接收
io_txd  equ  p1.0           ;模拟txd
ar_sbuf equ  7eh            ;模拟串行接收存储单元
at_sbuf equ  7fh            ;模拟串行发送存储单元
a_ri    bit  0                    ;模拟串行接收标志位,a_ri="1",表示已接收新数据
a_ti    bit  1                    ;模拟串行发送标志位,a_ti="1",表示已发送新数据</P>
<>         org 0000h
             ljmp start        ;复位入口
         org 0003h
             ljmp a_asi          ;模拟串行接收中断入口</P>
<P>         org 0030h
start:   mov sp,#30h
              setb px0            ;置模拟串行接收(int0)最高级中断
         setb ex0             ;允许int0中断
         setb ea              ;总中断允许
;......
main:
;......
         mov at_sbuf,#0      ;将要发送的数据存入at_sbuf
         lcall a_aso            ;调模拟串行发送子程序
;......
         ljmp main</P>
<P>;模拟串行接收中断程序
a_asi:   push psw             ;psw保护入栈
         push acc             ;acc保护入栈
        setb rs0              ;更换工作寄存器组
        setb rs1              ;或使用其它未被使用的工作寄存器组
        mov r7,#8            ;接收8位数据位
;接收起始位
        lcall a_delay05t ;调1/2位周期延时子程序
        lcall a_test_bit  ;调逻辑检测子程序
        jnc a_asi2            ;起始位正确转a_asi2,起始位逻辑应为“0”
;程序返回出口
a_asi1:  pop acc                ;acc保护出栈
         pop psw               ;psw保护出栈
         reti                      ;开中断返回
;接收8位数据位
a_asi2:  lcall a_delay10t ;调位周期延时子程序      
         lcall a_test_bit  ;调逻辑检测子程序
         rrc a                     ;数据位暂存于累加器中
         djnz r7,a_asi2       ;8位数据未接收完循环至a_asi2
;接收终止位
         lcall a_delay10t  ;调位周期延时子程序     
         lcall a_test_bit  ;调逻辑检测子程序
         jnc a_asi1             ;终止位不正确转a_asi1
             setb a_ri               ;模拟串行接收标志位a_ri置位
         mov ar_sbuf,a      ;8位接收数据存入模拟串行接收存储器ar_sbuf
             sjmp a_asi1           ;转中断出口返回</P>
<P>;模拟串行发送子程序
a_as   clr ea                   ;禁止所有中断
a_aso1:  mov r4,#9            ;8位数据+1位终止位
         clr io_txd            ;模拟串口输出逻辑"0",输出起始位
          nop
              mov a,at_sbuf     ;模拟发送数据存储器内容送累加器
         setb c                  ;终止位在c中,置终止位
a_aso2:  lcall a_delay10t1  ;调位周期延时子程序
          rrc a                        ;取发送逻辑至c中
          mov io_txd,c           ;由模拟串行口发送
          djnz r4,a_aso2        ;未发送完循环至a_aso2
              lcall a_delay10t1  ;调位周期延时子程序
          setb a_ti                 ;模拟串新接收标志位置位
          setb ea                    ;开中断
          ret                           ;返回</P>
<P>;模拟串行接收逻辑检测子程序,三取二
a_test_bit: jb io_rxd,a_test_bit1   ;第1次检测为“1”,转a_test_bit1
                    jnb io_rxd,a_test_bitl ;两次检测都为“0”,转a_test_bitl
                    jb io_rxd,a_test_bith   ;第3次检测为"1",转a_test_bith
a_test_bitl:clr c                              ;检测逻辑在c中,c清零
             ret                                 ;返回
a_test_bit1:jb io_rxd,a_test_bith   ;两次检测都为“1”,转a_test_bith
                     jnb io_rxd,a_test_bitl ;第3次检测为"0",转a_test_bitl
a_test_bith:setb c                            ;检测逻辑在c中,c置位
              ret                                ;返回</P>
<P>;模拟串行通讯程序延时子程序
;时钟频率=11.0592MHz,波特率=9600pbs</P>
<P>A_DELAY05T: MOV R5,#12
A_DELAY05T1JNZ R5,$
            RET
A_DELAY10T: MOV R5,#38
            NOP
            SJMP A_DELAY05T1
A_DELAY10T1:MOV R5,#42
            SJMP A_DELAY05T1
</P>
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|cpubbs论坛. ( 粤ICP备09171248号 )

GMT+8, 2025-5-2 09:04 , Processed in 0.390260 second(s), 6 queries , Gzip On, File On.

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

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