1953 字
10 分钟
【蓝桥杯】03 - 考点复盘
一、LED模块
1.LED底层代码
void Led_Disp(unsigned char addr, enable){ static unsigned char temp = 0x00; static unsigned char temp_old = 0xff; if (enable) temp |= 0x01 << addr; else temp &= ~(0x01 << addr); if (temp != temp_old) { P0 = ~temp; P2 = P2 & 0x1f | 0x80; P2 &= 0x1f; temp_old = temp; }}2.基本调用方式
ucLED[n]=x;
中断程序{ Led_Disp(Nixie_Pos,ucLED[Nixie_Pos]);}二、按键模块
1.按键底层代码
unsigned char Key_Read(){ unsigned char temp = 0; ET0 = 0; P44 = 0;P42 = 1;P35 = 1;P34 = 1; if(P332.基本调用方式
switch(Key_Down)//下降沿{ case X:
break;}2.3 模式切换

第十届省赛真题

第十二届省赛真题
2.4 参数设置

第九届省赛真题

第八届省赛真题
2.5 参数保存

第五届省赛真题

第十一届省赛真题
2.6 特定使能

第十一届省赛真题
2.7 长按跳转 松手返回

第八届省赛真题
2.8 键盘输入

模拟训练二
2.9 长按短按 效果不同

三、数码管模块
1.数码管底层代码
unsigned char seg_dula[] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff};unsigned char seg_wela[] = {0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
void Seg_Disp(unsigned char wela,dula,point){ P0 = 0xff; P2 = P2 & 0x1f | 0xe0; P2 &= 0x1f;
P0 = seg_wela[wela]; P2 = P2 & 0x1f | 0xc0; P2 &= 0x1f;
P0 = seg_dula[dula]; if(point) P0 &= 0x7f; P2 = P2 & 0x1f | 0xe0; P2 &= 0x1f;}2.基本调用方式
Seg_Buf[X] = Y;Seg_Point[X] = Y;3.3 显示整数变量

第十二届省赛真题
3.4 显示小数点变量

第十二届省赛真题
3.5 不同状态显示不同内容

第十二届省赛真题
3.6 高位熄灭

第十届省赛真题
3.7 选中单元闪烁

第八届省赛真题
四、继电器蜂鸣器
1.底层代码
static unsigned char temp_1 = 0x00;static unsigned char temp_old_1 = 0xff;
void Beep(unsigned char flag){ if(flag) temp_1 |= 0x40; else temp_1 &= ~0x40; if(temp_1 != temp_old_1) { P0 = temp_1; P2 = P2 & 0x1f | 0xa0; P2 &= 0x1f; temp_old_1 = temp_1; }}
void Relay(unsigned char flag){ if(flag) temp_1 |= 0x10; else temp_1 &= ~0x10; if(temp_1 != temp_old_1) { P0 = temp_1; P2 = P2 & 0x1f | 0xa0; P2 &= 0x1f; temp_old_1 = temp_1; }}…
NE555
绑定定时器0,应采用计数器模式
超声波
1.超声波底层代码
void Delay12us() //@12.000MHz{ unsigned char i;
_nop_(); _nop_(); i = 33; while (--i);}
void Ut_Wave_Init() //超声波初始化函数 产生8个40Mhz的方波信号{ unsigned char i; for(i=0;i<8;i++) { Tx = 1; Delay12us(); Tx = 0; Delay12us(); }}
unsigned char Ut_Wave_Data() //超声波距离读取函数{ unsigned int time;//时间储存变量 TMOD &= 0x0f;//配置定时器1计时模式 TH1 = TL1 = 0;//复位计数值 等待超声波信号发出 Ut_Wave_Init();//发送超声波信号 TR1 = 1;//开始计时 while((Rx2.PCA写法
unsigned char Ut_Wave_Data() //超声波距离读取函数{ unsigned int time;//时间储存变量 CMOD = 0x00;//配置PCA工作模式 CH = CL = 0;//复位计数值 等待超声波信号发出 Ut_Wave_Init();//发送超声波信号 CR = 1;//开始计时 while((Rx串口
1.串口底层
/* 串口初始化函数 */void UartInit(void) //9600bps@12.000MHz{ SCON = 0x50; //8位数据,可变波特率 AUXR |= 0x01; //串口1选择定时器2为波特率发生器 AUXR |= 0x04; //定时器时钟1T模式 T2L = 0xC7; //设置定时初始值 T2H = 0xFE; //设置定时初始值 AUXR |= 0x10; //定时器2开始计时 ES = 1; EA = 1;}
/* 字节发送函数 */void SendByte(unsigned char dat){ SBUF=dat;//将dat数据赋给SBUF,将数据发送出去 while(TI**2. **串口接收数据
模拟题


**3. **串口发送数据
模拟题


- 内存溢出:idata/xdata/data/code
第三部分 大模板
一、头文件声明区域
/* 头文件声明区 */#include <STC15F2K60S2.H>//单片机寄存器专用头文件
#include <Init.h>//初始化底层驱动专用头文件
#include <Led.h>//Led底层驱动专用头文件
#include <Key.h>//按键底层驱动专用头文件
#include <Seg.h>//数码管底层驱动专用头文件
#include <Uart.h>//串口底层驱动专用头文件二、变量声明区域
/* 变量声明区 */
unsigned char Key_Val,Key_Down,Key_Old,Key_Up;//按键专用变量
unsigned char Key_Slow_Down;//按键减速专用变量
unsigned char Seg_Buf[8] = {10,10,10,10,10,10,10,10};//数码管显示数据存放数组
unsigned char Seg_Point[8] = {0,0,0,0,0,0,0,0};//数码管小数点数据存放数组
unsigned char Seg_Pos;//数码管扫描专用变量
unsigned int Seg_Slow_Down;//数码管减速专用变量
unsigned char ucLed[8] = {0,0,0,0,0,0,0,0};//Led显示数据存放数组
unsigned char Uart_Slow_Down;//串口减速专用变量
unsigned char Uart_Recv[10];//串口接收数据储存数组 默认10个字节 若接收数据较长 可更改最大字节数
unsigned char Uart_Recv_Index;//串口接收数组指针
unsigned char Uart_Send[10];//串口接收数据储存数组 默认10个字节 若发送数据较长 可更改最大字节数三、按键处理函数
/* 键盘处理函数 */
void Key_Proc()
{
if(Key_Slow_Down) return;//作用:使得程序在每次定时扫描过程只执行一次,即Key_Slow_Down=0时立即置1,向下执行。
Key_Slow_Down = 1;//键盘减速程序
Key_Val = Key_Read();//实时读取键码值
Key_Down = Key_Val & (Key_Old ^ Key_Val);//捕捉按键下降沿
Key_Up = ~Key_Val & (Key_Old ^ Key_Val);//捕捉按键上降沿
Key_Old = Key_Val;//辅助扫描变量
}四、信息处理函数
/* 信息处理函数 */
void Seg_Proc()
{
if(Seg_Slow_Down) return;
Seg_Slow_Down = 1;//数码管减速程序
}五、其他显示函数
/* 其他显示函数 */
void Led_Proc()
{
}六、串口处理函数
/* 串口处理函数 */
void Uart_Proc()
{
if(Uart_Slow_Down) return;
Uart_Slow_Down = 1;//串口减速程序
}七、定时器初始化函数
/* 定时器0中断初始化函数 */
void Timer0Init(void) //1毫秒@12.000MHz
{
AUXR &= 0x7F; //定时器时钟12T模式
TMOD &= 0xF0; //设置定时器模式
TL0 = 0x18; //设置定时初始值
TH0 = 0xFC; //设置定时初始值
TF0 = 0; //清除TF0标志
TR0 = 1; //定时器0开始计时
ET0 = 1; //定时器中断0打开
EA = 1; //总中断打开
}八、中断服务函数
/* 定时器0中断服务函数 */
void Timer0Server() interrupt 1
{
if(++Key_Slow_Down九、串口服务函数
/* 串口1中断服务函数 */
void Uart1Server() interrupt 4
{
if(RI == 1) //串口接收数据
{ Uart_Recv[Uart_Recv_Index] = SBUF; Uart_Recv_Index++; RI = 0; }}十、主函数
/* Main */
void main()
{
System_Init();
Timer0Init();
UartInit();
while (1)
{
Key_Proc();
Seg_Proc();
Led_Proc();
Uart_Proc();
}
} 【蓝桥杯】03 - 考点复盘
http://www.turinblog.cn/posts/蓝桥杯03---考点复盘/