搜档网
当前位置:搜档网 › 8051F330按键发送串口数据程序

8051F330按键发送串口数据程序

/************************************************************************************/
/* 实验平台:C8051F330核心板
/* 功能说明:1、串口波特率设置为115200,使用内部晶振24.5MHz;
2、按下S2则发送从串口发送"ABC",同时点亮LED;
3、按下S3则发送从串口发送"abc",同时点亮LED。

/************************************************************************************/

#include "c8051f330.h"

#define BAUDRATE 115200 //串口波特率,需要更改波特率时,在此更改数值即可
#define SYSCLK 24500000UL //采用内部晶振时,系统的时钟频率为12000000Hz

sbit S2=P1^7; // S ='0' 表示按键被按下
sbit S3=P1^6; // S ='0' 表示按键被按下

sbit LED2=P2^0; // LED ='0' 表示亮灯,LED ='1' 表示灭灯

#define Led2On() LED2=0
#define Led2Off() LED2=1

bit uartSending=0; //全局变量,标志串口是否正处于发送中(忙状态)

/********************************************************************
函数功能:延时函数。
入口参数:x:循环次数。
返 回:无。
备 注:无。
********************************************************************/
void Delay (unsigned int x)
{
while(--x);
}
//////////////////////////Pino Electronics///////////////////////////

/********************************************************************
函数功能:内部晶振配置。
入口参数:无。
返 回:无。
备 注:无。
********************************************************************/
void InitOSC(void)
{
OSCICN |= 0x03; //系统时钟选择为内部振荡器不分频,即24.5M
RSTSRC = 0x04; // 开启丢失时钟检测
}
//////////////////////////Pino Electronics///////////////////////////

/********************************************************************
函数功能:初始化串口0。
入口参数:无。
返 回:无。
备 注:无。
********************************************************************/
void InitUart0(void)
{
if (SYSCLK/BAUDRATE/2/256 < 1) {
TH1 = -(SYSCLK/BAUDRATE/2);
CKCON &= ~0x0B; // T1M = 1; SCA1:0 = xx
CKCON |= 0x08;
} else if (SYSCLK/BAUDRATE/2/256 < 4) {
TH1 = -(SYSCLK/BAUDRATE/2/4);
CKCON &= ~0x0B; // T1M = 0; SCA1:0 = 01
CKCON |= 0x01;
} else if (SYSCLK/BAUDRATE/2/256 < 12) {
TH1 = -(SYSCLK/BAUDRATE/2/12);
CKCON &= ~0x0B; // T1M = 0; SCA1:0 = 00
} else {
TH1 = -(SYSCLK/BAUDRATE/2/48);
CKCON &= ~0x0B; // T1M = 0; SCA1:0 = 10
CKCON |= 0x02;
}

/*初始化定时器1*/
TMOD|=0x20; //定时器1工作在8位自动重装方式
TL1=0;
TR1=1;

/*初始化串口*/
S0MODE=0; //8位的UART工作方式
REN0=1; //接收允许
PS0=1; //为了在中断里输出字符,串口的优先级设为最高
ES0=1; //打开串口中断

/*配置引脚*/
P0MDOUT |= 0x10; /

/串口TXD引脚配置为推挽输出方式,用于UART发送端
XBR0|=0x01; //在外设连接寄存器0上把UART0连接到引脚P0.4和P0.5
}
//////////////////////////Pino Electronics///////////////////////////

/********************************************************************
函数功能:发送一个byte的数据。
入口参数:x:待发送的数据。
返 回:无。
备 注:无。
********************************************************************/
void Printc(unsigned char x)
{
while(uartSending); //等待发送完毕
SBUF0=x; //将数据写入到串口缓冲
uartSending=1; //设置发送标志
}
//////////////////////////Pino Electronics///////////////////////////

/********************************************************************
函数功能:主函数。
入口参数:无。
返 回:无。
备 注:无。
********************************************************************/
main(void)
{
bit key2_down_flag=0;
bit key3_down_flag=0;

PCA0MD &= ~0x40; //WDTE = 0 关闭看门狗,上电默认打开
EA=0;

/*配置引脚*/
P2MDOUT=0x01; //P2.0设为推挽输出方式,用于点亮LED
XBR1= 0x40; //打开交叉开关,使能弱上拉,要使GPIO生效,必须打开交叉开关

InitOSC(); //晶振配置
InitUart0(); //初始化串口
EA=1; //允许所有中断

while (1){
if (S2 == 0){ //按下S2则发送从串口发送"ABC"
if(!key2_down_flag){
Printc('A');
Printc('B');
Printc('C');
key2_down_flag=1;
Led2On(); // Turn on LED2
}
}else{
key2_down_flag=0;
Led2Off(); // Else, turn it off
}

if (S3 == 0){ //按下S3则发送从串口发送"abc"
if(!key3_down_flag){
Printc('a');
Printc('b');
Printc('c');
key3_down_flag=1;
//Led3On(); // Turn on LED3
}
}else{
key3_down_flag=0;
//Led3Off(); // Else, turn it off
}
Delay(3000);
}// end of while(1)
}
//////////////////////////Pino Electronics///////////////////////////

/********************************************************************
函数功能:串口中断处理。
入口参数:无。
返 回:无。
备 注:无。
********************************************************************/
/*串口中断服务程序*/
void Uart0ISR(void) interrupt 4
{
if(TI0)
{
TI0=0; //清除发送标志位
uartSending=0;
}
else
RI0=0;
}
//////////////////////////Pino Electronics///////////////////////////

相关主题