51单片机复习程序例举003
2019-04-15 16:23发布
生成海报
1、串行通信,查询模式,单片机转发PC机发来的数据。
PC通过串口向单片机发数据,单片机将接收到的数据在转发给PC
/******************************************************************************
* 说明:AT89S52芯片,12M晶振
* 串行通信,工作方式1,波特率可变
* 定时器T1产生波特率,工作方式2,8位自动重装
* (注意:定时器T1此时不能工作在中断的模式下)
* 本程序:PC向单片机发数据,单片机将接收到的数据在转发给PC
******************************************************************************/
#include
unsigned char Serial_Receive(void);
void Serial_Send(unsigned char transmit);
/******************************************************************************
* 名称:delay1ms()
* 功能:延时1ms
* 参数:int t
* 返回:无
******************************************************************************/
void delay1ms(int t)
{
unsigned char i ;
while(t--)
{
for(i = 0 ; i < 125 ; i++)
{
;
}
}
}
/******************************************************************************
* 名称:Serial_Init()
* 功能:初始化串口 ,工作方式1,波特率9600
* 参数:无
* 返回:无
******************************************************************************/
void Serial_Init(void)
{
/*-------------串行通信初始化,定时器T1产生波特率,工作方式2------------*/
//1、配置串口控制寄存器 SCON (98H)
// SCON : SM0, SM1, SM2, REN, TB8, RB8, TI, RI
SCON = 0x50 ; // 0101 0000 工作方式1,10位异步接发,波特率自定,
// 起始位和停止位芯片自动加上和去掉,用户只需发送8位数据就行
// REN 串行口接收允许控制位
//2、配置电源控制寄存器 PCON (97H) 和波特率相关 , 寄存器PCON不能按位赋值
// PCON : SMOD, - , - , - , GF1, GF0, PD, IDL
PCON = 0x80 ; //波特率加倍 (不加倍,可不配置PCON,或 PCON = 0x00 ;)
//3、配置中断允许寄存器 IE (0A8H)
// IE: EA, - , ET2, ES, ET1, EX1, ET0, EX0
/*---若要串行通信工作在中断的状态下,则按一下配置,否则不配置寄存器IE---*/
//EA = 1 ; //开总中断
//ES = 1 ; //允许串口ES产生中断
//4、配置定时器T1,产生自定的波特率
//4.1、配置定时器方式寄存器 TMOD :
// TMOD: GATE, C/T~, M1, M0,| GATE, C/T~, M1, M0 (T1 | T0)
TMOD = 0x20 ; //0010 0000 :T1 定时器 ,工作方式2: 8位自动重装定时器
//4.2、给定时器赋初值 :
TL1 = 0xFA ; //定时器T1产生波特率:9600
TH1 = TL1 ;
//4.3、配置 定时器/中断 控制寄存器 TCON :
// TCON: TF1, TR1, TF0, TR0,| IE1, IT1, IE0, IT0
TR1 = 1 ; //运行定时器T1
}
/******************************************************************************
* 名称:Serial_Receive()
* 功能:从串口接收一个字节的数据(8位)
* 参数:无
* 返回:unsigned char get_data :返回接收到的数据
******************************************************************************/
unsigned char Serial_Receive(void)
{
unsigned char get_data ;
if(RI == 1) //RI == 1 表示有数据从串口传来,暂时存放在SBUF寄存器中
{
RI = 0 ; //清空串行接收数据申请中断标志位
get_data = SBUF ;
P0 = get_data ; //P0口的LED灯显示从串口接收的数据
Serial_Send(get_data) ; //调用函数将接收到的数据通过串口发送出去
return get_data ; //将串口接收到那朵数据作为函数的返回值
}
}
/******************************************************************************
* 名称:Serial_Send()
* 功能:发送一个字节的数据(8位)
* 参数:unsigned char transmit :要发送的数据
* 返回:无
******************************************************************************/
void Serial_Send(unsigned char transmit)
{
SBUF = transmit ; //先将要发送的数据放到寄存器SBUF中
while(!TI) //等待数据发送完成,发送数据过程:TI == 0 ; 发送完毕:TI == 1 ;
{ ; }
TI = 0 ; //清空串行发送数据申请中断标志位
}
/******************************************************************************
===============================================================================
void main(void)函数部分
===============================================================================
*******************************************************************************/
void main(void)
{
Serial_Init() ; //初始化串口
while(1)
{
Serial_Receive(); //扫描方式从串口接收数据
}
}
/******************************************************************************
* 名称:
* 功能:
* 参数:
* 返回:
******************************************************************************/
2、串行通信,查询模式,单片机通过串口向发PC发数据,只发送,不接收
/******************************************************************************
* 说明:AT89S52芯片,12M晶振
* 串行通信,工作方式1,波特率可变
* 定时器T1产生波特率,工作方式2,8位自动重装
* (注意:定时器T1此时不能工作在中断的模式下)
* 本程序:单片机通过串口向发PC发数据,只发送,不接收
******************************************************************************/
#include
unsigned char str[40] = "
中南赵小龙
51单片机学习笔记
" ;
unsigned char Serial_Receive(void);
void Serial_Send(unsigned char transmit);
/******************************************************************************
* 名称:delay1ms()
* 功能:延时1ms
* 参数:int t
* 返回:无
******************************************************************************/
void delay1ms(int t)
{
unsigned char i ;
while(t--)
{
for(i = 0 ; i < 125 ; i++)
{
;
}
}
}
/******************************************************************************
* 名称:Serial_Init()
* 功能:初始化串口 ,工作方式1 ,波特率9600
* 参数:无
* 返回:无
******************************************************************************/
void Serial_Init(void)
{
/*-------------串行通信初始化,定时器T1产生波特率,工作方式2------------*/
//1、配置串口控制寄存器 SCON (98H)
// SCON : SM0, SM1, SM2, REN, TB8, RB8, TI, RI
SCON = 0x40 ; // 0100 0000 工作方式1,10位异步接发,波特率自定,
// 要用的位将其置 1 ;不用的位将其默认为 0 ;
// 起始位和停止位芯片自动加上和去掉,用户只需发送8位数据就行
// REN 串行口接收允许控制位 = 1 ,允许接收数据
// = 0 , 禁止接收数据
//2、配置电源控制寄存器 PCON (97H) 和波特率相关 , 寄存器PCON不能按位赋值
// PCON : SMOD, - , - , - , GF1, GF0, PD, IDL
PCON = 0x80 ; //波特率加倍 (不加倍,可不配置PCON,或 PCON = 0x00 ;)
//3、配置中断允许寄存器 IE (0A8H)
// IE: EA, - , ET2, ES, ET1, EX1, ET0, EX0
/*---若要串行通信工作在中断的状态下,则按一下配置,否则不配置寄存器IE---*/
//EA = 1 ; //开总中断
//ES = 1 ; //允许串口ES产生中断
//4、配置定时器T1,产生自定的波特率
//4.1、配置定时器方式寄存器 TMOD :
// TMOD: GATE, C/T~, M1, M0,| GATE, C/T~, M1, M0 (T1 | T0)
TMOD = 0x20 ; //0010 0000 :T1 定时器 ,工作方式2: 8位自动重装定时器
//4.2、给定时器赋初值 :
TL1 = 0xFA ; //定时器T1产生波特率:9600
TH1 = TL1 ;
//4.3、配置 定时器/中断 控制寄存器 TCON :
// TCON: TF1, TR1, TF0, TR0,| IE1, IT1, IE0, IT0
TR1 = 1 ; //运行定时器T1
}
/******************************************************************************
* 名称:Serial_Send()
* 功能:发送一个字节的数据(8位)
* 参数:unsigned char transmit :要发送的数据
* 返回:无
******************************************************************************/
void Serial_Send(unsigned char transmit)
{
SBUF = transmit ; //先将要发送的数据放到寄存器SBUF中
while(!TI) //等待数据发送完成,发送数据过程:TI == 0 ; 发送完毕:TI == 1 ;
{ ; }
TI = 0 ; //清空串行发送数据申请中断标志位
}
/******************************************************************************
===============================================================================
void main(void)函数部分
===============================================================================
*******************************************************************************/
void main(void)
{
unsigned char i ;
Serial_Init() ; //初始化串口
while(1)
{
i= 0 ;
while(str[i] != '
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮