打印

串口通信的单片机程序

[复制链接]
1080|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
flycat2008|  楼主 | 2008-7-25 11:26 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

 
beep    bit   p3.7                ;蜂鸣器定义

        org 00h
      jmp main
        org 23h                       ;串行中断入口地址
      jmp com_int                     ;串行中断服务程序

;***********  主程序开始    *******************
        org 30h
  main:  mov sp,#30h                ;设置堆栈
             lcall rest             ;初始化
             lcall comm             ;串口初始化
             jmp $                  ;原地等待

;  *************   初始化   *********************
   rest:      mov p0,#00h             ;禁止数码管显示
             mov p2,#255
             clr  beep                ;禁止蜂鸣器
             mov p1,#255              ;禁止LED显示
             RET                      ;返回

; **************  串口初始化   *****************
;设置串行口工作方式1,定时器1作为波特率发生器
;波特率设置为   2400  ;

comm:         mov tmod,#20h          ;设置定时器T1工作方式2
              mov tl1,#0f3h             ;定时器计数初值,波特率 2400 
              mov th1,#0f3h            ;定时器重装值
              setb ea                       ;允许总的中断
              setb es                       ;允许串行中断
              mov pcon,#00h          ;波特率不倍增
              mov scon,#50h          ;设置串口工作方式1,REN = 1 允许接收
              setb tr1                       ;定时器开始工作
              ret                               ;返回
;***************  串口中断服务程序   ***********
;  如果接收  0FF  表示上位机需要联机信号,单片机发送 0FFH作为
;  应答信号,如果接收到 数字 1~ n,表示相应的功能;
;  这里,如果收到 1 ,则单片机向计算机发送字符  'H';
;            如果收到 2 ,则单片机向计算机发送字符  'e';
;            如果收到其他的数据,则发送    'J';
com_int:  clr es                        ;禁止串行中断
                clr ri                          ;清除接收标志位
                mov a,sbuf               ;从缓冲区取出数据
                mov p1,a
                mov dptr,#tab
                cjne a,#0ffh,in_1      ;检查数据
                mov sbuf,#255          ;收到联机信号,发送联机信号
                jnb ti,$                      ;等待发送完毕
                clr ti                          ;清除发送标志
                setb es                     ;允许串行中断
                reti                            ;中断返回
      in_1: cjne a,#1H, in_2         ;如果收到1
                movc a,@a+dptr
                mov sbuf,a             ;发送 'h'
                jnb ti,$                      ;等待发送完毕
                clr  ti                         ;清除发送中断标志
                setb es                     ;允许串行中断
                reti                            ;中断返回
      in_2: cjne a,#2,in_3         ;接收到  2 
                movc a,@a+dptr
                mov sbuf,a             ;发送 'e'
                jnb ti,$                      ;等待发送完毕
                clr  ti                         ;清除发送中断
                setb es                     ;允许串行中断
                reti                            ;中断返回
      in_3:     mov a,#03h
                movc a,@a+dptr
                mov sbuf,a             ;发送 'j'
                jnb ti,$                      ;等待发送完毕
                clr ti                          ;清除发送中断标志
                setb es                     ;允许串行中断
                reti                            ;返回
tab:    db '2','h','e','j'
  end
本**来自中国IT实验室http://embed.chinaitlab.com/

相关帖子

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

本版积分规则

88

主题

103

帖子

0

粉丝