本篇文章记录我在准备单片机蓝桥杯大赛的过程中,对参赛板上的外设进行驱动和学习。这里将驱动板上外设的驱动底层代码分享给大家。主要包括基本的外设,数码管、流水灯、键盘、DS18B20、DS1302等。希望我的分享对你有所帮助!
目录
一、竞赛板仿真图
二、数码管驱动函数
以下代码是对应竞赛板的原理图写的数码管底层驱动函数。准备蓝桥杯的小伙伴可以将以下代码熟悉一下,这样到赛场上就能得心应手了。
#inlude"Seg.h"
unsigned char Seg_Dula[] = { 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00 }; //段选
unsigned char Seg_Wela[] = { 0xfe,0xfd,0xfb,0xf7,0xef,0xdf }; //位选
void Seg_Disp(unsigned char wela,dula)
{
P0 = 0x00; //消影
P2_6 = 1;
P2_6 = 0;
P0 = Seg_Wela[wela]; //位选
P2_7 = 1;
P2_7 = 0;
P0 = Seg_Dula[dula]; //段选
P2_6 = 1;
P2_6 = 0;
}
三、独立按键底层驱动函数
#include" Key.h "
unsigned char Key_Read()
{
unsigned char temp = 0;
if(P3_4 == 0) temp = 1;
if(P3_5 == 0) temp = 2;
if(P3_6 == 0) temp = 3;
if(P3_7 == 0) temp = 4;
return temp;
}
四、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;
}
}
五、Beep蜂鸣器
void Beep(unsigned char flag)
{
static unsigned char temp = 0x00;
static unsigned char temp_old = 0xff;
if(flag)
temp |= 0x40;
else
temp &= ~0x40;
if(temp != temp_old)
{
P0 = temp;
P2 = P2 & 0x1f | 0xa0;
P2 &= 0x1f;
temp_old = temp;
}
}
六、控制寄存器函数
void Relay(unsigned char flag)
{
static unsigned char temp = 0x00;
static unsigned char temp_old = 0xff;
if(flag)
temp |= 0x10;
else
temp &= ~0x10;
if(temp != temp_old)
{
P0 = temp;
P2 = P2 & 0x1f | 0xa0;
P2 &= 0x1f;
temp_old = temp;
}
}
七、串口通信函数
/* 串口初始化函数 */
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;
}
/* putchar重定向 */
extern char putchar(char ch)
{
SBUF= ch;//将dat数据赋给SBUF,将数据发送出去
while(TI == 0);//等待数据发送
TI = 0;//将发送标志位清零
return (ch);
}
八、DS18B20和DS1302驱动代码
关于这两个模块的驱动程序,大家可以在赛点资源包中获取。可参考我之前的文章:
九、主函数模板
/* 头文件声明区 */
#include <STC15F2K60S2.H>//单片机寄存器专用头文件
#include <Init.h>//初始化底层驱动专用头文件
#include <Led.h>//Led底层驱动专用头文件
#include <Key.h>//按键底层驱动专用头文件
#include <Seg.h>//数码管底层驱动专用头文件
#include <Uart.h>//串口底层驱动专用头文件
#include <stdio.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 = 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 == 10) Key_Slow_Down = 0;//键盘减速专用
if(++Seg_Slow_Down == 500) Seg_Slow_Down = 0;//数码管减速专用
if(++Uart_Slow_Down == 200) Uart_Slow_Down = 0;//串口减速专用
if(++Seg_Pos == 8) Seg_Pos = 0;//数码管显示专用
Seg_Disp(Seg_Pos,Seg_Buf[Seg_Pos],Seg_Point[Seg_Pos]);
Led_Disp(Seg_Pos,ucLed[Seg_Pos]);
}
/* 串口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();
}
}
十、结语
关于蓝桥杯单片机大赛整理的一些资料我已经上传到学习交流群中,需要的读者可以自行进群领取:821817298