实验三单片机串行口编程
一、实验目的
1、掌握单片机串行口的工作方式;
2、掌握单片机串行口的编程方法。
二、实验内容
1、学习单片机串行口的工作方式、初始化以及应用等;
2、利用单片机串行口编写程序,利用串口助手工具通过PC机发送相应信息,单片机串行口根据接收到的信息控制开发板上的LED灯按一定规律工作。
要求:
“#”指令开始标志,“*”指令结束标志。
根据接收到的指令start—控制LED灯闪烁,闪烁频率1Hz;pause—控制LED点亮;stop—控制LED熄灭。
测试串口正常工作的代码(通过串口接收一个字符,再发送回串口)
#include <reg51.h>
main()
{
unsigned char a;
/*在12MHz下,设置4800波特率,方式1*/
TMOD=0x20; //设置定时器1的方式
TH1=0xf3; //设置定时器1的初值
TL1=0xf3;
SCON=0x50; //设置串行口方式1,并允许接收PCON=0x80; //SMOD=1
TR1=1; //启动定时器1
while(1)
{
while(RI==0);
a=SBUF;
RI=0;
SBUF=a;
while(TI==0);
TI=0;
}
}
三、实验设备
1、STC单片机开发板;
2、PC机以及串口线。
四、实验分析及关键代码
#include <reg52.h>
sbit led=P2^5;
unsigned char a; //串行
unsigned char num; //定时
unsigned char start[]="#start*";
unsigned char stop[]="#stop*";
unsigned char pause[]="#pause*";
unsigned char startNum,stopNum,pauseNum;
//初始化
void init()
{
TMOD=0x21; //设置定时器方式
//定时器
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1;
ET0=1;
//串口
TH1=0xf3;
TL1=0xf3;
SCON=0x50; //设置串行口方式1 01100000 PCON=0x80; //
TR1=1;
ES = 1; //允许串行中断
}
//定时器中断
void Timer0() interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
num ++;
if(num==20)
{
num=0;
led=!led;
}
}
//串行中断
void seri() interrupt 4
{
//RI接受中断标志TI发送中断标志if(RI)
{
a=SBUF;
RI=0;
SBUF=a;
while(TI==0);
TI=0;
//
if(start[startNum]==a && a!='\0')
startNum++;
else startNum=0;
if(pause[pauseNum]==a && a!='\0') pauseNum++;
else pauseNum=0;
if(stop[stopNum]==a && a!='\0')
stopNum++;
else stopNum=0;
if(startNum==7)
{
TR0=1;//启动定时器
}
if(pauseNum==7)
{
TR0=0;
led=0;
}
if(stopNum==6)
{
TR0=0;
led=1;
}
}
}
void main()
{
init();
while(1);
}。