哪位大哥帮忙看看这个,实在不知道问题出在哪?(可能串口程序存在问题)
本程序完成的内容为,数据经AD采样后再P1端口显示,同时向虚拟串口发送数据。遇到问题:P1端口显示转换数据正常,但用串口助手看收到的数不对。例如P1端口显示80;串口调试助手就显示20;- #include<reg52.h>
- #include<intrins.h>
- #define uchar unsigned char
- #define uint unsigned int
- //AD管脚定义
- sbit CLK=P2^0;
- sbit DI=P2^2;
- sbit DO=P2^3;
- //译码器管脚定义
- sbit a=P2^4;
- sbit b=P2^5;
- sbit c=P2^6;
- sbit e=P2^7;
- void delay(uint z); //函数声明
- void init()
- {
- //串口输chu
- SCON=0X40;
- ES=1;//允许串口中断
- //定时器设置
- TMOD=0X20;//定时器工作模式选择方式2 自动装填
- TH1=0XF3; //TH1与TL1为定时器中T1寄存器的高8低8位;设置波特率用
- TL1=0XF3;
- PCON=0X80;
- EA=1;//允许总中断
- TR1=1;//开启T1定时器
- }
- void delay(uint z)
- {
- uint i = 0;
- uint j = 0;
- for(i=0;i<z;i++)
- for(j=0;j<114;j++);
- }
- uchar read_AD(uint n)
- { int num[4][4]={
- {1,1,0,0} ,//CH0
- {1,1,1,0} ,//CH1
- {1,1,0,1} ,//CH2
- {1,1,1,1} ,//CH3
- } ;
- uchar i,out1;
- out1=0;
- //加入译码器后CS由译码器控制 CS=0;
- _nop_();
- CLK=0;
- // DO=0;
- DI=num[n][0];_nop_(); CLK=1;_nop_(); CLK=0;
- DI=num[n][1];_nop_(); CLK=1;_nop_(); CLK=0;
- DI=num[n][2];_nop_(); CLK=1;_nop_(); CLK=0;
- DI=num[n][3];_nop_(); CLK=1;_nop_(); CLK=0;
- _nop_();_nop_();_nop_();
- for(i=0;i<8;i++)//转换8位二进制数
- {
- CLK=1;_nop_();
- CLK=0;_nop_();//下降沿开始数据转
- if(DO)
- out1=out1<<1|DO;
- else
- out1=out1<<1;
- }
- //加入译码器后CS由译码器控制 CS=1;
- return out1;
- }
- void main()
- {
- uint i,j;
- uchar s;
- uint m[8][3]={
- {0,0,0},//YO
- {0,0,1},//Y1
- {0,1,0},//Y2
- {0,1,1},//Y3
- {1,0,0},//Y4
- {1,0,1},//Y5
- {1,1,0},//Y6
- {1,1,1} //Y7
- }; //译码器控制
- init(); //串口初始化
-
- while(1)
- {
- e=0;//译码器U1工作
- for(j=0;j<1;j++) //循环使各个AD工作
- {
- a=m[j][2];
- b=m[j][1];
- c=m[j][0];
- for(i=0;i<1;i++)//AD通道片选读取
- {
- ES=0;
- P1=read_AD(i);
- s=read_AD(i);
- SBUF=s;
- while(!TI);
- TI=0;
- ES=1;
- }
- }
- e=1;//译码器U1工作
- }
- }
复制代码
|