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] != '