当前位置: 代码迷 >> 单片机 >> 51串行口 工作方式0有关问题
  详细解决方案

51串行口 工作方式0有关问题

热度:91   发布时间:2016-04-28 16:13:22.0
51串行口 工作方式0问题
C/C++ code
#include<reg52.h>sbit d1=P1^1;                //接有发光二极管,低电平时灯亮sbit rx=P3^0;void delayms(unsigned int x)        //延时x毫秒{    unsigned int i,j;    for(i=0;i<x;i++)    {        for(j=110;j>0;j--);    }}main(){    SCON=0;                        //使串口工作方式0    EA=1;    ES=1;    TI=0;    while(1)    {        SBUF=0xaa;        d1=rx;                //想使d1的状态受到RXD引脚上信号的控制,但没有成功        delayms(1);            //二极管一直没亮,如果一直亮还可能是频率太快了,但现在灯一直没                        //亮,请问是怎么回事?    }}void ser_isr() interrupt 4{    if(TI==1)        TI=0;}


问题在注释里,谢谢了

假如d1可以正确接收到P3.0口的状态,但变化速度很快(灯应该一直都是亮的),有没有办法使发送数据的速度变慢点呢?

------解决方案--------------------
d1=rx;(P1^0=P3^0),51单片机能这么赋值吗?我都不记得了,我觉得好像只有FPGA才能连线这么定义吧
------解决方案--------------------
这个代码好怪,
1.这个是串口实验,但是SBUF只用了一次,只发送,没接收。楼主却只用了一个rx直接接收串口数据。但串口传输的时候,该口不是普通的IO口,估计是不能这样用的。你获取RX的瞬时电平状态,应该不能成功。
2.假设能获取RX电平成功,也不能直接赋值给另外一个IO作为输出状态。IO电平只是个IO状态的锁存器,它不能像其他数据一样流通到CPU里面处理,所以,输入脚电平不能直接赋值给输出口。
3.void ser_isr() interrupt 4应该是个串口接收中断函数,里面应该要清RI,不然就接收了一个byte后,就停止了。但里面你清的是TI,搞得都不知道是什么函数了。
4.发送操作 SBUF=0xaa; 另起函数,控制发送函数,就可以控制接收byte数据的频率了。当然,对方是接到一个回一个的前提下。


不知道我有没有理解错楼主的意图,呵呵,毕竟没看到原理图,不知道怎么接,只能按常规用法理所当然的说。假如讲错,请见谅!

------解决方案--------------------
中断服务程序里也加个延时程序试试看···
------解决方案--------------------
探讨
我的本意是在实验 串口工作方式0 的时候,检查下数据的移位是否正确(用P1口的一个二极管来实现)

这样可以吗?
  相关解决方案