单片机蓝桥杯实训(二)—— 底层驱动模块代码

 

本篇文章记录我在准备单片机蓝桥杯大赛的过程中,对参赛板上的外设进行驱动和学习。这里将驱动板上外设的驱动底层代码分享给大家。主要包括基本的外设,数码管、流水灯、键盘、DS18B20、DS1302等。希望我的分享对你有所帮助!

目录

一、竞赛板仿真图 

二、数码管驱动函数 

三、独立按键底层驱动函数

四、LED灯显示函数

五、Beep蜂鸣器

六、控制寄存器函数

七、串口通信函数

八、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驱动代码 

关于这两个模块的驱动程序,大家可以在赛点资源包中获取。可参考我之前的文章:

单片机蓝桥杯实训(一)—— 初步了解赛点(省赛)资源包_蓝桥杯2023年单片机赛点资源包-CSDN博客

九、主函数模板

/* 头文件声明区 */
#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

 

 

 

  • 8
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
蓝桥杯单片机设计与开发实训指导PDF》是一份提供蓝桥杯单片机设计与开发实训指导的电子书。该指导书的目的是帮助参加蓝桥杯的学生在单片机设计与开发方面获得必要的知识和技能。 该指导书主要分为以下几个方面:理论基础、实训项目、实训操作指导和实验报告要求等。 在理论基础篇中,指导书介绍了单片机的基本概念和原理,包括常见的单片机类型、单片机的工作原理和基本应用等。学生可以通过阅读这些内容了解单片机的工作原理和基本功能。 在实训项目篇中,指导书给出了一些常见的实训项目,如LED灯控制、温度检测、蜂鸣器控制等。学生可以按照指导书中的项目要求进行实训,并运用所学的知识进行设计与开发。 在实训操作指导篇中,指导书详细介绍了每个实训项目的具体操作步骤和注意事项。学生可以通过按照指导书的步骤进行实操,熟悉单片机的操作方法和常用编程语言。 最后,在实验报告要求篇中,指导书给出了实验报告的撰写要求和模板。学生需要按照指导书的要求进行实验报告的撰写,并对实验过程和结果进行详细的描述和分析。 总而言之,《蓝桥杯单片机设计与开发实训指导PDF》是一份提供蓝桥杯单片机设计与开发实训指导的电子书,通过阅读指导书的内容,学生可以掌握单片机的基本知识和技能,并通过实训项目的操作和实验报告的撰写来提高自己的实践能力。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小小_扫地僧

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值