导航:首页 > 操作系统 > 51单片机uart使用

51单片机uart使用

发布时间:2022-09-06 06:42:01

⑴ 使用MCS-51单片机的串口按工作方式1进行数据通信c语言

#include<reg51.h>
#define uchar unsiged char
uchar dat;
main()
{
TMOD=0x20;
TH1=0xfd;
TL1=0xfd;
TR1=1;
ES=1;
SCON=0x50;
EA=1;
TI=0;
while(1);
}
void uart_int(void) interrupt 4
{
if(RI)
{
dat=SBUF;
SBUF=dat;
while(TI==0);
TI=0;
}
}

⑵ 51单片机与uart通信

//51串口通信基本设置我不讲了,网上泛滥得很,基本通信调通的基础上通过命令来控制单片机动作可以用以下的方法,很简单。

//串口中断处理,接收用数组RecCmd[],调试助手每次发送数据的最后两个字符是'\r'和'\n'
//接收一个命令完成后将接收的内容放入缓冲RecCmdBuf[]

extern uchar idata RecCmd[10],RecCmdBuf[10]; //串口接收双缓冲,最大接收9个有效字节,第10个是’\r‘
extern bit RecCmdFlag;
void ISR_SERIAL(void) interrupt 4 using 2
{
uchar i;
if(RI) //RI接受中断标志
{
RI = 0; //清除RI接受中断标志
i = SBUF; //SUBF接受/发送缓冲器
SBUF= i; //RecCmd[RecPtr]; Echo Back
unReadyToSend = 1; //与另一个非echo发送程序之间的互锁信号
if('\n' == i) //收到‘\n'字符表示调试助手已经发送完成
{
i = 0;
while(('\r' != (RecCmdBuf[i] = RecCmd[i])) && i<10)
{
i++; //已接收部分放入缓冲
}
if(i) //避免调试助手发空内容,即只发'\r'和'\n'
RecCmdFlag =1; //通知主程序命令接收完成
RecPtr = 0; //准备接收新命令
}
else
{
RecCmd[RecPtr++] = i;
if(RecPtr>9)
RecPtr = 0; //超长无效命令
}
}
if(TI)
{
TI = 0; //发送中断响应
unReadyToSend = 0;
}
}

//命令处理部分可以放在主循环里调用,命令判断的方式非常原始,但自己测试用就无所谓
void SerialCmdHandle(void)
{
if(RecCmdFlag)
{
if('m' == RecCmdBuf[0] && 'e' == RecCmdBuf[1] && 'n' == RecCmdBuf[2] && 'u' == RecCmdBuf[3] && '\r' == RecCmdBuf[4])
ShowMenu(); //command "menu"
if('s' == RecCmdBuf[0] && 'h' == RecCmdBuf[1] && 'o' == RecCmdBuf[2] && 'w' == RecCmdBuf[3] && ' ' == RecCmdBuf[4] && 's' == RecCmdBuf[5] && '\r' == RecCmdBuf[6])
{
LedShow = Serial; //command "show s"
}
if('s' == RecCmdBuf[0] && 'h' == RecCmdBuf[1] && 'o' == RecCmdBuf[2] && 'w' == RecCmdBuf[3] && ' ' == RecCmdBuf[4] && 'a' == RecCmdBuf[5] && 'd' == RecCmdBuf[6] && '\r' == RecCmdBuf[7])
{
LedShow = Adc; //command "show ad"
}
if('s' == RecCmdBuf[0] && 'h' == RecCmdBuf[1] && 'o' == RecCmdBuf[2] && 'w' == RecCmdBuf[3] && ' ' == RecCmdBuf[4] && 't' == RecCmdBuf[5] && 'e' == RecCmdBuf[6] && '\r' == RecCmdBuf[7])
{
LedShow = TempCov; //command "show te"
}
if('s' == RecCmdBuf[0] && 'h' == RecCmdBuf[1] && 'o' == RecCmdBuf[2] && 'w' == RecCmdBuf[3] && ' ' == RecCmdBuf[4] && 't' == RecCmdBuf[5] && 'i' == RecCmdBuf[6] && '\r' == RecCmdBuf[7])
{
LedShow = Time; //command "show ti"
}
if('s' == RecCmdBuf[0] && 'h' == RecCmdBuf[1] && 'o' == RecCmdBuf[2] && 'w' == RecCmdBuf[3] && ' ' == RecCmdBuf[4] && 't' == RecCmdBuf[5] && 'd' == RecCmdBuf[6] && '\r' == RecCmdBuf[7])
{
LedShow = Date; //command "show td"
}
if('s' == RecCmdBuf[0] && 't' == RecCmdBuf[1] && ' ' == RecCmdBuf[2] && '\r' == RecCmdBuf[9])
{
//command "st 000012" 改变ds1302的时间 ss:mm:hh //24hour |0x80
SetClockTime((((RecCmdBuf[3]-'0')<<4) | (RecCmdBuf[4]-'0')),(((RecCmdBuf[5]-'0')<<4) | (RecCmdBuf[6]-'0')),(((RecCmdBuf[7]-'0')<<4) | (RecCmdBuf[8]-'0')));
}
if('s' == RecCmdBuf[0] && 'd' == RecCmdBuf[1] && ' ' == RecCmdBuf[2] && '\r' == RecCmdBuf[9])
{
//command "sd 011299"改变ds1302的日期 dd:mm:yy
SetClockDate((((RecCmdBuf[3]-'0')<<4) | (RecCmdBuf[4]-'0')),(((RecCmdBuf[5]-'0')<<4) | (RecCmdBuf[6]-'0')),(((RecCmdBuf[7]-'0')<<4) | (RecCmdBuf[8]-'0')));
}
LedChangeFlag = 1;
//LcdChangeByteFlag = 0 + CHANGE + SERIAL;
RecCmdFlag = 0;
}
}

//下面是一个串口输出的menu菜单,给你参考。

void SendOneByte(uchar ch)
{
//ES = 0; //禁止发送中断
SBUF = ch;
unReadyToSend = 1; //互锁信号
}
void UartSendST(uchar *st, uchar len)
{
while(len > 0)
{
while(unReadyToSend);
SendOneByte(*st++);
len--;
}
}

typedef struct _menu{
uchar *item;
uchar size;
} T_Menu;

T_Menu code MAINM = {"MENU\r\n",6}, \
MENU0 = {"_____________________________________\r\n",39}, \
MENU1 = {"menu-> list this menu\r\n",23}, \
MENU2 = {"show s/ad/te/ti/td-> \r\n",19}, \
MENU3 = {"serial/ad-da/temp/time/date\r\n",29}, \
MENU4 = {"led f num-> led flash time us\r\n",31}, \
MENU5 = {"st ssmmhh->set time\r\n",21}, \
MENU6 = {"sd ddmmyy->set date\r\n",21}, \
MENU7 = {"\r\n",2}, \
MENU8 = {"\r\n",2};

void ShowMenu(void)
{
UartSendST(MAINM.item,MAINM.size);
UartSendST(MENU0.item,MENU0.size);
UartSendST(MENU1.item,MENU1.size);
UartSendST(MENU2.item,MENU2.size);
UartSendST(MENU3.item,MENU3.size);
UartSendST(MENU4.item,MENU4.size);
UartSendST(MENU5.item,MENU5.size);
UartSendST(MENU6.item,MENU6.size);
UartSendST(MENU7.item,MENU7.size);
UartSendST(MENU8.item,MENU8.size);

}

⑶ 51单片机UART通信问题

定时器1工作在自动重装模式时,不需要软件加以干预,就可以为UART的波特率提供连续稳定的时钟。之所以只能用定时器1作为UART的波特率时钟,这是由单片机内部硬件所决定的。但并不是定时器1工作在自动重装模式时才成为UART的波特率,定时器1工作在其它模式也可以为UART提供波特率时钟,比如工作在模式1(16位定时/计数),UART在低速率运行时就可以采用这种定时器模式,但由于这种工作模式不能自动重装计数初值,这就需要软件的干预,在定时器计数溢出时,通过软件指令装填计数初值,使定时器执行新一轮计数循环,以便为UART的波特率提供连续时钟。以上拙见仅供参考,希望对你有帮助。

⑷ 51单片机串口发送

//这是一个单片机C51串口接收(中断)和发送例程,可以用来测试51单片机的中断接收
//和查询发送,另外我觉得发送没有必要用中断,因为程序的开销是一样的
//程序编写: 龚建伟 [email protected]
//技术主页:http://www.gjwtech.com
//您有这方面的问题可以和我讨论

#include <reg51.h>
#include <string.h>

#define INBUF_LEN 4 //数据长度

unsigned char inbuf1[INBUF_LEN];
unsigned char checksum,count3;
bit read_flag=0;

void init_serialcomm(void)
{
SCON = 0x50; //SCON: serail mode 1, 8-bit UART, enable ucvr
TMOD |= 0x20; //TMOD: timer 1, mode 2, 8-bit reload
PCON |= 0x80; //SMOD=1;
TH1 = 0xF4; //Baud:4800 fosc=11.0592MHz
IE |= 0x90; //Enable Serial Interrupt
TR1 = 1; // timer 1 run
// TI=1;
}

//向串口发送一个字符
void send_char_com(unsigned char ch)
{
SBUF=ch;
while(TI==0);
TI=0;
}

//向串口发送一个字符串,strlen为该字符串长度
void send_string_com(unsigned char *str,unsigned int strlen)
{
unsigned int k=0;
do
{
send_char_com(*(str + k));
k++;
} while(k < strlen);
}

//串口接收中断函数
void serial () interrupt 4 using 3
{
if(RI)
{
unsigned char ch;
RI = 0;
ch=SBUF;
if(ch>127)
{
count3=0;
inbuf1[count3]=ch;
checksum= ch-128;
}
else
{
count3++;
inbuf1[count3]=ch;
checksum ^= ch;
if( (count3==(INBUF_LEN-1)) && (!checksum) )
{
read_flag=1; //如果串口接收的数据达到INBUF_LEN个,且校验没错,
//就置位取数标志
}
}
}
}

main()
{
init_serialcomm(); //初始化串口
while(1)
{
if(read_flag) //如果取数标志已置位,就将读到的数从串口发出
{
read_flag=0; //取数标志清0
send_string_com(inbuf1,INBUF_LEN);
}
}

}

⑸ 用程序如何实现C51单片机之间的UART通讯

两块儿单片机共地,3,.1和3.0交叉连接,用串口通讯中的方式1就能实现,波特率设置的越高,你中间的传输线就要越短,想要加长线的长度就要中间加驱动设备,比如两块儿MAX232,至于汇编程序嘛,随便找本单片机教材,攒口通讯一般都是汇编的,而方式一也是最普遍的

⑹ 51单片机UART串口通信

51单片机是对所有兼容Intel 8031指令系统的单片机的统称。该系列单片机的始祖是Intel的8004单片机,后来随着Flash rom技术的发展,8004单片机取得了长足的进展,成为应用最广泛的8位单片机之一,其代表型号是ATMEL公司的AT89系列,它广泛应用于工业测控系统之中。很多公司都有51系列的兼容机型推出,今后很长的一段时间内将占有大量市场。51单片机是基础入门的一个单片机,还是应用最广泛的一种。需要注意的是51系列的单片机一般不具备自编程能力。

⑺ 51单片机UART连续发送问题

在uart_send(i);后面加一个短延时看看。

再看一下你的晶振是不是11.0592MHz。
ES = 1;改成ES =0;

⑻ 51单片机通过串口实现数据的发送与接收程序

串口收发,要有通信协议。也就是什么时候开始接收,接收到指令后,转发什么数据。这个要知道,才可以写。而且使用不同的51单片机,其内部寄存器配置是不同的。
一般来说,过程如下:
1,配置串口参数、波特率等,开启串口中断;
void Init_UART()
{

}
2,中断函数里写中断响应函数,根据接收的指令或者数据,执行相应的动作;
程序一般为:
void UART_ISR() interrupt x using y
{
;串口中断处理函数
}
x - 单片机的C51中断号
y - 指定使用的当前工作寄存器组号(0-3 PSW中的RS0,RS1组合)

3,主程序
int main(void)
{
Init_UART();
while(1)
{
;//数据发送函数
}
}

⑼ 51单片机和电脑的蓝牙通信 ,用uart串口

1 电脑端买个蓝牙适配器就可以了,注意要和你底层蓝牙芯片的通信协议要一致;
2 买个蓝牙芯片了, BC41B143A蓝牙芯片,该芯片支持串口控制的,
要想与BC41B143A蓝牙芯片通信了,购买的蓝牙适配器必须是BT2.0+EDR

⑽ 51单片机内置uart硬件

51内置UART是硬件的,IO不能变化。如果你不想使用P3.0、P3.1,就只能在其它IO上通过程序来模拟UART了。

阅读全文

与51单片机uart使用相关的资料

热点内容
访问服务器公网地址 浏览:656
pdf打印底色去掉 浏览:443
java快递接口 浏览:395
哪个app可以教新爸爸 浏览:210
如何查看服务器系统版本信息 浏览:524
成都市土地出让金算法 浏览:702
钢筋加密标记 浏览:575
ps中扩展功能在文件夹的什么位置 浏览:903
双极压缩机为什么要先高压 浏览:527
苹果手机服务器填什么 浏览:832
android移动动画效果 浏览:691
电子和服务器是什么意思 浏览:691
phpurl中文乱码问题 浏览:893
程序员那么可爱大结局陆漓产子 浏览:538
java如何从云服务器读取本地文件 浏览:924
压缩空气软管制作方法 浏览:912
天河三号算法 浏览:924
php队列教程 浏览:632
洪水命令 浏览:530
安卓怎么弄成苹果在线 浏览:435