导航:首页 > 操作系统 > 单片机串口通信c程序

单片机串口通信c程序

发布时间:2022-08-08 03:21:42

单片机串口通信C语言编程问题

你看看接收并回传给串口助手的数据是否正确
if(Rev_Data == "t")
{
Sector_erase(0x2000); //扇区擦除。。。。把这一句注释掉,再看看结果
P1 = 0x55;
delay(5);
flag = 1;
i = 0;
}

㈡ C语言51单片机串口通信程序求教

串口通讯,首先设置波特率,再设置串口模式,之后就可以收发数据了。比如:

init()
{
TMOD=0x20;
TH1=0xfd;
TL1=0xfd;
TR1=1;
SCON=0x50;
}
send(unsignedchardat)
{
SBUF=dat;
while(TI==0);
TI==0;
}
unsignedcharrecive()
{
unsignedchardd;
if(RI)
{
dd=SBUF;
RI=0;
}
return(dd);
}

㈢ 单片机串口通信C程序

"TMOD = 0x2f;"改成"TMOD = 0x20;"试试,另外还有你要确保你的单片机的晶振是11.059MHz的,你的波特率设置是没有问题的。

㈣ 单片机串行口通信程序C语言

/*
程序把接收的数据发送出去,波速率为2400。
打开串口调试软件,把波速率设置为2400,
向板发送一个字节数据,软件应能接收到同样的数据。

*/

#include<reg51.h>
void delayms(unsigned int i);
unsigned char b;
void rs_dmx() interrupt 4 using 2//串口中断服务程序
{

b=SBUF;//接收数据

SBUF=b;//把接收的数据发送出去
while(TI==0);TI=0;
delayms(1);

RI=0;
}
main()
{
//write(1,60);
//b=read(1);
EA=1;
// TR0=1;
// ET0=1;
// TMOD=0X01;

TMOD=0x21;

TH1=0xF3;//波速率为2400
TL1=0xf3;
TR1=1;
EA=1;
SCON=0XD0;

ES=1;

while(1)
{

}

}

void delayms(unsigned int i)
{
unsigned int j;
for(;i>0;i--)
for(j=100;j>0;j--);
}

自己改波特率,该程序通过单片机与串口助手相互通信

㈤ 要个计算机与单片机的串口通信上位机C语言程序

兄弟,下面是我自己写的,希望给你帮助,把数据用Send_One_Uart()这个函数直接发送到串口就行了!最后求采纳,哈哈!
//-----头文件
#include
//-----定义全局变量
unsigned
char
Temp;
/***************************************************
**
函数名称:
UART_Init
**
功能描述:
串口初始化函数
**

入:无
**

出:

**

明:

****************************************************/
void
UART_Init(void)
{
SCON
=
0x50;
//-----SCON:
模式
1,
8-bit
UART,
使能接收
TMOD
|=
0x20;
//-----TMOD:
timer
1,
mode
2,
8-bit
重装
TH1
=
0xFD;
//-----TH1:
重装值
9600
波特率
晶振
11.0592MHz
TR1
=
1;
//-----TR1:
timer
1
打开
ES
=
1;
//-----打开串口中断
EA
=
1;
//-----打开总中断
}
/***************************************************
**
函数名称:
SendByte
**
功能描述:
发送字节函数
**

入:无
**

出:

**

明:

****************************************************/
void
SendByte(unsigned
char
dat)
{
SBUF
=
dat;
while(!TI);
TI
=
0;
}
/***************************************************
**
函数名称:
SendStr
**
功能描述:
发送字符串函数
**

入:无
**

出:

**

明:

****************************************************/
void
SendStr(unsigned
char
*s)
{
while(*s!='\0')
{
SendByte(*s);
s++;
}
}
/***************************************************
**
函数名称:
main
**
功能描述:
主函数
**

入:无
**

出:

**

明:

****************************************************/
void
main
(void)
{
UART_Init();
//-----串口初始化
while(1)
{
if(Temp=='H'&&'i')
{
Temp=0;
SendStr("hello");
}
}
}
/***************************************************
**
函数名称:
UART_SER
**
功能描述:
串口中断服务子函数
**

入:无
**

出:

**

明:

****************************************************/
void
UART_SER
(void)
interrupt
4
//-----串行中断服务程序
{
if(RI)
//-----判断是接收中断产生
{
RI=0;
//-----标志位清零
Temp=SBUF;
//-----读入缓冲区的值
}
}

㈥ 求单片机串口通信C程序

我也来说两有句。

1.楼主首先要确定是硬件没有问题,先用232直接与电脑通迅看能否正常工作,用单片机接232芯片再接电脑就可用串口调试助手来看了。
1>用示波器测232芯片的接收与发送/或测单片机的RX/TX引脚;
2>可直接用printf来输出,包涵相应的头文件#include <stdio.h>,设置好波特率即可,注意波特率一定要设置正确;如:printf (" This is a test! \n");

2.传一个51串口中断接收与发送的例子

/*-----------------------------------------------------*
*文件描述:本文件包含了串行通信的4子程序,分别为: *
*(1)SCISend1:串行发送1字节 *
*(2)SCISendN:串行发送n字节 *
*(3)SCIRe1:串行接收1字节 *
*(4)SCIReN:串行接收n字节 *
*-------------《嵌入式应用技术基础教程》--------------*/
//[以下为子程序源代码]
//[包含头文件]
#include "SCI.h"
/*SCISend1:串行发送1个字节-----------------------------*
*功 能:串行发送1个字节 *
*参 数:要发送的数据 *
*返 回:无 *
*-----------------------------------------------------*/

void SCISend1(unsigned char o)
{
ReSendDataR=o;
while(1)
{
//判断ReStatusR的SendIntBit位是否为1,是1就清0
if (SendIntBit!=0)
{
SendIntBit=0;
break;
}
}
}

/*SCISendN:串行发送N个字节-----------------------------*
*功 能:发送数组中的N个字节数据 *
*参 数:待发送的数据字节数及其要存放的数组首地址 *
*返 回:无 *
*-----------------------------------------------------*/

void SCISendN(unsigned char n,unsigned char ch[])
{ int i;
for(i=0;i<n;i++)
{
SCISend1(ch[i]);

}
}

/*SCIRe1:串行收一个字节数据----------------------------*
*功 能:从串行口接收1个字节的数据 *
*参 数:标志指针p *
*返 回:接收到的数据(若接收失败,返回0xff) *
*说 明:参数*p带回接收标志=0收到数据,=1未收到数据 *
*-----------------------------------------------------*/

unsigned char SCIRe1(unsigned char *p)
{ unsigned int k;
unsigned char i;
//ReStatusR的ReIntBit位为1表示可接收数据
for(k=0;k<0xfbbb;k++)
{
if (ReIntBit!=0)
{i=ReSendDataR;
*p=0x00;
ReIntBit=0;
break;}
}
if(k>=0xfbbb)
{i=0xff;
*p=0x01;}
return i; //返回接收到的数据
}

/*SCIReN:HC08串行接收N个字节---------------------------*
*功 能:接收N个字节数据,并存放在ch数组中 *
*参 数:待接收的数据字节数及其存放的数组首地址 *
*返 回:接收标志=0收到数据,=1未收到数据 *
*-----------------------------------------------------*/

unsigned char SCIReN(unsigned char n,unsigned char ch[])
{int m;
unsigned char fp;
m=0;
while (m<n)
{
ch[m]=SCIRe1(&fp);
if (fp==1) return 1;

m++;
}

return 0;
}

//**************************中断方式*************************************

void main()
{
EA=0; // 开中断
InitSerial(); //初始化
EA=1; // 关中断

ES=1; //允许串口接收中断

//主循环
while(1);

}

/*
**************************************************************************************
* uart初始化
*
**************************************************************************************
*/

void InitSerial(void)
{
TMOD=TMOD&0x0F;
TMOD=TMOD|0x20; //定时器1 定时方式2
TL1=0xFA;TH1=0xFA; //4800 11.0592MHz fosc

SCON=0x50; //串行方式1 允许接收
PCON=0x00; //波特率不增倍
TR1=1; //启动定时器1
}

//增加个人说明:功能-->将从串口接收到的数据发送出去.注意波特率的设置.
//如果在PC终端一次性将"abcdefghi........"一连串的字符发送会出现什么情况?会不会乱?
//答案是不会,因为当收到一字节,如'a'时,立即将'a'发送出去了,此时SBUF就可以接收新的数据,所以不会乱.....

void Int1(void) interrupt 4 // interrupt 4 表示串口中断
{

unsigned char SerialBuff[1]; //存放接收数据的数组
unsigned char i;
EA = 0; // 开中断

//接收1个数据
i=SCIReN(1,SerialBuff);
//若收到数据,则发送接到的数据
if(i==0) SCISendN(1,SerialBuff);

EA = 1; // 关中断

}

以上回答希望你满意

㈦ 两片单片机通过串口一发一收的C语言例程

/*甲机串口程序:甲机向乙机发送控制命令字符,甲机同时接收乙机发送的数字,并显示在数码管上。*/

#include<reg51.h>

#define uchar unsigned char

#define uint unsigned int

sbit LED1=P1^0;

sbit LED2=P1^3;

sbit K1=P1^7;

uchar Operation_No=0; //操作代码

//数码管代码

uchar codeDSY_CODE[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};

//延时

void DelayMS(uint ms)

{

uchari;

while(ms--)for(i=0;i<120;i++);

}

//向串口发送字符

void Putc_to_SerialPort(uchar c)

{

SBUF=c;

while(TI==0);

TI=0;

}

//主程序

void main()

{

LED1=LED2=1;

P0=0x00;

SCON=0x50; //串口模式1,允许接收

TMOD=0x20; //T1工作模式2

PCON=0x00; //波特率不倍增

TH1=0xfd;

TL1=0xfd;

TI=RI=0;

TR1=1;

IE=0x90; //允许串口中断

while(1)

{

DelayMS(100);

if(K1==0) //按下K1时选择操作代码0,1,2,3

{

while(K1==0);

Operation_No=(Operation_No+1)%4;

switch(Operation_No) //根据操作代码发送A/B/C或停止发送

{

case0: Putc_to_SerialPort('X');

LED1=LED2=1;

break;

case1: Putc_to_SerialPort('A');

LED1=~LED1;LED2=1;

break;

case2: Putc_to_SerialPort('B');

LED2=~LED2;LED1=1;

break;

case3: Putc_to_SerialPort('C');

LED1=~LED1;LED2=LED1;

break;

}

}

}

}

//甲机串口接收中断函数

void Serial_INT() interrupt 4

{

if(RI)

{

RI=0;

if(SBUF>=0&&SBUF<=9)P0=DSY_CODE[SBUF];

elseP0=0x00;

}

}

/*乙机程序接收甲机发送字符并完成相应动作:乙机接收到甲机发送的信号后,根据相应信号控制LED完成不同闪烁动作。*/

#include<reg51.h>

#define uchar unsigned char

#define uint unsigned int

sbit LED1=P1^0;

sbit LED2=P1^3;

sbit K2=P1^7;

uchar NumX=-1;

//延时

void DelayMS(uint ms)

{

uchari;

while(ms--)for(i=0;i<120;i++);

}

//主程序

void main()

{

LED1=LED2=1;

SCON=0x50; //串口模式1,允许接收

TMOD=0x20; //T1工作模式2

TH1=0xfd; //波特率9600

TL1=0xfd;

PCON=0x00; //波特率不倍增

RI=TI=0;

TR1=1;

IE=0x90;

while(1)

{

DelayMS(100);

if(K2==0)

{

while(K2==0);

NumX=++NumX%11; //产生0~10范围内的数字,其中10表示关闭

SBUF=NumX;

while(TI==0);

TI=0;

}

}

}

void Serial_INT() interrupt 4

{

if(RI) //如收到则LED则动作

{

RI=0;

switch(SBUF)//根据所收到的不同命令字符完成不同动作

{

case'X': LED1=LED2=1;break; //全灭

case'A': LED1=0;LED2=1;break; //LED1亮

case'B': LED2=0;LED1=1;break; //LED2亮

case'C': LED1=LED2=0; //全亮

}

}

}

㈧ 怎样编写单片机的串口通信的程序,一般的步骤是怎么样

编写串口通讯程序步骤为:

1、设置波特率

2、设置串口工作方式

3、收发数据。

比如:

main()
{
unsignedchardat;
TMOD=0x20;
TH1=0xfd;
TL1=0xfd;
TR1=1;
SCON=0x50;
while(1)
{
while(RI==0);
RI=0;
dat=SBUF;
SBUF=~dat;
while(TI==0)
TI=0;
}
}

㈨ 急!!!单片机C语言实现串口通信编程

以下是我刚改的程序编译成功了
请参考

#include"reg51.h"
//定义全局变量
unsigned char data_10[10]={0,0,0,0,0,0,0,0,0,0};
unsigned char Time_50ms,count;
bit flag=0;
bit data_flag=0;
/*********************************************************************************************
函数名:UART串口初始化函数
调 用:UART_init();
参 数:无
返回值:无
结 果:启动UART串口接收中断,允许串口接收,启动T/C1产生波特率(占用)
备 注:振荡晶体为12MHz,PC串口端设置 [ 4800,8,无,1,无 ]
/**********************************************************************************************/
void UART_init (void){
EA = 1; //允许总中断(如不使用中断,可用//屏蔽)
ES = 1; //允许UART串口的中断
TMOD |= 0x20;//定时器T/C1工作方式2
SCON = 0x50;//串口工作方式1,允许串口接收(SCON = 0x40 时禁止串口接收)
TH1 = 0xF3;//定时器初值高8位设置
TL1 = 0xF3;//定时器初值低8位设置
PCON = 0x80;//波特率倍频(屏蔽本句波特率为2400)
TR1 = 1;//定时器启动
}
/**********************************************************************************************/
/*********************************************************************************************
函数名:UART串口接收中断处理函数
调 用:[SBUF收到数据后中断处理]
参 数:无
返回值:无
结 果:UART串口接收到数据时产生中断,用户对数据进行处理(并发送回去)
备 注:过长的处理程序会影响后面数据的接收
/**********************************************************************************************/
void UART_R (void) interrupt 4 using 1{ //切换寄存器组到1
TR0=1; //打开定时器开始计时
RI = 0;//令接收中断标志位为0(软件清零)
data_10[count] = SBUF;//将接收到的数据送入变量 UART_data
count++;//接收到一个字节数据计数+1
if(count>=10) //如果接收到10个数据
{
TR0=0; //停止定时器
TH0 = 0x3C; //给定时器赋初值
TL0 = 0xB0; //给定时器赋初值
count=0;//清零数据计数
//data_flag=1; //数据有效标志位
SBUF = 0x55;//返回数据 55H
while(TI == 0);//检查发送中断标志位
TI = 0;//令发送中断标志位为0(软件清零)
}
if(flag)
{
TR0=0; //停止定时器
TH0 = 0x3C; //给定时器赋初值
TL0 = 0xB0; //给定时器赋初值
count=0;//清零数据计数
SBUF = 0xff;//返回数据 ffH
while(TI == 0);//检查发送中断标志位
TI = 0;//令发送中断标志位为0(软件清零)
}
}
/**********************************************************************************************/
/*********************************************************************************************
函数名:定时/计数器初始化函数
调 用:T_C_init();
参 数:无
返回值:无
结 果:设置SFR中T/C1和(或)T/C0相关参数
备 注:本函数控制T/C1和T/C0,不需要使用的部分可用//屏蔽
/**********************************************************************************************/
void T_C_init (void){
TMOD |= 0x01; //高4位控制T/C1 [ GATE,C/T,M1,M0,GATE,C/T,M1,M0 ]
EA = 1;//中断总开关
TH0 = 0x3C; //16位计数寄存器T0高8位
TL0 = 0xB0; //16位计数寄存器T0低8位(0x3CB0 = 50mS延时)
ET0 = 1; //T/C0中断开关
TR0 = 0; //T/C0开关
}
/**********************************************************************************************/
/*********************************************************************************************
函数名:定时/计数器0中断处理函数
调 用:[T/C0溢出后中断处理]
参 数:无
返回值:无
结 果:重新写入16位计数寄存器初始值,处理用户程序
备 注:必须允许中断并启动T/C本函数方可有效,重新写入初值需和T_C_init函数一致
/**********************************************************************************************/
void T_C0 (void) interrupt 1 using 1{ //切换寄存器组到1
TH0 = 0x3C; //16位计数寄存器T0高8位(重新写入初值)
TL0 = 0xB0; //16位计数寄存器T0低8位(0x3CB0 = 50mS延时)
Time_50ms++; //50ms到 计数+1
if(Time_50ms>=100)
{
Time_50ms=0;// 清零50ms计数
flag=1; //5s时间 标志置位
TR0=0;//关闭计时器
}
}
/**********************************************************************************************/
main()
{
IP = 0x10; //中断优先级设置(串口中断最高优先级)
UART_init();//初始化串口
T_C_init(); // 初始化计数器
while(1);// 空循环
}

阅读全文

与单片机串口通信c程序相关的资料

热点内容
怎么查家里电器耗电量app 浏览:502
原神一直显示重新连接服务器怎么办 浏览:808
一般用途轴流式压缩机 浏览:922
没学历的怎么学编程 浏览:893
华为的隐藏相册无法加密 浏览:782
联通套餐app怎么设置 浏览:752
关于删除链表的算法描述 浏览:893
标准盘和压缩盘的区别 浏览:46
银行存款验证码JAVA编程 浏览:111
word转pdf软件免费版 浏览:139
公主连结安卓台服怎么下载 浏览:550
注册江苏银行app怎么注册 浏览:800
中兴怎么下载app视频 浏览:679
服务器审计是什么 浏览:518
华为删除的app怎么彻底卸载 浏览:574
编程时调试快捷键 浏览:6
安卓手机玩亚服怎么下载 浏览:341
思域压缩机多少钱 浏览:697
程序员代码合适吗 浏览:288
复利计算法律保护 浏览:741