#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)}
}
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)