原创 中断程序分析举例未完成

2011-3-13 14:27 1330 2 2 分类: MCU/ 嵌入式

甲乙机以方式1进行串行通信,其波特率设为1200,甲机发送,发送数据在外部RAM 4000H~401FH单元中。乙机接收,并把接收到的数据块首末地址及数据依次存入外部RAM5000H开始的区域中。

第一步:波特率所对应的计数初值设定。假定晶振频率是6MHz,且是以方式1进行通信,T1设为工作方式2.则计数初值:X=(11110011)B

可以通过以下C语言程序得到计数初值,条件是:晶振频率是6MHz,T1设为工作方式2。

#include "iostream"
#include <bitset>

using namespace std;
using std::bitset;

void main()
{    
    int    i,j;
    cin>>i;
    j=256-6000000/384/i;
    bitset<16> bitvec2(j);
    cout << "bitvec2: " << bitvec2 << endl;

}

输入值为波特率,输出即为计数初值。

甲机发送主程序:

                           //中断跳转程序   
                    ORG        0023H    //串行中断的入口地址
                    AJMP    ACINT
                   //计数器TI初始化程序
                   ORG        8030H
                   MOV        TMOD,    #20H;设置计数器1为工作方式2
                   MOV        TH1,    #0F3H;
                   MOV        TL1,    #0F3H;
                    //中断设置
                   SETB    EA            ;中断总允许
                   CLR        ES            ;关串行中断
                   MOV        PCON,    #00H;I波特率不倍增
                   SETB    TR1            ;启动定时器1
                   MOV        SCON,    #40H;设置串行口方式1工作
                   MOV        SBUF,    #40H;发送首地址高位
SOUT1:    JNB        TI,        $    ;等待发送完成
                  CLR        TI            ;串行口中断标志位需要手动清0
                  MOV        SBUF,    #00H;发送首地址低位
SOUT2:    JNB        TI,        $    ;等待发送完成
                  CLR        TI
                  MOV        SBUF,    #40H
SOUT3:    JNB        TI,        $
                  CLR        TI
                  MOV        SUBF,    #1FH;
SOUT4:    JNB        TI,        $
                  CLR        TI
                  MOV        DPTR,    #4000H;装首地址指针
                  MOV        R7,        #20H  ;一共有32个数据需要发送 送                                                                                                                                                                                                                                                                              
                  SETB    ES
AHALT:     AJMP    $

                  //中断服务子程序
ACINT:     MOV        A,        @DPTR
                 CLR        TI
                 MOV        SBUF,    A      ;将RAM中的数据送出
                 CJNE    R7,#00H,AEND1 ;发送完跳转
                 DEC        R7
                 INC        DPTR
                 AJMP    ANED2
AEND1:    CLR        ES              ;关闭串行中断

                   CLR        TR1              ;关闭定时器

ANED2:     RETI   

文章评论0条评论)

登录后参与讨论
我要评论
0
2
关闭 站长推荐上一条 /2 下一条