51串行口 工作方式0问题

xingjutongxin   2010-4-22 20:45 楼主

  1. #include
  2. sbit d1=P1^1;                                //接有发光二极管,低电平时灯亮
  3. sbit rx=P3^0;
  4. void delayms(unsigned int x)                //延时x毫秒
  5. {
  6.         unsigned int i,j;
  7.         for(i=0;i
  8.         {
  9.                 for(j=110;j>0;j--);
  10.         }
  11. }

  12. main()
  13. {
  14.         SCON=0;                                                //使串口工作方式0
  15.         EA=1;
  16.         ES=1;
  17.         TI=0;
  18.         while(1)
  19.         {
  20.                 SBUF=0xaa;
  21.                 d1=rx;                                //想使d1的状态受到RXD引脚上信号的控制,但没有成功
  22.                 delayms(1);                        //二极管一直没亮,如果一直亮还可能是频率太快了,但现在灯一直没
  23.                                                 //亮,请问是怎么回事?
  24.         }
  25. }

  26. void ser_isr() interrupt 4
  27. {
  28.         if(TI==1)
  29.                 TI=0;
  30. }


问题在注释里,谢谢了

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

回复评论 (15)

你串口的波特率没设啊,那怎么能使串口正常工作呢
点赞  2010-4-22 20:59
方式0:波特率固定为f/12,应该不用自己设置了吧
点赞  2010-4-22 21:04
d1=rx;(P1^0=P3^0),51单片机能这么赋值吗?我都不记得了,我觉得好像只有FPGA才能连线这么定义吧
点赞  2010-4-23 09:39
同意LS的   你还不如连一根线  还好点。。。
点赞  2010-4-23 09:50
p3.0直接接指示灯啊
点赞  2010-4-23 10:02
这个代码好怪,
   1.这个是串口实验,但是SBUF只用了一次,只发送,没接收。楼主却只用了一个rx直接接收串口数据。但串口传输的时候,该口不是普通的IO口,估计是不能这样用的。你获取RX的瞬时电平状态,应该不能成功。
   2.假设能获取RX电平成功,也不能直接赋值给另外一个IO作为输出状态。IO电平只是个IO状态的锁存器,它不能像其他数据一样流通到CPU里面处理,所以,输入脚电平不能直接赋值给输出口。
   3.void ser_isr() interrupt 4应该是个串口接收中断函数,里面应该要清RI,不然就接收了一个byte后,就停止了。但里面你清的是TI,搞得都不知道是什么函数了。
   4.发送操作 SBUF=0xaa; 另起函数,控制发送函数,就可以控制接收byte数据的频率了。当然,对方是接到一个回一个的前提下。


不知道我有没有理解错楼主的意图,呵呵,毕竟没看到原理图,不知道怎么接,只能按常规用法理所当然的说。假如讲错,请见谅!
点赞  2010-4-23 10:40
引用: 引用 3 楼 huleide 的回复:

d1=rx;(P1^0=P3^0),51单片机能这么赋值吗?我都不记得了,我觉得好像只有FPGA才能连线这么定义吧


我也不太清楚,等待高人来解答
点赞  2010-4-24 16:11
引用: 引用 6 楼 peasant_lee 的回复:
   1.这个是串口实验,但是SBUF只用了一次,只发送,没接收。楼主却只用了一个rx直接接收串口数据。但串口传输的时候,该口不是普通的IO口,估计是不能这样用的。你获取RX的瞬时电平状态,应该不能成功。

   2.假设能获取RX电平成功,也不能直接赋值给另外一个IO作为输出状态。IO电平只是个IO状态的锁存器,它不能像其他数据一样流通到CPU里面处理,所以,输入脚电平不能直……


工作方式0,当然和其他的有点不一样了
点赞  2010-4-24 16:21
加个定时器中断吧。。。
点赞  2010-4-24 16:58
我的本意是在实验 串口工作方式0 的时候,检查下数据的移位是否正确(用P1口的一个二极管来实现)

这样可以吗?
点赞  2010-4-24 17:24
如何将使用SBUF发送一个字节的8位数据存入数组?
点赞  2010-4-24 22:18
中断服务程序里也加个延时程序试试看···
点赞  2010-4-24 22:54
引用: 引用 10 楼 wangjun403 的回复:
我的本意是在实验 串口工作方式0 的时候,检查下数据的移位是否正确(用P1口的一个二极管来实现)

这样可以吗?

但为什么不接收完一个字节后一起判断,而非要一位一位地判断?难道时效性有这么重要吗?
点赞  2010-4-24 23:40

  1. #ifndef _SERIAL_SHIFT_H_
  2. #define _SERIAL_SHIFT_H_
  3. #include "c51basedef.h"

  4. //注意收发期间中断对此的影响
  5. void InitSerialShift(BOOL bTx);
  6. void Transmmit(const BYTE* pData, BYTE nSize);
  7. BOOL Recive(BYTE* pData, BYTE nSize);


  8. #endif

  9. ---------------------------------------------------------------------------
  10. #include "serialshift.h"
  11. #include "chiptypedef.h"

  12. void InitSerialShift(BOOL bTx)
  13. {
  14.         if(bTx)
  15.         {
  16.                 SCON = 0x00; //工作方式0

  17.         }
  18.         else
  19.         {
  20.                 SCON = 0x10;  //REN = 1,接收
  21.         }

  22. }


  23. void Transmmit(const BYTE* pData, BYTE nSize)
  24. {
  25.         idata BYTE i = 0;

  26. //        if(pData == NULL)  考虑到效率,去掉判断
  27. //                return FALSE;

  28.         for(i = 0; i < nSize; i++)
  29.         {
  30.                 SBUF = pData[i];
  31.                 while(!TI);
  32.                 TI = 0;
  33.         }

  34. }

  35. BOOL Recive(BYTE* pData, BYTE nSize)
  36. {
  37.         BYTE i = 0;
  38. //        if(pData == NULL)  考虑到效率,去掉判断
  39. //                return FALSE;

  40.         for(i = 0; i < nSize; i++)
  41.         {
  42.                 while(!RI);
  43.                 pData[i] = SBUF;
  44.                 RI = 0;
  45.        
  46.         }

  47.    return TRUE;
  48. }       
点赞  2010-4-24 23:43
  1. #ifndef _C51_BASE_DEF_H_
  2. #define _C51_BASE_DEF_H_
  3. #include

  4. #define TRUE 1
  5. #define FALSE 0

  6. typedef unsigned char BYTE;
  7. typedef unsigned int WORD;
  8. typedef unsigned long DWORD;
  9. typedef float FLOAT;         
  10. typedef char CHAR;
  11. typedef unsigned char UCHAR;
  12. typedef int INT;
  13. typedef unsigned int UINT;
  14. typedef unsigned long ULONG;
  15. typedef UINT WPARAM;
  16. typedef UINT LPARAM;
  17. typedef UINT LRESULT;
  18. typedef void VOID;
  19. typedef const CONST;
  20. typedef void *PVOID;
  21. typedef void *LPVOID;
  22. typedef const UCHAR* LPCSTR;
  23. typedef bit BOOL;




  24. #define MAKEWORD(lo, hi)      ((WORD)(((BYTE)(lo)) | ((WORD)((BYTE)(hi))) << 8))
  25. #define MAKEDWORD(lo, hi)     ((DWORD)(((WORD)(lo)) | ((DWORD)((WORD)(hi))) << 16))
  26. #define LOWORD(l)           ((WORD)(l))
  27. #define HIWORD(l)           ((WORD)(((DWORD)(l) >> 16) & 0xFFFF))
  28. #define LOBYTE(w)           ((BYTE)(w))
  29. #define HIBYTE(w)           ((BYTE)(((WORD)(w) >> 8) & 0xFF))
  30. #define MAX(a, b)           (((a) > (b)) ? (a) : (b))
  31. #define MIN(a, b)    (((a) < (b)) ? (a) : (b))


  32. #define SET_STATE_FLAG(state, mask) ((state) |= (mask))
  33. #define        RESET_STATE_FLAG(state, mask) ((state) &= ~(mask))
  34. #define TEST_STATE_FLAG(state, mask) (((state) & (mask)) != 0)        //需要保证是逻辑结果



  35. #define TEST_BIT(b, offset) (1 & ((b) >> (offset)))
  36. #define SET_BIT(b, offset) ((b) |= (1 << (offset)))
  37. #define RESET_BIT(b, offset) ((b) &= (~(1 << (offset))))

  38. #define ELEMENT_NUM(array) (sizeof(array) / sizeof(array[0]))



  39. //将BCD码变为十进制,如将0x23变为23
  40. //注意:高四位和低四位均不能大于9
  41. #define BCD_TO_DECIMAL(bcd) ((BYTE)((((BYTE)(bcd)) >> 4) * 10 + (((BYTE)(bcd)) & 0x0f)))
  42. #define DECIMAL_TO_BCD(decimal) ((BYTE)(((((BYTE)(decimal)) / 10) << 4) | ((BYTE)(decimal)) % 10))

  43. #define NOP() _nop_()
  44. #define BYTE_ROTATE_LEFT(b, n) _crol_(b, n)
  45. #define BYTE_ROTATE_RIGHT(b, n) _cror_(b, n)       
  46. #define WORD_ROTATE_LEFT(w, n) _irol_(w, n)
  47. #define WORD_ROTATE_RIGHT(w, n) _iror_(w, n)
  48. #define DWORD_ROTATE_LEFT(dw, n) _lrol_(dw, n)
  49. #define DWORD_ROTATE_RIGHT(dw, n) _lror_(dw, n)

  50. #define ENABLE_ALL_INTERRUPTS() (EA = 1)
  51. #define DISABLE_ALL_INTERRUPTS() (EA = 0)

  52. #endif
点赞  2010-4-24 23:44
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复