你看看接收并回传给串口助手的数据是否正确
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);// 空循环
}