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

51单片机串口c程序

发布时间:2022-07-04 13:35:00

Ⅰ 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;
}

Ⅱ 一道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单片机从电脑串口接收10字节的数据,程序用c语言

可靠的接受程序!!从LZ 的display(a1......a10)看出来这程序就不咋样,如果显示函数 还是 用 延时做的,可靠的接受程序给LZ 也是 白瞎……
以下是 UART 驱动程序

/***10位异步收发串口通讯驱动——火柴天堂作品-20130119***/
/***源程序硬件环境:52单片机,11.0592MHz晶振,定时器1作为波特率发生器,通讯波特率9600 bit/s***/
/******/
#define UART_H
#include"REG52.h" //包含52头文件
#include"UART.h" //包含串口头文件
#define th1 0xfa //6.51us at 11.0592MHz Fosc for 8bit auto reload mode

static uchar UART_DataR; //串口接收数据寄存器
static uchar bdata Flag=0; //标志位 寄存器
sbit UART_ReFlag=Flag^0; //串口接收标志位 0:无数据 1:新数据
sbit UART_SendFlag=Flag^1; //串口发送标志位 0:空闲中 1:发送中

void UART()interrupt 4 //串口中断函数
{
if(RI) //若串口接收完成
{
RI=0; //清 串口接收溢出位
UART_DataR=SBUF; //将串口收到的数据存进 UART_DataR
UART_ReFlag=TRUE; //串口接收标志位 置位(有新数据)
}
if(TI) //若串口发送完成
{
TI=0; //清 串口发送溢出位
UART_SendFlag=FALSE; //清串口发送标志位(空闲中)
}
}

void UART_Init() //串口初始化函数
{
SCON=0x50; //选择通讯方式:10位异步收发,串口中断使能
PCON=0x80; //波特率倍频
TMOD&=0x0f; //定时器1控制位清0
TMOD|=0x20; //定时器1工作模式2(8位自重装,做波特率发生器)
TH1=th1; //定时器初值
TL1=th1; //定时器初值
TR1=1; //开始计时
ES=1; //允许串口中断
EA=1; //允许系统中断
}

bit UART_SendByte(uchar send_data) //串口发送字节函数,发送内容send_data,返回值:0 操作失败,1操作成功
{
if(!UART_SendFlag) //若串口空闲中,则
{
SBUF=send_data; //将发送内容 送到 串口寄存器
UART_SendFlag=TRUE; //置位串口发送标志位(进入忙态)
return TRUE; //返回1,操作成功
}
return FALSE; //否则,返回0,操作失败
}

uchar ASCII_ToHex(uchar ascii_data) //ASCII 转 Hex 函数
{
uchar hex_data=0; //定义 Hex变量存储转换结果
if(ascii_data>='0' && ascii_data<='9') hex_data=ascii_data-'0'; //若 转换内容为 字符'0-9',则转成对应数字0-9
else if(ascii_data>='a' && ascii_data<='f') hex_data=ascii_data-'a'+10; //若 转换内容为 字符'a-f',则转成数字10-15
else if(ascii_data>='A' && ascii_data<='F') hex_data=ascii_data-'A'+10; //若 转换内容为 字符'A-F',则转成数字10-15
return hex_data; //返回转换结果,非以上字符,不在Hex(0-F)范围内,默认0
}

bit UART_ReadByte(uchar *p_data,bit data_mode) //串口读字节函数,返回值0 无数据,1 有数据,将data_mode模式(ASCII_Mode或HEX_Mode)转成Hex结果存到p_data指向地址
{
if(!UART_ReFlag) return FALSE; //若无新数据,则返回 0(无数据)
UART_ReFlag=FALSE; //否则,清 串口接收标志位
if(data_mode==HEX_Mode) *p_data=UART_DataR; //Hex模式,将串口接收结果存到p_data指向地址
if(data_mode==ASCII_Mode) *p_data=ASCII_ToHex(UART_DataR); //ASCII模式,将串口接收结果转成Hex后,存到p_data指向地址
return TRUE; //返回 1(有数据)
}

Ⅳ 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);
}

Ⅳ 求51单片机串口程序,串口控制单片机,C语言

波特率得看程序设置,11.0592MHz 晶振,12T模式单片机,最大支持9600 波特率。真需要C程序的话,留Q吧

Ⅵ 51单片机串口校验和C程序怎么写,我是个新手,麻烦清楚点说明

你指的校验应该是奇偶校验位,奇偶校验是看数据字节的0/1的个数是奇数还是偶数。下面复制一段话:在串口通信中一种简单的检错方式。有四种检错方式:偶、奇、高和低。当然没有校验位也是可以的。对于偶和奇校验的情况,串口会设置校验位(数据位后面的一位),用一个值确保传输的数据有偶个或者奇个逻辑高位。例如,如果数据是011,那么对于偶校验,校验位为0,保证逻辑高的位数是偶数个。如果是奇校验,校验位为1,这样就有3个逻辑高位。高位和低位不是真正的检查数据,简单置位逻辑高或者逻辑低校验。这样使得接收设备能够知道一个位的状态,有机会判断是否有噪声干扰了通信或者是否传输和接收数据是否不同步。

Ⅶ 求一个基于51单片机的C语言程序,要求从串口接收一组数据,然后将其通过串口输出

#include <AT89X51.H>//单片机51头文件,存放着单片机的寄存器
unsigned char dat; //用于存储单片机接收发送缓冲寄存器SBUF里面的内容
sbit gewei=P2^2; //个位选通定义
sbit shiwei=P2^3; //十位选通定义
unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x67,0x77,0x7c,0x39,0x5e,0x79,0x71};
//{0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x67,};// 0, 1, 2, 3, 4, 5, 6, 7, 8, 9
void Delay(unsigned int tc) //延时程序
{
while( tc != 0 )
{unsigned int i;
for(i=0; i<100; i++);
tc--;}
}
void LED() //LED显示接收到的数据
{
shiwei=0;
P0=~table[dat/16];
Delay(8);
shiwei=1;
gewei=0;
P0=~table[dat%16];
Delay(5);
gewei=1;
}
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 ) //扫描判断是否接收到数据,
{
dat = SBUF; //接收数据SBUF赋与dat
RI=0; //RI清零。
SBUF = dat; //在原样把数据发送回去
}
LED(); //显示接收到的数据
}
}

Ⅷ 51单片机 串口收发 C语言

SpeedLimit是16位的速度值,串口是分开两次发的,第一次是高八位,所以要移位(Delever=Delever<<8;),接下是低八位,直接相加(Delever=Delever+ch; )

Ⅸ C语言---51单片机与PC串口通信程序

可以用个一维阵列来储存,然后判断是否为3.06

Ⅹ 51单片机 串口设计c语言程序简单设计

第一题,已经测试成功:
#include
#define
uchar
unsigned
char
#define
uint
unsigned
int
uchar
flag,
a;
sbit
d
=
P0^0;
void
init()
{
TMOD
=
0x20;
//设置定时器1为工作方式2
TH1
=
0xfd;
TL1
=
0xfd;
TR1
=
1;
//开定时器1
REN
=
1;
//开
串口通信
.
SM0
=
0;
//设置串口通信方式1
SM1
=
1;
EA
=
1;
//开总中断.
ES
=
1;
//开串口中断.
}
void
delay(uint
z)
{
uint
x,
y;
for(x
=
z;
x
>
0;
x--)
for(y
=
110;
y
>
0;
y--);
}
void
main()
{
init();
a
=
'4';
while(1)
{
if(a
==
'1')
{
d
=
0;
delay(400);
d
=
1;
delay(400);
}
else
if(a
==
'2')
{
d
=
0;
delay(200);
d
=
1;
delay(200);
}
else
if(a
==
'3')
{
d
=
0;
delay(100);
d
=
1;
delay(100);
}
else
if(a
==
'4')
{
d
=
1;
}
}
}
void
ser()
interrupt
4
{
if
(TI
==
1)
{
TI
=
0;
}
else
if
(RI
==
1)
{
RI
=
0;
a
=
SBUF;
//中间变量.
flag
=
1;
}
}

阅读全文

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

热点内容
进入组策略的命令 浏览:137
python数据结构和内存 浏览:25
python软件功能简介 浏览:784
外国程序员一般多少岁退休 浏览:917
怎么看linux和时间服务器 浏览:680
程序员搞笑花名 浏览:501
dota2怎么设置国服服务器地址 浏览:212
单片机高电平驱动 浏览:115
ios多选文件夹 浏览:909
加强行车调度命令管理 浏览:243
服务器已禁用什么意思 浏览:150
部队命令回复 浏览:755
神奇宝贝服务器地图怎么设置 浏览:382
加密算法输出固定长度 浏览:862
程序员去重庆还是武汉 浏览:121
服务器如何撤销网页登录限制 浏览:980
微信公众平台php开发视频教程 浏览:628
怎么看苹果授权绑定的app 浏览:255
压缩机单级压缩比 浏览:380
linux测试php 浏览:971