打印

串口通信的单片机程序

[复制链接]
2333|13
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
man16181|  楼主 | 2008-8-27 14:17 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

 
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/

相关帖子

沙发
5880527| | 2008-8-27 18:20 | 只看该作者

放书本上还是可以的,没啥实用价值

使用特权

评论回复
板凳
农民讲习所| | 2008-8-27 19:43 | 只看该作者

mugua1021的程序太没水平了

使用特权

评论回复
地板
5880527| | 2008-8-27 20:13 | 只看该作者

呵呵

更没实用价值了

使用特权

评论回复
5
icmap| | 2008-8-27 20:34 | 只看该作者

在实际的应用中,不要用循环来等待发送完毕

在实际的应用中,不要用循环来等待发送完毕,这很耗费MCU运行时间。

好的接收方法是,在接收中断程序中把收到的数据放入接收队列。对数据的进一步的处理放在中断外,以尽量减少中断的执行时间。

好的发送方法是,在中断外把要发送的数据放入发送队列(可以一次放多个字节,保持发送队列不溢出就行),在发送中断程序中只发送队列中的一个字节就结束,队列中下一个待发送的字节等待下次发送中断产生时再发送,以此类推。需要注意的是,当发送队列为空的时候,由于没有数据可发,就再也不会产生发送中断了,在这种情况下外部程序向发送队列添加字节时,需要软件将ti置1,以便产生发送中断,让发送中断程序发送数据。

使用特权

评论回复
6
lyjian| | 2008-8-27 20:44 | 只看该作者

楼上说的不错

使用特权

评论回复
7
zl040901| | 2008-8-27 22:19 | 只看该作者

00

要不给个经典的啊

使用特权

评论回复
8
5880527| | 2008-8-28 19:24 | 只看该作者

我不是高手,但我的做法和楼主不一样

中断需要尽可能省时间,收到信息后要做的是简单处理后存起来,比如奇偶校验,信息是否超过了预定的长度范围,是否是在不该来信息的时候收到了东西,简单处理后就退出中断。主要工作到外面去做,比如对收到的内容进行CRC校验,对需要进行的操作进行运算处理,需要怎样回答对方...而不是象楼主这样在通讯中断里去做这些。我的中断一直就开着,不需要开啊关的

使用特权

评论回复
9
xwj| | 2008-8-28 19:32 | 只看该作者

光是jnb ti,$ ,就只能说你没入门

教科书真是误人啊....

使用特权

评论回复
10
5880527| | 2008-8-28 19:47 | 只看该作者

感觉象卖仿真板之类学的程序,虽然从没买过那东西

使用特权

评论回复
11
5880527| | 2008-8-28 19:48 | 只看该作者

嘿,还真的不太离谱哈,后面有个后缀——中国IT实验室

使用特权

评论回复
12
grady1125| | 2008-8-28 20:55 | 只看该作者

ls这样写还真第一次见

 TI="0";   //清发送标志位 

使用特权

评论回复
13
alger2009| | 2010-1-19 14:14 | 只看该作者
看帖真好

使用特权

评论回复
14
jesseaz| | 2010-1-20 16:33 | 只看该作者
我感觉太菜了。

使用特权

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

本版积分规则

18

主题

20

帖子

0

粉丝