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

51单片机 串口设计c语言程序简单设计,第1张

第一题,已经测试成功:

#include <reg52.h>

#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 = zx >0x--) for(y = 110y >0y--)

}

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

}

}

初始化程序:

BTLEQU2FH;波特率放在内部RAM的2FH单元

MOVTMOD,#21H;T0方式1,16位计数器,T1方式2,串口用

SETBTR0;启动T0

MOVBTL,#0F3H;波特率设定为1200

MOVSCON,#0C0H;串口方式3,9位数据,禁止接收

接收及验证程序:

NUMEQU2BH;同步符个数值存放在内部RAM的2BH单元

TEMPEQU2CH

ROM-CH:DB55H,55H,55H,55H,55H,55H,55H,55H,55H,55H

DB55H,55H,55H,55H,55H,55H,55H,55H,55H,55H;20字节同步符

MIMDB'WSC':3字节密码“WSC”

SETBP3.5;置电台收状态

SETBREN;允许串口接收

A1:MOVNUM,肆含#0;记录连续到同步符55H的个数

A2:JBRI,A2;串口有数据转A3

A3:CLRRI;清接收中断标志

MOVA,SBUF;读串口数据

CJNEA,#55H,A1;不是同步符转A1

INCNUM;收到的同步符个数加1

MOVA,NUM;取收到的同步符个数

CJNEA,#5,A2;未收够连续5个55H转A2

A4:MOVNUM,#0密码验证,记录收到密码字腔棚节数

A5:MOVDPTR,#MIM;密码字符首址

MOVA,NUM

MOVCA,@A+DPTR;查表取密码

MOVTEMP,A;保存密码

JBRI,A6;串口收完一个字节转A6

A6:CLRRI;清接收中断标志

MOVA,SBUF;读串口数据

CJNEA,TEMP,A4;与密码不符转A4

INCNUM;收到的密码个数加1

MOVA,NUM;取已收到的密码字节数

CJNEA,#3,A5;密码未裂圆笑收完转A5

发送程序:

CLRP3.5;置电台发状态

MOVB,#23

MOVDPTR,#ROM-CH

B1:CLRA

MOVCA,@A+DPTR;查表发送同步符和密码共24字节

INCDPTR

LCALLSEND-CH;调发送单字节子程序

DJNZB,B1

CLRA

MOVDPTR,#7000H;外部RAM数据首址,发送外部RAM中的数据到电台

B2:CJNER4,#0,B3

CJNER3,#0,B3;R4R3=发送字节数

B3:MOVXA,@DPTR;取数据

INCDPTR

LCALLSEND-CH

CJNER3,#0,B4

CJNER4,#0,B5

B4:DECR3

LJMPB2

DECR3

DECR4

LJMPB2

SEND-CH:SETBTB8

MOVSBUF,A

DB0,0,0,0,0,0,0,0

JNBTI,$;延时4μs

CLRTI

RET

结语

///////////////////////////////////////////////////////////

// 设计题目: 基于51单片机的串口通信

// 功能:

// 说明: 晶振用12M,

///////////////////////////////////////////////////////////

#include <reg51.h> // 12M 晶振

#define uchar unsigned char

#define uint unsigned int

//////////////纳燃纳/////////////////////////////////////////////

// Name : 串口发送函数

// In:

// Out :

// Function :

// Explain :

///////////////////////////////////////////////////////////

void send(uchar x)

{

SBUF=x// 将数据放到缓冲区,发送

while(!TI) // 等待发送完成

TI=0// 清标志位

}

/////////////////////////////洞没//////////////////////////////

// Name : 初始化函数

// In:

//段辩 Out :

// Function :

// Explain :

///////////////////////////////////////////////////////////

void init(void)

{

TMOD=0x20 // T1工作在方式2,自动重载

TH1=0xe6

TL1=0xe6 // 设置波特率为1200

SM0=0

SM1=1 // 串口方式1

TR1=1 // 打开定时器1

}

///////////////////////////////////////////////////////////

// Name : 主函数

// In :

// Out :

// Function :

// Explain :

///////////////////////////////////////////////////////////

void main(void)

{

uchar i

init() // 初始化

while(1)

{

for(i=0i<10i++)

{ send(i)}

}

}


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12518296.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-26
下一篇 2023-05-26

发表评论

登录后才能评论

评论列表(0条)

保存