- 打卡等级:初来乍到
- 打卡总天数:3
- 最近打卡:2024-08-30 08:32:15
新手上路
- 积分
- 43
|
本帖最后由 yishiliuye 于 2024-8-30 09:22 编辑
已解决,查阅数据手册,这款单片机使用外部晶振必须设置24M。
#include "STC15W.H"
#include "intrins.h"
#define FOSC 24000000L //系统频率
#define BAUD 115200 //串口波特率
#define NONE_PARITY 0 //无校验
#define ODD_PARITY 1 //奇校验
#define EVEN_PARITY 2 //偶校验
#define MARK_PARITY 3 //标记校验
#define SPACE_PARITY 4 //空白校验
#define PARITYBIT NONE_PARITY //定义校验位
#define S1_S0 0x40 //P_SW1.6
#define S1_S1 0x80 //P_SW1.7
bit busy;
sbit BT1 = P3^2; // 定义BT1按键接在P32
sbit BT2 = P3^3; // 定义BT2按键接在P33
void SendData(unsigned char dat);
void Delay1000ms(void);
void UartInit(void);
//void SendString(char *s);
void main()
{
PortSwitch();
UartInit();
while(1)
{
unsigned char dat1 = 0x51;
unsigned char dat2 = 0x54;
if (BT1 == 0) // 检测BT1是否被按下
{
while (BT1 == 0); // 消抖
SendData(dat1); // 发送字符'Q'
Delay1000ms();
}
if (BT2 == 0) // 检测BT2是否被按下
{
while (BT2 == 0); // 消抖
SendData(dat2); // 发送字符'T'
Delay1000ms();
}
}
}
/*----------------------------
Uart初始化程序
-----------------------------*/
void UartInit(void)
{
P0M0 = 0x00;
P0M1 = 0x00;
P1M0 = 0x00;
P1M1 = 0x00;
P2M0 = 0x00;
P2M1 = 0x00;
P3M0 = 0x00;
P3M1 = 0x00;
P4M0 = 0x00;
P4M1 = 0x00;
P5M0 = 0x00;
P5M1 = 0x00;
P6M0 = 0x00;
P6M1 = 0x00;
P7M0 = 0x00;
P7M1 = 0x00;
ACC = P_SW1;
ACC &= ~(S1_S0 | S1_S1); //S1_S0=1 S1_S1=0
ACC |= S1_S0; //(P3.6/RxD_2, P3.7/TxD_2)
P_SW1 = ACC;
#if (PARITYBIT == NONE_PARITY)
SCON = 0x50; //8位可变波特率
#elif (PARITYBIT == ODD_PARITY) || (PARITYBIT == EVEN_PARITY) || (PARITYBIT == MARK_PARITY)
SCON = 0xda; //9位可变波特率,校验位初始为1
#elif (PARITYBIT == SPACE_PARITY)
SCON = 0xd2; //9位可变波特率,校验位初始为0
#endif
T2L = (65536 - (FOSC/4/BAUD));//设置波特率重装值
T2H = (65536 - (FOSC/4/BAUD))>>8;
AUXR = 0x14; //T2为1T模式, 并启动定时器2
AUXR |= 0x01; //选择定时器2为串口1的波特率发生器
ES = 1; //使能串口1中断
EA = 1;
}
/*----------------------------
Delay 延时程序
-----------------------------*/
void Delay1000ms(void) //@11.0592MHz
{
unsigned char data i, j, k;
_nop_();
_nop_();
i = 43;
j = 6;
k = 203;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
/*----------------------------
UART 中断服务程序
-----------------------------*/
void Uart() interrupt 4
{
if (RI)
{
RI = 0; //清除RI位
P0 = SBUF; //P0显示串口数据
P22 = RB8; //P2.2显示校验位
}
if (TI)
{
TI = 0; //清除TI位
busy = 0; //清忙标志
}
}
/*----------------------------
串口数据发送程序
----------------------------*/
void SendData(unsigned char dat)
{
while (busy); //等待前面的数据发送完成
ACC = dat; //获取校验位P (PSW.0)
switch (PARITYBIT)
{
case ODD_PARITY:
TB8 = P;
break;
case EVEN_PARITY:
TB8 = !P;
break;
case MARK_PARITY:
TB8 = 1;
break;
case SPACE_PARITY:
TB8 = 0;
break;
case NONE_PARITY:
default:
break;
}
busy = 1;
SBUF = ACC; //写数据到UART数据寄存器
}
/*----------------------------
字符串发送程序
----------------------------*/
/*void SendString(char *s)
{
while (*s) //检测字符串结束标志
{
SendData(*s++); //发送当前字符
}
}*/
|
|