单片机c语言串口通信
如果在字符数字发送框发0X00蜂铃器就会叫,如果发0xff蜂铃器就停叫。
#include <REG52.H>
#include <stdio.h>
sbit BEEP = P1^4;
unsigned char b;
void main (void) {
SCON = 0x50; //REN=1允许串行接受状态,串口工作模式1
TMOD|= 0x20; //定时器工作方式2
PCON|= 0x80;
//TH1 = 0xFD; //baud*2 /* reload value 19200、数据位8、停止位1。效验位无 (11.0592)
TH1 = 0xF3; // //baud*2 /* 波特率4800、数据位8、停止位1。效验位无 (12M)
TL1 = 0xF3;
TR1 = 1;
ES = 1; //开串口中断
EA = 1; // 开总中断
BEEP=1;
// IE = 0x0;
while(1)
{
if (RI) //RI接受中断标志
{ RI=0; //清除RI接受中断标志
b=SBUF; //SUBF接受/发送缓冲器
}
BEEP=b;
}
}
这个是个发送程序,接收程序类似,不懂可继续追问,一般人都是在别人程序基础上改改称为自己的,希望楼主能够自己研究出自己的一套编程理论
‘贰’ 51单片机C语言的串口通讯协议
举个例子
二、 串行口通讯方式:
2.1 工作方式:主从方式。上位机为主,顺序闪光灯主机为从;控制命令和查询命令由上位机发出,顺序闪光灯主机做相应信息返回。
2.2 工作模式:8位数据,无校验;对于51系列单片机为模式1
2.3 波特率:1200,2400,4800,9600(可选,缺省为4800)。
2.4 信息格式:
序号 名称 字节数 内容 说明
1 帧信息头 1 0xAA 用于表示信息的开始
2 帧信息类型 1 控制0x01 用于区别控制命令、查询命令及返回信息;“控制”和“查询”由上位机发出,“返回”为顺序闪光灯主机返回信息时发出。
查询0x02
返回0x03
3 有效信息长度 1 n 表示有效信息的字节数
4 有效信息 n n个字节 有效信息。详见具体信息定义
5 校验码 1 LRC 对帧信息类型、有效信息长度、有效信息进行单字节相加,取低8位补码(即对低8位取反后再加一)作为校验码。
说明:上位机和顺序闪光灯主机使用相同的信息格式,不同之处在于信息类型、信息长度的不同。
‘叁’ 要个计算机与单片机的串口通信上位机C语言程序
兄弟,下面是我自己写的,希望给你帮助,把数据用Send_One_Uart()这个函数直接发送到串口就行了!最后求采纳,哈哈!
//-----头文件
#include<reg52.h>
//-----定义全局变量
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语言编写)
我用的新唐芯片,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;
}
}
}
接收
‘伍’ 如何用c语言编程实现c51单片机中从串口接收一个字符串
如果用中断方式接收的话,只能接收单个字符。而如果用查询方式的话,接收字符串占用的时间真太长了,整个CPU将陷入一个长期无法工作的状态,按照波特率为19200来算,接收一个字符的时间是573微秒,十个字符的话就是5.73毫秒了,系统无法正常工作。建议用中断接收单个字符。
‘陆’ 单片机串口通信和C语言循环
应该可以,用软件仿真一下,一般串口接受都采用中断.这样可以省出CPU去执行别的任务.
‘柒’ 一道51单片机的C语言程序,关于串口通讯的,很简单......
#include<reg52.h> //增强型52寄存器的定义
#define uchar unsigned char //用uchar代替unsigned char
#define uint unsigned int //用uint代替unsigned int
unsigned char flag,a,i; //定义变量flag,a,i
uchar code table[]="I receive,thanks"; //定义一个字符串数组
void init()
{
} //设置工作方式,这个懂。
void main()
{
init(); //系统初始化,你懂的
while(1) //主循环部分,一直运行
{
if(flag==1) //等待flag标志位置位,当接收到数据的时候在串口接收中断中置位
{
ES=0; //禁止串口中断,但是注意发送中断标志位的置位仍然正常
for(i=0;i<18;i++) //for循环为了一个个把之前定义的字符串
{
SBUF=table[i]; //向串口收发缓冲器中写入回应的内容“I receive,thanks”
while(!TI); //等待发送完成,发送中断标志被置一,否则while循环一直进行
TI=0; //清除发送中断标志位
}
SBUF=a; //继续通过串口向串口收发缓冲器发送a,回显收到的数据
while(!TI); //等待发送完成
TI=0; //清除发送中断标志位
ES=1; //重新使能串口中断
flag=0; //清除flag,为了等待下一次接收
}
}
}
void serial() interrupt 4 //串口中断服务程序,优先级为4
{
RI=0; //当接收完成之后RI被置一,发生串口中断,清标志位
a=SBUF; //读取收到的字符,并赋给变量a
flag=1; //置接收完成标志flag为一,便于主程序中发送响应
}
‘捌’ 51单片机串口通信c语言编程
#include <REG52.H>
#define uchar unsigned char
#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;
}
//串口接收程序
uchar receive(void)
{
re=SBUF; //接收数据
while(RI==0);
RI=0;
return re;
}
//串口初始化
void sinti(void)
{
SCON = 0x50;
TMOD |= 0x20;
TH1 = 0xFD;
TR1 = 1;
EA = 1;
ES = 1;
}
void delay(int cnt)
{
while(--cnt);
}
//主程序
int main (void)
{
int i;
sinti(); //串口初始化程序
ring=1;
while(1)
{
while (1)
{
if(CASE1==0)
{
send('a');
ring=0;
break;
}
if(CASE2==0)
{
send('b');
ring=0;
break;
}
if(CASE3==0)
{
send('c');
ring=0;
break;
}
if(CASE4==0)
{
send('d');
ring=0;
break;
}
}
if(ring==0)
{
wait(60000);
ring=1;
}
for(i=0;i<10000;i++);
}
}
//串口中断程序
void UART_SER (void) interrupt 4 //串行中断服务程序
{
if(RI) //判断是接收中断产生
{
RI=0; //标志位清零
temp=SBUF;
}
if(TI) //如果是发送标志位,清零
TI=0;
}
‘玖’ 单片机串口通信C语言程序
#include<reg52.h>
unsigned
char
flag,a;
void
main()
{
TMOD=0x20;//设置定时器1为工作方式2
TH1=0xfd;
TL1=0xfd;
TR1=1;
REN=1;
SM0=0;
SM1=1;
EA=1;
ES=1;
while(1)
{
/*
if(RI==1)
{
RI=0;
P1=SBUF;
}*/
if(flag==1)
{
ES=0;
flag=0;
SBUF='1';//28;
while(!TI);
TI=0;
SBUF='2';//28;
while(!TI);
TI=0;
SBUF='3';//28;
while(!TI);
TI=0;
ES=1;
}
}
}
void
ser()
interrupt
4
{
RI=0;
//
P1=SBUF;
a=SBUF;
flag=1;
}
这段程序是你发送一个字符后再发送回来!
‘拾’ 单片机串行口通信程序C语言
发送:
#include
<reg52.h>
#include<intrins.h>
#include<string.h>
#define
uchar
unsigned
char
uchar
data
i,j,p,TEST;
sbit
INTT0=P3^2;
uchar
code
V_35[10]={'V','o','l','t','
','3','.','5',13,10};
void
Init();
void
Delay();
void
Volt_35();
void
main()
{
Init();
while(1)
{
if(TEST)
{
Volt_35();
TEST=0;
}
}
}
void
Init()
{
P0=0XFF;
//I/O口初始化
P1=0xFF;
P2=0XFF;
P3=0xFF;
SCON=0x50;
//设置成串口方式1
T2CON=0x34;
TH2=0xff;
//晶振11.0592MHZ,波特率9600
TL2=0xdc;
RCAP2H=0XFF;
RCAP2L=0XdC;
EA=1;
EX0=1;
IT0=1;
TEST=0;
}
void
Delay()
{
for(i=0;i<100;i++)
for(j=0;j<100;j++);
}
void
Volt_35()
{
for(p=0;p<10;p++)
{
SBUF=V_35[p];
while(!TI);
TI=0;
}
}
void
int0svr(void)
interrupt
0
using
1
{
Delay();
if(!INTT0)
{
while(!INTT0);
TEST=1;
}
}
接收:
#include
<reg52.h>
#include<intrins.h>
#include<string.h>
#define
uchar
unsigned
char
uchar
data
i;
void
Init();
void
main()
{
Init();
while(1)
{
for(i=0;i<10;i++)
{
while(!RI);
P1=SBUF;
RI=0;
}
}
}
void
Init()
{
P0=0XFF;
P1=0xFF;
P2=0XFF;
P3=0xFF;
SCON=0x50;
T2CON=0x34;
TH2=0xff;
TL2=0xdc;
RCAP2H=0XFF;
RCAP2L=0XdC;
}