波特率的问题 |
小猫猫爱吃鱼 发表于 2018-7-16 10:49 是三机通信没错,主机发送地址,然后从机判别是否是他的地址,然后从机向主机发送状态消息,最后接收数据。 |
错误原因: 我把发送地址帧的按键设置成P3^0和P3^1,他们是单片机里面的接收和发送端,因为他们是控制输入输出的按钮,就产生了冲突,所以从机没有接收到信息; 后来我改了按键和波特率 从机就收到数据了,十分感谢上面的各位替我解决这个问题 谢谢! ![]() |
HC6800-ES-V2.0 发表于 2018-7-16 08:57 我波特率可能弄错了 我后来改了个波特率 再加上那个延时 程序就可以了 谢谢你的意见,嘿嘿嘿 |
ahshmj 发表于 2018-7-16 08:32 哇!谢谢你的意见 我改了下波特率就好了 可能是我的波特率设置错了 谢谢蛤o(>ω<)o |
HC6800-ES-V2.0 发表于 2018-7-16 08:09 去掉从机的usb线是说 只有主机接usb吗 |
补充一点: 算了你的波特率,好像不是4800,我还算不出你的初值FD对应什么波特率。 在晶振12M情况下,误差小的最大波特率就是4800,且要加倍,否则误差大了,接收和发送都会有较大的误差,就会接收不到或接收错误。 |
void Init(void) //9600bps@18.432MHz { PCON &= 0x7f; //波特率不倍速,清除最高位,其余保持不变 SCON = 0x50; //8位数据,可变波特率 TMOD &= 0x0f; //清除定时器1模式位 TMOD |= 0x20; //设定定时器1为8位自动重装方式,设置T1,T0保持不变。 TL1 = 0xFD; //设定定时初值,11.0592晶振,9600波特率,根据你自己的波特率确定。 TH1 = 0xFD; //设定定时器重装值 ET1 = 0; //禁止定时器1中断 TR1 = 1; //启动定时器1 } PCON的最高位是SMOD,=1是波特率加倍,=0是不加倍 另外需要注意的是通信机之间的波特率必须相同。 你可以参考一下。 |
我做过类似的实验,但只是双机。看了你的程序和接线照片,我认为有两点: 第一:程序中,主机的按键程序不对。按键这种器件,是需要消抖的,你好像有消抖的语句,但是不对嘛。 你用while是消不了抖的。你想啊:按下键,出现抖动,key1=0,但这个结果,可以有好多次的(抖动啊),所以,while是不能消抖的,应该用延时。 第二:硬件接线。应该去掉从机的USB线,这根线会占用串口,我做实验时就是这样的。应该用四根杜邦线连接VCC、GND、P30、P31。我的板子和你一模一样——普中的HC6800-ES-V2.0,下面是我的双机实验程序,你可以试试。双机实验比你的三机实验要简单很多。 /* 串口实验:单片机与单片机之间的通讯,这是主机程序 */ #include<reg51.h> #define LED P2 #define JP P1 unsigned char JZ; bit AJ; void UsartConfiguration(); void Delay10ms(unsigned int c); void KeyDown(void); void main()//主函数 { UsartConfiguration();//设置串口 Delay10ms(10); while(1) { KeyDown(); if (AJ==1) { AJ=0; SBUF = JZ; while (!TI); TI = 0; } } } void UsartConfiguration() { SCON=0X50; TMOD=0X20; PCON=0X80; TH1=0XF3;//波特率是4800的 TL1=0XF3; TR1=1; EA=1; ES=1; } void Delay10ms(unsigned int c)//延时10ms { unsigned char a, b; for (;c>0;c--) { for (b=38;b>0;b--) { for (a=130;a>0;a--); } } } void KeyDown(void) { unsigned char a=0; JP=0x0f; if(JP!=0x0f) { Delay10ms(1);//此处按键消抖 if(JP!=0x0f) { AJ=1; switch(JP) { case(0X07): JZ=0;break; case(0X0b): JZ=1;break; case(0X0d): JZ=2;break; case(0X0e): JZ=3;break; } JP=0Xf0; switch(JP) { case(0X70): JZ=JZ;break; case(0Xb0): JZ=JZ+4;break; case(0Xd0): JZ=JZ+8;break; case(0Xe0): JZ=JZ+12;break; } for (a=0;(a<50)&&(JP!=0xf0);a++)//松手消抖 { Delay10ms(1); } } } } void FSSZ(void) interrupt 4 { RI=0; LED=~SBUF; Delay10ms(1); } /* 串口实验:实验单片机与单片机通讯,此为从机程序 */ #include<reg51.h> #define SMG P0//数码管 unsigned char k; unsigned char code XSM[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f, 0x77,0x7c,0x39,0x5e,0x79,0x71};//0、1、2、3、4、5、6、7、8、9、A、b、C、d、E、F的显示码 void UsartConfiguration(); void Delay10ms(unsigned int c); void main() { UsartConfiguration(); Delay10ms(10); while(1) { } } void UsartConfiguration() { SCON=0X50; TMOD=0X20; PCON=0X80; TH1=0XF3;//波特率是4800的 TL1=0XF3; TR1=1; ES=1; EA=1; } void Delay10ms(unsigned int c)//延时10ms { unsigned char a, b; for (;c>0;c--) { for (b=38;b>0;b--) { for (a=130;a>0;a--); } } } void CKTX() interrupt 4 { RI=0; k=SBUF; SMG=XSM[k]; SBUF=k; while (!TI); TI = 0; } 程序功能是这样的:主机通过按下矩阵键盘,将键值发给从机,从机接收到后,数码管显示键值,并将键值发回主机,主机根据这个值以二进制方式显示LED灯。 |