单片机串口c程序发送数据

kuaidi.ping-jia.net  作者:佚名   更新日期:2024-06-16
用单片机串口向电脑串口调试助手发送一个字符串,用C语言编程

uchar idata SystemBuf[10]; //用于接收
uchar Rx=0; //接收数据条数
uchar code AT[]="YES,IT IS";
void UART_init (void)
{
TMOD=0x20;//用定时器1
PCON=0x00; //波特率不加倍
SCON=0x50;//串行方式1
TH1=0xFD;//9600
TL1=0xFD;//
EA=1;//
ES=1;//
TR1=1;
}
void sendchar(uchar ch) //串口送一个字节
{
SBUF=ch;
while(TI==0);
TI=0;
}
void sendstring(uchar *p) //送字符串
{

while(*p)
{
sendchar(*p);
p++;
}
}
///////
void receive(void) interrupt 4 using 1 //中断
{

if(RI)
{

if(Rx<10) //这儿最多收10个字节
{
SystemBuf[Rx]=SBUF;
Rx++;
}

RI=0;
}
}
///
void main()
{
uchar i;
UART_init();
while(1)
{
if(SystemBuf=='S')
{
sendstring(AT);
for(i=0;i<10;i++) //接收清0
{
SystemBuf[i]=0;
}
Rx=0;
}
}
}
//////////如有小错误,自己调下,手打的,大小写可能不正常,这是标准程序,直接用,

我用的新唐芯片,8051内核,跟51差不多,望采纳
void UART_Initial (void)
{
P02_Quasi_Mode; //Setting UART pin as Quasi mode for transmit
P16_Quasi_Mode; //Setting UART pin as Quasi mode for transmit

SCON_1 = 0x50; //UART1 Mode1,REN_1=1,TI_1=1
T3CON = 0x08; //T3PS2=0,T3PS1=0,T3PS0=0(Prescale=1), UART1 in MODE 1
clr_BRCK;
RH3 = HIBYTE(65536 - (1000000/u32Baudrate)-1); /*16 MHz */
RL3 = LOBYTE(65536 - (1000000/u32Baudrate)-1); /*16 MHz */
set_TR3; //Trigger Timer3
}
以上是初始化的
void Send_Data_To_UART1(UINT8 c)
{
TI_1 = 0;
SBUF_1 = c;
while(TI_1==0);
}
这个是发送
void UART_isr (void) interrupt 4 //串行中断服务程序
{
if (RI_1==1)
{ /* if reception occur */
clr_RI_1; /* clear reception flag for next reception */
Receive_Date[c] = SBUF_1;
if (Receive_Date[0] == First_Date)
{
c++;
}
else if(Receive_Date_Size > 0 && Receive_Date_Size < 4)
{
c++;
}
else if(Receive_Date[c] == Last_Date && Receive_Date_Size ==4)
{
c = 0;
Flag_Receive_One = 1;
}
else
{
c = 0;
}
}
}
接收

你好:
我也学过一点单片机,所以就特想帮你,尽管能力不一定高。
这是一个串口的程序,可能有一点不同,可供你参考,希望能帮到你,哪怕是一点点。
祝你好运
#include<reg52.h>
#define uchar unsigned char //宏定义
#define uint unsigned int
uchar a,flag,bai,shi,ge;
sbit WL=P2^0;
sbit DL=P2^1;
void delay(uint z) //延时子函数
{
uint x,y;
for(x=110;x>0;x--)
for(y=z;y>0;y--);
}
uchar code table[]={0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71,
0x00};
void display(uchar,uchar,uchar);
void init() //串口初始化子函数
{
TMOD=0x20; //定时器1工作方式1
TH1=0xfd; //装初值,设波特率为9600
TL1=0xfd;
TR1=1; //启动定时器
SM0=0; //串口工作方式选择
SM1=1; //同上
REN=1; //允许串口接收
EA=1; //开总中断
ES=1; //开串口中断
}
void main()
{
init(); //串口初始化
while(1)
{
if(flag==1)
{
ES=0; //关串口中断允许
flag=0;
SBUF=a; //发送数据
while(!TI); //等待发送完成
TI=0; //发送中断标志清0
ES=1; //开中断允许
}
bai=a/100; //分离变量
shi=a%100/10;
ge=a%10;
display(bai,shi,ge); //显示

}

}

void ser() interrupt 4 //串口中断服务函数
{
RI=0;
a=SBUF;
flag=1;

}
void display(uchar bai,uchar shi,uchar ge) //显示子函数
{
DL=1;
P1=table[bai];
DL=0;

WL=1;
P1=0xfe;
WL=0;
delay(1);

DL=1;
P1=table[shi];
DL=0;

WL=1;
P1=0xfd;
WL=0;
delay(1);

DL=1;
P1=table[ge];
DL=0;

WL=1;
P1=0xfb;
WL=0;
delay(1);

}

从你出现的问题看,你应该是发的0,1,2,3……255的数,而不是它们对应的ASCII的值。比如你要发送在串口调试工具中显示0,应该发送0的ASCII值;假设你的串口发送一字节的函数为:sendbyte(unsigned char n);
则发送函数可以这样写:
void send(void)
{
unsigned char i;
for (i=0;i<256;i++)
{
sendbyte(n/100+'0');
sendbyte(n%100/10+'0');
sendbyte(n%100%10+'0');
}
}
去掉16进制显示,就能看到0-255的显示了

可以找一个好一点的串口助手啊,找一个支持十进制的。其实16进制也没什么大碍的,ff不就是255吗

unsigned int a;
a=100;
printf(“%d”,a);//按10进制输出数据

上位机用文本格式显示

你是不会写单片机的程序还是电脑程序

  • 用单片机串口向电脑串口调试助手发送一个字符串,用C语言编程
    答:uchar idata SystemBuf[10]; //用于接收 uchar Rx=0; //接收数据条数 uchar code AT[]="YES,IT IS";void UART_init (void){ TMOD=0x20;//用定时器1 PCON=0x00; //波特率不加倍 SCON=0x50;//串行方式1 TH1=0xFD;//9600 TL1=0xFD;// EA=1;// ES=1;// TR1=1;} voi...
  • 51单片机串口通信c语言编程
    答:define uint unsigned int sbit ring=P3^7;sbit CASE1=P2^0;sbit CASE2=P2^1;sbit CASE3=P2^2;sbit CASE4=P2^3;uchar se=0,re=0;uchar temp=0;void wait(uint cnt){ while(--cnt);} //串口发送程序 void send(uchar se){ SBUF=se; //发送数据 while(TI == 0);TI = 0;...
  • 求一段STC89C52单片机c语言程序,要求能通过串口通信由电脑向单片机发送...
    答:sbit led = P1^0;sbit key = P0^0;sbit out1= P0^1;sbit out2= P0^2;uint run_cnt;uchar temp;//--- void send_one_byte(unsigned char tad ){ TI=0;SBUF=tad;//发送数据 os_wait2(K_TMO,1);while(TI==0);TI=0;} //--- void init_uart(void){ TMOD|=0x20...
  • 求一个基于51单片机的C语言程序,要求从串口接收一组数据,然后将其通过...
    答:void Init_Com(void)//功能:串口初始化,波特率9600,方式1 { TMOD = 0x20;PCON = 0x00;SCON = 0x50;TH1 = 0xFd;TL1 = 0xFd;TR1 = 1;} void main()//主程序功能:实现接收数据并把接收到的数据原样发送回去/// { Init_Com();//串口初始化 // P1=0xf0;while(1){ if ( RI )...
  • ...程序目的:通过串口控制单片机,如发送0x00 0
    答:void SendOneByte(unsigned char c)//发送字节 { SBUF = c; //赋值给SBUF启动发送 while(!TI); //等待发送完成 TI = 0; //清零发送完成标志位 } void SendString(unsigned char *p)//发送字符串 { while(*p) //如果p的内容不等于0 { SendOneByte(*p++); //从串口发送一字节数据,并且...
  • 51单片机通过串口实现数据的发送与接收程序
    答:执行相应的动作;程序一般为:void UART_ISR() interrupt x using y { ;串口中断处理函数 } x - 单片机的C51中断号 y - 指定使用的当前工作寄存器组号(0-3 PSW中的RS0,RS1组合)3,主程序 int main(void){ Init_UART();while(1){ ;//数据发送函数 } } ...
  • 怎么用串口发送一个数组?用电脑上的串口助手发送,单片机接收后再发送...
    答:怎么用串口发送一个数组?用电脑上的串口助手发送,单片机接收后再发送给电脑?  我来答 1个回答 #热议# 作为女性,你生活中有感受到“不安全感”的时刻...for(i=0;i<16;i++) //循环接收16字节字节数据 { while(!RI); table[i]=SBUF; RI=0; //清标志位 } } }再将用查询法数组中的数据循环发送...
  • 求单片机串口C语言程序,要求可以发送一个数据到PC机,可以接受PC机的字符...
    答:不知道你是不是用的51单片机,给你一个程序参考一下吧。/ 函数功能:在#MCU2的数码管上显示收到的学号后3位 若与自己的相符合,则发送Right!否则发送Wrong!默认学号为123 / include<reg52.h> include<absacc.h> / 总线地址定义区 / define LED_DIG XBYTE[0xD000] //定义数码管的段选总线...
  • 单片机通过串口发送12位的十六进制数据,先发高4位,后发低8位,用C#做...
    答:发送:int ii;char i;ii=data;//待发送数据 i=ii>>8;//取高8位 i&=0x0f;//取高4位 putchar(i);//发送高4位 i=ii&0xff;//取低8位 putchar(i);//发送低8r 接收:int ii;char i;i=getchar();//收到高4位 ii=i;ii<<=8;//ii左移8位 i=getchar();ii...
  • 单片机串行口发送多位数据程序
    答:想要发送多次,来传送一个数据,就必须自己制定协议。一个简单的方法是:把“两个八位二进制数”先拆成“四个四位二进制数”,分成四次进行传送。每次传送,用低四位来表示“一个四位二进制数”,用高四位来表示“第几个”。接收方再根据高四位的信息,把低四位拼凑成“两个八位二进制数”。这...