蓝桥杯单片机-赛前总结

2023-05-16

目录

一、省赛中开发平台涉及的模块:

1、IIC驱动

2、DS1302驱动

3、onewire驱动

4、定时器读取NE555频率

二、一些功能性操作

1、外部中断

2、矩阵按键

3、PWM输出

4、毫秒延时函数

三、需要注意的一些点


一、省赛中开发平台涉及的模块:

1、AT24C02                       IIC驱动
2、PCF8591                       IIC驱动
3、DS1302                         DS1302驱动
4、DS18B20                      ONEWIRE驱动
5、定时器读取NE555频率

1、IIC驱动

在IIC中读取PCF的数据和读取AT24C02的数据是一样的步骤

只是这两个器件的地址不一样                              [ 助记: 亵渎(先写后读)]

        AT24C02的写地址0xa0,读地址是0xa1      [ 助记:Aa]           该地址前四位由厂家规定    

        PCF的写地址是0x90,读地址是0x91          [ 助记:C9]           该地址前四位由厂家规定

unsigned char read_adc(unsigned char channel)
{
	unsigned char dat;
	IIC_Start();
	IIC_SendByte(0x90);
	IIC_WaitAck();
	IIC_SendByte(channel);
	IIC_WaitAck();
	IIC_Stop();
	
	IIC_Start();
	IIC_SendByte(0x91);
	IIC_WaitAck();
	dat=IIC_RecByte();
	IIC_Stop();	
	
	return dat;
}

unsigned char read_eeprom(unsigned char addr)
{
	unsigned char dat;
	IIC_Start();
	IIC_SendByte(0xa0);
	IIC_WaitAck();
	IIC_SendByte(addr);
	IIC_WaitAck();
	IIC_Stop();
	
	IIC_Start();
	IIC_SendByte(0xa1);
	IIC_WaitAck();
	dat=IIC_RecByte();
	IIC_Stop();	
	
	return dat;
}

ERPROM的写函数

unsigned char write_eeprom(unsigned char addr,unsigned char dat)
{
	IIC_Start();
	IIC_SendByte(0xa0);
	IIC_WaitAck();
	IIC_SendByte(addr);
	IIC_WaitAck();
	IIC_SendByte(dat);
	IIC_WaitAck();
	IIC_Stop();	
}

notes:EEPROM的写读之间一定要有延时

DAC的设置函数

void set_dac(unsigned char dat)
{
	IIC_Start();
	IIC_SendByte(0x90);
	IIC_WaitAck();
	IIC_SendByte(0x40);    //使能模拟输出端
	IIC_WaitAck();
	IIC_SendByte(dat);
	IIC_WaitAck();
	IIC_Stop();
}


   

2、DS1302驱动

写的第一个地址是0X80,读的第一个地址是0X81

unsigned char code WRITE_ADDR[]={0X80,0X82,0X84};
unsigned char code READ_ADDR[]={0X81,0X83,0X85};
unsigned char TIME[]={0X12,0X00,0X10};	//秒分时

void DS1302_Init()
{
	unsigned char i;
	Write_Ds1302_Byte(0x8e,0x00);
	for(i=0;i<3;i++)
	{
		Write_Ds1302_Byte(WRITE_ADDR[i],TIME[i]);
	}
	Write_Ds1302_Byte(0x8e,0x80);
}

void DS1302_Read()
{
	unsigned char i;
	for(i=0;i<3;i++)
	{
		TIME[i]=Read_Ds1302_Byte(READ_ADDR[i]);
	}
}

notes:只有写数据需要在控制寄存器0X8e设置允许(0x00)和禁止(0x80)写入,读操作不需要

3、onewire驱动

往年的驱动都需要改延时,函数变量扩大四倍。初始化的最后一个延时改为18

然后

unsigned int read_temp()
{
	unsigned int value_l,value_h,value;
	init_ds18b20();
	Write_DS18B20(0xcc);    //跳过ROM指令
	Write_DS18B20(0x44);    //启动温度转换
	init_ds18b20();
	Write_DS18B20(0xcc);
	Write_DS18B20(0xbe);    //读取s pad的数值
	value_l=Read_DS18B20();
	value_h=Read_DS18B20();
	value=value_h<<8;
	value+=value_l;
	value=value*6.25+0.5;	//*6.25是扩大了100倍的数据
	return value;
}

4、定时器读取NE555频率

设置定时器时一定要仔细(修改TOMD,TR0,允许中断),设置完后记得初始化

void Timer0Init(void)		//0毫秒@12.000MHz
{
	AUXR |= 0x80;		//定时器时钟1T模式
	TMOD |= 0x05;		//0x04 0x05都可;与运算
	TL0 = 0x00;		//设置定时初始值
	TH0 = 0x00;		//设置定时初始值
	TF0 = 0;		//清除TF0标志
	TR0 = 0;		
}
void Timer1Init(void)		//1毫秒@12.000MHz
{
	AUXR |= 0x40;		//定时器时钟1T模式
	TMOD &= 0x0F;		//设置定时器模式
	TL1 = 0x20;		//设置定时初始值
	TH1 = 0xD1;		//设置定时初始值
	TF1 = 0;		//清除TF1标志
	TR1 = 1;		//定时器1开始计时
	
	ET1=1;
	EA=1;
}

void TIME1() interrupt 3
{
	value++;
	if(value==500)
	{
		TR0 = 0;
		value=0;
		fre=TH0<<8;
		fre+=TL0;
		TH0=0;
		TL0=0;
		TR0=1;
	}
}

二、一些功能性操作

1、外部中断

EX0对应S5

P33=P32=P31=P30=1;

void EXO_INIT()        //记得放入main初始化
{
    IT0=1;    //下降沿触发
    ET0=1;
    EA=1;
}

void EX0_SERVICE() interrupt
{
    
}

2、矩阵按键

P37映射为P44,P36映射为P42 

当P34与SINGAL相接时,会影响矩阵键盘最右边的一列

可以利用while实现“按一次按键,操作只执行一次”

我的按键写法:先令横(H)为1 ,S为0   (简便易更改)

sbit H1=P3^0;
sbit H2=P3^1;
sbit H3=P3^2;
sbit H4=P3^3;
sbit S1=P4^4;
sbit S2=P4^2;
sbit S3=P3^5;
sbit S4=P3^4;


void matrix_scan()		
{
	S1=S2=S3=S4=0;H1=H2=H3=H4=1;
	if(H1==0)
	{
		delay(5);
		if(H1==0)
		{
			H1=0;
			S1=S2=S3=S4=1;
			if(S1==0)key_value=1;
			else if(S2==0)key_value=2;
			else if(S3==0)key_value=3;
			else if(S4==0)key_value=4;
		}
	}
	if(H2==0)
	{
		delay(5);
		if(H2==0)
		{
			H2=0;
			S1=S2=S3=S4=1;
			if(S1==0)key_value=5;
			else if(S2==0)key_value=6;
			else if(S3==0)key_value=7;
			else if(S4==0)key_value=8;
		}
	}
	if(H3==0)
	{
		delay(5);
		if(H4==0)
		{
			H4=0;
			S1=S2=S3=S4=1;
			if(S1==0)key_value=9;
			else if(S2==0)key_value=10;
			else if(S3==0)key_value=11;
			else if(S4==0)key_value=12;
		}
	}
	if(H4==0)
	{
		delay(5);
		if(H4==0)
		{
			H4=0;
			S1=S2=S3=S4=1;
			if(S1==0)key_value=13;
			else if(S2==0)key_value=14;
			else if(S3==0)key_value=15;
			else if(S4==0)key_value=16;
		}
	}
}

3、PWM输出

uint tim_count=0;

void Timer0Init(void)		//1毫秒@12.000MHz
{
	AUXR |= 0x80;		//定时器时钟1T模式
	TMOD &= 0xF0;		//设置定时器模式
	TL0 = 0x20;		//设置定时初始值
	TH0 = 0xD1;		//设置定时初始值
	TF0 = 0;		//清除TF0标志
	TR0 = 1;		//定时器0开始计时

    ET0=1;
    EA=1;
}

void Time0_serve() interrupt 1        //使LED在亮度减弱(频率100hz)
{
    ++tim_count;
    if(tim_count==10)tim_count=0;
    else if(tim_count<=3){P2&=0X1F;P2|=0X80;P0=0X00;}    
    else if(tim_count>3&&tim_count<=10){P2&=0X1F;P2|=0X80;P0=0Xff;}
}

4、毫秒延时函数

void delay(uint ms)
{
    uint i,j;
    for(i=ms;i<ms;i++)
    {
        for(j=0;j<845;j++);
    }
}

三、需要注意的一些点

1、pwm的频率要大于60hz,效果才比较好

2、温度读取要用uint类型的数据

3、Read_DS18B20()函数先读取的是第Byte0(低八位),再次调用的时候读取的是Byte1。注意先后顺序

4、写矩阵键盘时注意P36 P37分别映射为P42 P44

5、定时器读频率时记得将SIGNAL与P34端接

6、判断变量的范围,不可直接if(0<adc_value<60),需要if(0<adc_value&&adc_value<60)

7、LED灯轮转时,若无延时,则会出现八个LED灯全部高频微闪的现象

8、更改Time[]的数值后,要将Time的数值重新写如芯片中

9、可以直接将十进制数与十六进制数进行比较

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

蓝桥杯单片机-赛前总结 的相关文章

  • Windows与Ubuntu之间通过网线传输文件

    一 windows与Ubuntu之间网线直连搭建局域网 把网线连好后 xff0c 在两个系统中做以下设置 Windows下的配置 右键右下角的网络图标 xff08 或者右键网络 属性 xff09 更改适配器设置 以太网 右键属性 TCP I
  • Jetson TX2——CAN口的使用

    Jetson TX2 之CAN口的使用 TX2上有2个CAN控制器 xff0c CAN控制器需要通过CAN收发器连接到物理总线上 具体参阅原理图和相关技术参考手册 下载地址 xff1a https developer nvidia com

随机推荐

  • Jetson TX2——串口的使用(TTL-RS485)

    Jetson TX2之串口的使用 xff08 TTL RS485 xff09 TX2串口设备 TX2 有5个 UARTs 到主连接器 其中UART3 用于 WLAN BT 有关 UARTs 的典型任务 请参见下表 查看可用串口设备 xff1
  • 面试题知识点全纪录---容器

    注意 xff1a 该博客仅是本人对掌握知识的测试 xff0c 具体内容请移步guide哥网站 xff01 xff01 xff01 https snailclimb gitee io javaguide 链接 JAVA集合框架 https w
  • 高并发-消息队列

    一 消息队列 消息队列在分布式系统中主要是为了解耦和削峰 什么是消息队列 我们可以把消息队列看作是一个存放消息的容器 xff0c 当我们需要使用消息的时候 xff0c 直接从容器中取出消息供自己使用即可 消息队列是分布式系统中重要的组件之一
  • Ublox-M8N GPS接收机UBX协议解析

    Ublox M8N GPS接收机UBX协议解析 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61
  • Java清空List方法

    1 用list clear 方法清空list xff1b 用此方法 xff0c 其它引用该list的值也会变成空 2 用list 61 null来清空list 3 new ArrayList 来清空list
  • fastjson用java转json时间的格式化

    一 项目中需求遇到需要接收其他应用数据 xff0c 通过 64 RequestBody注解接收参数后 xff0c 到本地利用fastJson把json格式化 需要注意一下几点 xff1a 需要在调用JSON toJSONString 的时候
  • 工具类里面调用service接口或者mapper接口

    我们在开发中经常会遇到需要将一些频繁进行的操作抽取封装到工具类中 xff0c springboot不支持注入静态属性 所以在工具类中使用 64 Autowired或者其他注解自动注入会失败 xff0c 才用如下方法这可以避免注入失败 spa
  • windows下停止【kill】nginx命令

    杀死nginx taskkill fi 34 imagename eq nginx EXE 34 f taskkill f t im nginx exe stop bat taskkill f t im nginx exe pause
  • 基本类型对应的缓冲池

    基本类型对应的缓冲池如下 xff1a boolean values true and false all byte values short values between 128 and 127 int values between 128
  • 记录JVM中Eden区、Survivor from区和Survivor to区及Minor GC和Major GC的理解

    仅做学习笔记 JVM中Eden区 Survivor from区和Survivor to区 本文主要根据 深入理解JVM 中内存回收策略 xff0c 主要关注如下五个方面 xff1a 1 xff1a Eden区分配 2 xff1a 大对象直接
  • ubuntu下修改python默认版本的方法

    Ubuntu安装之后会面临多个python版本共存的问题 xff08 python2和python3 xff09 xff0c 但是有时候安装其他库的时候会安装在默认的python版本环境下 xff08 比如 xff0c 通常默认版本是pyt
  • C++:C语言实现HTTP的GET和POST请求

    https www cnblogs com diligenceday p 6255788 html
  • Linux C/C++ UDP Socket 网络通信

    Python微信订餐小程序课程视频 https edu csdn net course detail 36074 Python实战量化交易理财系统 https edu csdn net course detail 35475 昨晚 Vv 让
  • Xcode工程创建多个target

    Xcode工程创建多个target 小菜本人有时候会在一个Xcode工程中新建多个包含main函数的 m文件用于用于学习Objective C xff0c 于是要用到target这个东西 target对应于一个可运行文件和一些编译配置 点击
  • JLINK简介

    一 什么是JLINK JLINK是一个兼容JTAG的仿真器 xff0c 作用是烧入程序和Debug 二 JLINK是如何处理数据的 xff1f 1 PC端应用程序将数据以某种协议格式 xff0c 通过USB接口发送给J Link 2 J L
  • 蓝桥杯单片机-DS1302时钟模块

    一 简介 1 采用SPI三线接口通信 xff08 SCK SDA RST xff09 上升沿数据被写入DS1302 xff0c 下降沿被读出 二 应用 1 在ds1302 c文件中定义三个数组 unsigned char code READ
  • 蓝桥杯单片机-定时器

    一 简介 有三个寄存器与定时器相关 xff08 TMOD xff0c TCON xff0c 数值设置寄存器TH TL xff09 1 定时器工作方式设置寄存器TMOD GATE 门控制位 GATE 61 0时 定时器 计数器启动与停止仅受T
  • 蓝桥杯单片机-NE555模块

    一 简介 1 NE555在开发板中用于输出频率可变 xff0c 占空比不变的方波 2 NE555是纯硬件的设计 xff0c 通过电位器RB3可改变其信号输出频率 不需要编程实现其功能 考点 xff1a 使用定时器的计数模式测量NE555输出
  • C语言学习笔记(基于单片机)

    目录 一 关键字部分 static code const extern bit sbit sft struct xff08 结构体 xff09 1 结构体的初始化 2 结构体的赋值 3 应用 data idata pdata xdata 与
  • 蓝桥杯单片机-赛前总结

    目录 一 省赛中开发平台涉及的模块 xff1a 1 IIC驱动 2 DS1302驱动 3 onewire驱动 4 定时器读取NE555频率 二 一些功能性操作 1 外部中断 2 矩阵按键 3 PWM输出 4 毫秒延时函数 三 需要注意的一些