51串行口 工作方式0有关问题
51串行口 工作方式0问题C/C++ code#includereg52.hsbit d1P1^1//接有发光二极管,低电平时灯亮sbit rx
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数据的频率了。当然,对方是接到一个回一个的前提下。
不知道我有没有理解错楼主的意图,呵呵,毕竟没看到原理图,不知道怎么接,只能按常规用法理所当然的说。假如讲错,请见谅!
[解决办法]中断服务程序里也加个延时程序试试看···
[解决办法]