找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 6020|回复: 12
收起左侧

关于串口通信传输数据不正确的问题

[复制链接]
ID:440482 发表于 2019-4-20 10:20 | 显示全部楼层 |阅读模式
30黑币
哪位大哥帮忙看看这个,实在不知道问题出在哪?(可能串口程序存在问题)
本程序完成的内容为,数据经AD采样后再P1端口显示,同时向虚拟串口发送数据。遇到问题:P1端口显示转换数据正常,但用串口助手看收到的数不对。例如P1端口显示80;串口调试助手就显示20;
  1. #include<reg52.h>
  2. #include<intrins.h>
  3. #define uchar unsigned char
  4. #define uint unsigned int
  5. //AD管脚定义
  6. sbit CLK=P2^0;
  7. sbit DI=P2^2;
  8. sbit DO=P2^3;
  9. //译码器管脚定义
  10. sbit a=P2^4;
  11. sbit b=P2^5;
  12. sbit c=P2^6;
  13. sbit e=P2^7;

  14. void delay(uint z);        //函数声明
  15. void init()
  16. {
  17.                 //串口输chu
  18.                 SCON=0X40;
  19.                 ES=1;//允许串口中断
  20.                 //定时器设置
  21.                 TMOD=0X20;//定时器工作模式选择方式2        自动装填
  22.                 TH1=0XF3; //TH1与TL1为定时器中T1寄存器的高8低8位;设置波特率用
  23.                 TL1=0XF3;
  24.                 PCON=0X80;
  25.                 EA=1;//允许总中断
  26.                 TR1=1;//开启T1定时器
  27. }
  28. void delay(uint z)
  29. {
  30.   uint i = 0;
  31.         uint j = 0;
  32.         for(i=0;i<z;i++)
  33.            for(j=0;j<114;j++);
  34. }
  35. uchar read_AD(uint n)
  36. {         int num[4][4]={
  37.                                         {1,1,0,0} ,//CH0
  38.                                         {1,1,1,0} ,//CH1
  39.                                         {1,1,0,1} ,//CH2
  40.                                         {1,1,1,1} ,//CH3
  41.                                         }        ;
  42.         uchar i,out1;
  43.         out1=0;
  44. //加入译码器后CS由译码器控制    CS=0;
  45.         _nop_();
  46.     CLK=0;
  47. //        DO=0;
  48.     DI=num[n][0];_nop_(); CLK=1;_nop_(); CLK=0;
  49.     DI=num[n][1];_nop_(); CLK=1;_nop_(); CLK=0;
  50.     DI=num[n][2];_nop_(); CLK=1;_nop_(); CLK=0;
  51.     DI=num[n][3];_nop_(); CLK=1;_nop_(); CLK=0;
  52.         _nop_();_nop_();_nop_();       
  53. for(i=0;i<8;i++)//转换8位二进制数
  54. {                
  55.         CLK=1;_nop_();
  56.         CLK=0;_nop_();//下降沿开始数据转
  57.         if(DO)
  58.                 out1=out1<<1|DO;
  59.         else
  60.                 out1=out1<<1;  

  61. }       
  62. //加入译码器后CS由译码器控制         CS=1;
  63.         return out1;
  64. }
  65. void main()
  66. {       
  67. uint i,j;
  68. uchar s;

  69. uint m[8][3]={
  70.                           {0,0,0},//YO
  71.                           {0,0,1},//Y1
  72.                           {0,1,0},//Y2
  73.                           {0,1,1},//Y3
  74.                           {1,0,0},//Y4
  75.                           {1,0,1},//Y5
  76.                           {1,1,0},//Y6
  77.                           {1,1,1} //Y7
  78.                                                 }; //译码器控制
  79.                         init(); //串口初始化
  80.                                                  
  81.         while(1)
  82.         {       
  83.                 e=0;//译码器U1工作
  84.                 for(j=0;j<1;j++) //循环使各个AD工作
  85.                 {
  86.                         a=m[j][2];
  87.                         b=m[j][1];
  88.                         c=m[j][0];
  89.                         for(i=0;i<1;i++)//AD通道片选读取       
  90.                         {
  91.                                 ES=0;
  92.                                 P1=read_AD(i);
  93.                                 s=read_AD(i);
  94.                                 SBUF=s;
  95.                                 while(!TI);
  96.                                 TI=0;       
  97.                                 ES=1;
  98.                         }
  99.                 }
  100.                         e=1;//译码器U1工作
  101.         }               
  102. }
复制代码


串口.png
串口1.png
回复

使用道具 举报

ID:440482 发表于 2019-4-20 10:21 | 显示全部楼层
不要沉呀!自顶
回复

使用道具 举报

ID:440482 发表于 2019-4-20 10:27 | 显示全部楼层
模拟单片机晶振为12M
回复

使用道具 举报

ID:434390 发表于 2019-4-20 12:35 | 显示全部楼层
你读了2次转换数据,改成1次就OK了
P1=read_AD(i);
s=read_AD(i);

修改如下:
  s=read_AD(i);
  P1=s;

回复

使用道具 举报

ID:123289 发表于 2019-4-20 16:56 | 显示全部楼层
要保证收、发的字符格式一样。如:同是ASCII码、同是HEX格式……
回复

使用道具 举报

ID:440482 发表于 2019-4-21 08:18 | 显示全部楼层
snni00 发表于 2019-4-20 12:35
你读了2次转换数据,改成1次就OK了
P1=read_AD(i);
s=read_AD(i);

和这个应该没关系
回复

使用道具 举报

ID:440482 发表于 2019-4-21 08:29 | 显示全部楼层
yzwzfyz 发表于 2019-4-20 16:56
要保证收、发的字符格式一样。如:同是ASCII码、同是HEX格式……

没懂,请指点。应该发送的是HEX格式的,接受也是按HEX显示。但它数据显示还是不对,我根据AD转换后现将其在P1口显示,然后再对比的,两个数差太多了
回复

使用道具 举报

ID:440482 发表于 2019-4-21 09:51 | 显示全部楼层
我这次不加译码器工作后,传输数据就正确了,本来译码器只是进行片选,但为什么加入译码器进行片选就不行了呢?求指点
回复

使用道具 举报

ID:467275 发表于 2019-4-21 14:37 | 显示全部楼层
晶振是否正确匹配
回复

使用道具 举报

ID:434390 发表于 2019-4-21 16:21 | 显示全部楼层
lizzz 发表于 2019-4-21 08:18
和这个应该没关系

如果和确认和这个没关系,那有2点需要确认,常量->P1是否是你输出的常量
回复

使用道具 举报

ID:434390 发表于 2019-4-21 16:26 | 显示全部楼层
lizzz 发表于 2019-4-21 08:18
和这个应该没关系

如果确实和这个没有关系,那就需要确认
1.预定值(常量)输出到P1,你看到的是否是预定值
2.预定值(常量)输出SBUF,串口端显示是否是预定值
通过这2点判断问题在P1,还是在串口
回复

使用道具 举报

ID:440482 发表于 2019-4-22 11:35 | 显示全部楼层
snni00 发表于 2019-4-21 16:26
如果确实和这个没有关系,那就需要确认
1.预定值(常量)输出到P1,你看到的是否是预定值
2.预定值(常 ...

问题应该在串口,但是我不加译码器控制时,串口接受的数又正常了。。。。。
回复

使用道具 举报

ID:440482 发表于 2019-4-22 11:35 | 显示全部楼层

晶振正确
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表