软件准备:蓝桥杯开发板学习——软件准备及芯片包安装
所用实验板原理图:蓝桥杯国信长天单片机--原理图详解
头文件引用:蓝桥杯单片机比赛工程头文件引用reg52.h和STC15F2K60S2.h的区别
【基础 12】串行接口的基本操作
新建工程,以 I/O 模式编写代码,在 CT107D 单片机综合训练平台上,实现以下功能:
1、初始化串口为模式 1,即 8 位 UART 模式,波特率 9600,允许接收。
2、数据发送采用查询方式,数据接收采用中断方式。
3、系统上电初始化之后,单片机向上位机发送两个字节: 0x5a 和 0xa5(串口助手以十六进制 HEX 发送和显示)。
4、串口每成功接收到一个字节后,在该字节基础上加 1, 然后通过串口发送回上位机。
5、注意 89C52 单片机和 IAP15F2K61S2 单片机串口应用的 差别,使用 9600 波特率时,晶振时钟选择 11.0592MHz。
【训练要点】: 串口的初始化与数据收发基础。
#include <STC15F2K60S2.H>
unsigned char urdate;
void InitUart()
{
TMOD = 0x20;
TH1 = 0xfd;
TL0 = 0xfd;
TR1 = 1;
SCON = 0x50;
AUXR = 0x00;
ES = 1;
EA = 1;
}
void SendBit(unsigned char dat)
{
SBUF = dat;
while(TI == 0);
TI = 0;
}
void ServiceUart() interrupt 4
{
if(RI == 1)
{
RI = 0;
urdate = SBUF;
SendBit(urdate + 1);
}
}
void main()
{
InitUart();
SendBit(0x5a);
SendBit(0xa5);
while(1)
{
}
}
【基础 13】串行接口的进阶应用
新建工程,以 I/O 模式编写代码,在 CT107D 单片机综合训练平台上,实现以下功能:
1、初始化串口为模式 1,即 8 位 UART 模式,波特率 9600,允许接收。
2、数据发送采用查询方式,数据接收采用中断方式。
3、系统上电后,关闭蜂鸣器,关闭继电器,关闭 8 个 LED 灯,通过串口向上位机发送 字符串:“Welcome to XMF system!”,回车换行。
4、上位机通过串口发送单字节命令,控制单片机的 8 个 LED 灯开关,单片机响应正确 的控制命令后,完成相应的灯光操作。
5、上位机通过串口发送单字节命令,读取单片机运行信息,单片机响应正确的读取命 令后,向上位机返回指定的信息。
6、上位机与单片机的通信规约如下表:
【训练要点】: 串口数据收发联合单片机控制的综合应用。
#include <STC15F2K60S2.H>
void SelectHC537(unsigned char a)
{
switch(a)
{
case 4:
P2 = (P2 & 0x1f) | 0x80;
break;
case 5:
P2 = (P2 & 0x1f) | 0xa0;
break;
case 6:
P2 = (P2 & 0x1f) | 0xc0;
break;
case 7:
P2 = (P2 & 0x1f) | 0xe0;
break;
case 0:
P2 = (P2 & 0x1f) | 0x00;
break;
}
}
void InitSystem()
{
SelectHC537(5);
P0 = 0x00;
SelectHC537(4);
P0 = 0xff;
}
/串口
void InitUart()
{
TMOD = 0x20;
TH1 = 0xfd;
TL1 = 0xfd;
TR1 = 1;
SCON = 0x50;
AUXR = 0x00;
ES = 1;
EA = 1;
}
unsigned char command = 0x00;
void ServiceUart() interrupt 4
{
if(RI == 1)//接收 检测
{
command = SBUF;
RI = 0;
}
}
void SendUart(unsigned char dat)//发送
{
SBUF = dat;
while(TI == 1);
TI = 0;
}
void SendString(unsigned char *str)
{
while(*str != '\0')
{
SendUart(*str++);
}
}
/
void Working()
{
if(command != 0x00)
{
switch(command & 0xf0)
{
case 0xa0:
P0 = (P0 | 0x0f) & (~command | 0xf0);
command = 0x00;
break;
case 0xb0:
P0 = (P0 | 0xf0) & ((~command << 4)| 0x0f);
command = 0x00;
break;
case 0xc0:
SendString("The system is Running!\r\n");
command = 0x00;
break;
}
}
}
void main()
{
InitSystem();
InitUart();
SendString("Welcome to system!\r\n");
while(1)
{
Working();
}
}
【基础 14】存储器映射扩展技术应用
新建工程,以 MM 模式编写代码,在 CT107D 单片机综合训练平台上,实现以下功能:
1、系统上电后,关闭蜂鸣器,关闭继电器,关闭 8 个 LED 灯。
2、循环实现以下功能: 首先,点亮指示灯低 4 位,关闭高 4 位,延时片刻; 接着,点亮指示灯的高 4 位,关闭低 4 位,延时片刻; 然后,关闭所有指示灯。 接着,依次逐个点亮数码管的所有段码,每次只点亮一个数码管。
3、外部扩展资源的地址映射关系:
4、关于 CT107D 存储器映射扩展 MM 编程模式的设计提示: CT107D 平台的 J13 要将 1-2 脚短接,选择 MM 模式。 程序中引入头文件“absacc.h”,通过 XBYTE 关键字来直接操作扩展资源。 存储器映射扩展方式要占用单片机的 P3.6 引脚。
【训练要点】: 通过 MM 模式编程,访问 CT107D 上面的扩展外部设备。
#include <STC15F2K60S2.H>
#include "absacc.h"
void Delay(unsigned int t)
{
while(t--);
while(t--);
}
void LEDRuning()
{
XBYTE[0x8000] = 0xf0;
Delay(60000);
Delay(60000);
XBYTE[0x8000] = 0x0f;
Delay(60000);
Delay(60000);
XBYTE[0x8000] = 0xff;
Delay(60000);
Delay(60000);
}
void SMGRunning()
{
unsigned char i;
for(i = 0; i < 8; i++)
{
XBYTE[0xc000] = 0x01 << i;
XBYTE[0xe000] = 0x00;
Delay(60000);
Delay(60000);
}
XBYTE[0xe000] = 0xff;
Delay(60000);
Delay(60000);
}
void main()
{
while(1)
{
LEDRuning();
SMGRunning();
}
}