一个关于at89c51的串口工作方式的问题

swsg 2005-04-11 09:18:40
我使用at89c51单片机串口传输进行控制,因为使用到了多机通信,所以采用了它的方式3具体的串口配置如下:
TMOD=0x20; //定时器T1为方式1
TH1=0xf3; /*定时器送初值,波特率为2400*/
TL1=0xf3;
PCON=0x80; /*smod=1*/
SCON=0xf0; /*串行口为方式3*/
TR1=1 ; /*启动定时器*/
PS = 1; //优先级控制打开
ES= 1; //open the uart interrupt
EA= 0; //permit interrupt
然后我发送采用了数据和地址分别用不同的函数进行
void SerialSendAddrChar(uint8 ch) //发送地址的串口中断
{
TB8=1;
SBUF=ch;
while(TI==0);
TI=0;
}

void SerialSendOprChar(uint8 ch) //发送数据的串口中断
{
TB8=0;
SBUF=ch;
while(TI==0);
TI=0;
}
具体的流程是中心发送了一地址后发送一个数据,在接收端先收到地址码,通过和本地的地址码(本地的地址码放在p2口)进行比较如果相同则置sm2=0,允许接收数据。不同则不进行操作,具体的接收端程序如下:
void SerialInt(void) interrupt 4 using 1 //接收中断
{
uint8 tem;
if(RI)
{
EA = 0;
ES = 0;
tem=SBUF;
Serial_int(tem); //调用接收中断的数据处理子程序
RI=0;
ES = 1;
EA = 1;
}
}

void Serial_int(unsigned char S_char) //中断接收处理子程序,处理通过串口接收到的数据
{
uint8 tmp;
if(RB8==1)
{
tmp=P2;
if(S_char==tmp) //分站,则比较是否为当前站操作
{
SM2=0;
Isaddr=1;

}
else
{
Not_here=1;
}
}
else
{
switch(S_char)
{

case Comm_to_sub:
Iscenter_comm=1;
config(1);
break;
case Reply:
Comm=1;
config(1);
break;
case Fre_full:
Nofre=1;
config(0);
break;
default:break;
}
SM2=1;
}
}
现在的问题是我按上面的进行操作后,把串口设置成方式3以后程序运行起来串口好像根本就没有接收中断产生。我用示波器看了串口的rxd脚,当txd上有波形的时候rxd上也有波形啊(而且rxd和txd上的波形相同)。而当我设置成方式1是串口可以正常工作,但是这样的话我无法进行地址选择啊!!
各位大侠帮我看看啊
...全文
416 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
icesnows 2005-04-13
  • 打赏
  • 举报
回复
跟SM2有关吧,你SM2是不是设得不对!SM2位主要用于方式2和方式3。接收状态,当串行口工作于方式2或3,以及SM2=1时,只有当接收到第9位数据(RB8)为1时,才把接收到的前8位数据送入SBUF,且置位RI发出中断申请,否则会将接受到的数据放弃。当SM2=0时,就不管第位数据是0还是1,都将数据送入SBUF,并发出中断申请。
感觉你得控制逻辑有问题
swsg 2005-04-12
  • 打赏
  • 举报
回复
我在其他地方打开了EA中断!
swsg 2005-04-11
  • 打赏
  • 举报
回复
没有人关心么??!
gRempCH_eNter 2005-04-11
  • 打赏
  • 举报
回复
-------------------------------------------------
EA= 0; //permit interrupt
-------------------------------------------------
EA为0还怎么产生中断?
EA是控制全局中断的啊!
sunnysmile 2005-04-11
  • 打赏
  • 举报
回复
SM2应为0
AT89C51设计LCD1602显示DS1302实时日历时钟毕业论文文档+软件源码,单片机LCD毕业设计,有代码、仿真电路、设计报告,仿真使用的是proteus仿真,可直接加载HEX文件运行. 摘要 此次课程设计的要求是通过LCD与单片机的连接模块能够显示数字(如时间)、字符(如英文)和图形等,这就需要专门的时钟芯片-----DS1302。 DS1302是一种高性能、低功耗、带RAM的实时时钟芯片,它能够对时,分,秒进行精确计时,它与单片机的接口使用同步串行通信,仅用3条线与之相连接,就可以实现MCS-51单片机对其进行读写操作,把读出的时间数据送到LCD1602上显示。程序运行时,必须先对LM044L进行初始设置,然后,通过单片机从DS1302中获取时间并通过LCD1602显示。同时,进行循环赋值,使LCD动态显示当前的时间。 关键字:AT89C51、DS1302,LCD1602显示器 一.设计任务和要求 1. 利用DS1302实现年月日时分秒,并用LCD显示。 2. 通过LCD模块与单片机的接口,能显示数字(如时间)、字符(如英文)。 3. 硬件设计部分,根据设计的任务选定合适的单片机,根据控制对象设计接口电路。设计的单元电路必须有工作原理,器件的作用,分析和计算过程; 4. 软件设计部分,根据电路工作过程,画出软件流程图,根据流程图编写相应的程序,进行调试并打印程序清单; 5.原理图设计部分,根据所确定的设计电路,利用Proteus工具软件绘制电路原理图。 6计算说明书部分包括方案论证报告打印版或手写版,程序流程图具体程序等 7. 图纸部分包括具体电路原理图打印版 8. 设计要求还包括利用一天时间进行资料查阅与学习讨论,利用5天时间在实验室进行分散设计,最后三天编写报告。最后一天进行成果验收。 二.方案论证 实现数字电子钟的设计有以下两种基本方案,现就两种基本方案的优劣进行具体论证,从而说明选择方案二的理由。 方案一:直接用单片机的内部定时器来实现时间。该方案以AT89C51单片机为主控芯片,以内部定时器产生的1s中断作为时钟的驱动,然后再通LCD液晶显示器来组成数字钟电路。但是此方案最大的缺点在于单片机89C51产生的1s中断存在误差,如果工作时间长的话,数字时钟显示的时间将会出现严重的偏差,不够精确。 方案二:使用串行接口时钟芯片DS1302设计时钟电路。该设计方案以AT89C51单片机为主控芯片,以串行时钟芯片DS1302为核心计时芯片,然后再通过一个LCD液晶显示器组成数字时钟电路。更重要的是,DS1302时钟芯片的加入大大提高了数字钟时间的准确性,而且该电路在断电后不丢失时间和数据信息时也使得该方案的研究与提升更具有开发的意义。 三.核心芯片功能介绍 1.AT89C51 AT89S51[3]美国ATMEL公司生产的低功耗,高性能CMOS 8位单片机,片内含4K BytesISP(In-system programmable)的可反复擦写1000次的Flash只读程序存储器,器件采用ATMEL公司的高密度、非易失性存储技术制造,兼容标准MCS-51指令系统及AT89C51引脚结构,芯片内集成了通用8位中央处理器和ISP Flash存储单元。单片机AT89S51强大的功能可为许多嵌入式控制应用系统提供高性价比的解决方案。 AT89C51芯片的引脚结构如图1所示: 1.1 功能特性概括: AT89S51提供以下标准功能:40个引脚、4K Bytes Flash片内程序存储器、128 Bytes的随机存取数据存储器(RAM)、32个外部双向输入/输出(I/O)口、5个中断优先级2层中断嵌套中断、2个数据指针、2个16位可编程定时/计数器、2个全双工串行通信口、看门狗(WDT)电路、片内振荡器及时钟电路。此外,AT89S51可降至0Hz的静态逻辑操作,并支持两种软件可选的节电工作模式。空闲模式下, 图1 AT89C51引脚图 CPU暂停工作,而RAM、定时/计数器、串行通信口、外中断系统可继续工作。掉电模式冻结振荡器而保存RAM的数据,停止芯片其它功能直至外中断激活或硬件复位。同时该芯片还具有PDIP、TQFP和PLCC等三种封装形式,以适应不同产品的需求。

27,382

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
  • 单片机/工控社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧