
二进制数组不像字符串一样有结束标志,不能直接用发送数组的函数发送,
作如下修改就可以了(仿真输出结果见代码后面的图):
#include<reg52h>//注意:110592M晶振 波特率9600sbit key1=P2^0;
sbit key2=P2^1;
unsigned char code J50_2[ ]={0X00,0X00,0XFF,0X09,0X09,0XFF,0XFF,0X4B,0X22,0X01,0X03,0X01,0X0A,0X0A,0X7C,0X00}; //如何发送出去
unsigned char code J50_3[ ]={0X00,0X00,0XFF,0X09,0X09,0XFF,0XFF,0XAC,0X22,0X02,0X03,0X01,0X0A,0X0A,0X1A,0X00}; //如何发送出去
unsigned char code String1[ ]={"Test 1 Pass !\r\n"};
unsigned char code String2[ ]={"Test 2 Pass !\r\n"};
/
函数功能:延时若干毫秒
/
void delayms(unsigned int ms)
{
unsigned int i;
while(ms--)
for(i=0;i<600;i++);
}
/
函数功能:向PC发送一个字节数据
/
void SendByte(unsigned char dat)
{
SBUF=dat;
while(TI==0);
TI=0;
}
/
函数功能:向PC发字符串
/
void SendStr(unsigned char str) //第2种发送字符串函数
{
while(str!=0)
{
SendByte(str);
str++;
delayms(1); //延时 N ms
}
}
/
函数功能:向串口发n个字节数据
/
void SendnBytes(unsigned char str,unsigned int n) //发送n个字节函数
{
while(n--!=0)
{
SendByte(str);
str++;
delayms(1); //延时 N ms
}
}
/
函数功能:串口初始化
/
void UartInit(void)
{
SCON=0x50; //串口工作方式1,8位UART,波特率可变
TH2=0xFF;
TL2=0xFD; //波特率:115200 晶振=110592MHz
RCAP2H=0xFF;
RCAP2L=0xFD; //16位自动再装入值
TCLK=1;
RCLK=1;
C_T2=0;
EXEN2=0; //波特率发生器工作方式
TR2=1 ; //定时器2开始
}
/
函数功能:主函数
/
void main(void)
{
UartInit();
SendStr("How are you!\r\n");
while(1)
{
//SendStr(J50_2); //发送不成功
SendnBytes(J50_2,sizeof(J50_2)); //发送成功
if(key1==0)
{
P1=0xFE;
SendStr(String1); //发送数据
delayms(10); //10ms发送一次数据
P1=0XFF;
delayms(10);
}
//SendStr(J50_3); //发送不成功
SendnBytes(J50_3,sizeof(J50_3)); //发送成功
if(key2==0)
{
P1=0xFD;
SendStr(String2); //发送数据
delayms(10); //10ms发送一次数据
P1=0XFF;
delayms(10);
}
}
}
#include <AT89X51h>
#define uchar unsigned char
#define uint unsigned int
uchar idata trdata[]={'8','9','S','5','1',0x0d,0,0x00};
uchar idata trdata1[]={'R','I','C','H','M','C','U',0x0d,0,0x00};
main()
{
uchar i;
uint j;
SCON= 0x40; //串口方式1
PCON=0; //SMOD=0
REN=1; //允许接收
TMOD= 0x20; //定时器1定时方式2
TH1= 0xe6; //12MHz 1200波特率
TL1= 0xe6;
TR1= 1; //启动定时器
while(1)
{
i=0;
while(trdata[i]!=0x00)
{
SBUF=trdata[i];
while(TI==0);
TI=0;
i++;
}
for (j=0;j<50000;j++);
i=0;
while(trdata1[i]!=0x00)
{
SBUF=trdata1[i];
while(TI==0);
TI=0;
i++;
}
for (j=0;j<50000;j++);
}
}
通过SBUF! 一块是接受,一块发送!还要设置工作方式。
单片机(Microcontrollers)是一种集成电路芯片,是采用超大规模集成电路技术把具有数据处理能力的中央处理器CPU、随机存储器RAM、只读存储器ROM、多种I/O口和中断系统、定时器/计数器等功能(可能还包括显示驱动电路、脉宽调制电路、模拟多路转换器、A/D转换器等电路)集成到一块硅片上构成的一个小而完善的微型计算机系统,在工业控制领域广泛应用。从上世纪80年代,由当时的4位、8位单片机,发展到现在的300M的高速单片机。
修改如下:
#include<reg52h>
sbit shuru=P1^0;
unsigned char PuZh[16] = "a";
unsigned char BuZh[16] = "b";
bit flaga=0,flagb=0;
void UsartConfiguration();
void Delay10ms(unsigned int c); //误差 0us
void main()
{
unsigned char i;
UsartConfiguration();
while(1)
{
if(shuru==0 && flaga==0)
{
for(i=0; i<16; i++)
{
SBUF = PuZh[i]; //将要发送的数据放入到发送寄存器
while(!TI); //等待发送数据完成
TI=0; //清除发送完成标志位
TR1 = 0;
ES = 0;
EA = 0;
}
flaga=1;
flagb=0;
Delay10ms(500); //延时一下再发
}
else if(shuru==1 && flagb==0)
{
for(i=0; i<16; i++)
{
SBUF = BuZh[i]; //将要发送的数据放入到发送寄存器
while(!TI); //等待发送数据完成
TI=0; //清除发送完成标志位
TR1 = 0;
ES = 0;
EA = 0;
}
flaga=0;
flagb=1;
Delay10ms(500); //延时一下再发
}
}
/
函 数 名 :UsartConfiguration()
函数功能 :设置串口
输 入 : 无
输 出 : 无
/
void UsartConfiguration()
{
SCON=0X50; //设置为工作方式1
TMOD=0X20; //设置计数器工作方式2
PCON=0X80; //波特率加倍
TH1=0XFA; //计数器初始值设置,注意波特率是4800的
TL1=0XFA;
// ES=1; //打开接收中断
// EA=1; //打开总中断
TR1=1; //打开计数器
}
void Delay10ms(unsigned int c) //误差 0us
{
unsigned char a, b;
for (;c>0;c--)
{
for (b=38;b>0;b--)
{
for (a=130;a>0;a--);
}
}
}
程序采用了查询式发送,for(i=0;i<6;i++) {SendChar(askconfig[i]); },共发送了6个字符。
再去查询收到否。
这种方法,就是有问题的,发送6个字符时,就可能收到了好几个字符,而没有及时保存,完全可能丢失信息。
应该采用中断方式接收;发送,也可以用查询,也可以用中断。
方法弄清楚了,程序就容易编写、调试了。
以上就是关于单片机串口发送数组,程序如下,请帮忙修改!!!全部的内容,包括:单片机串口发送数组,程序如下,请帮忙修改!!!、单片机串口向PC传送一个unsigned int 的数据 急求程序、单片机怎么通过串口发送一串数据等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)