目录
一、你不知道蓝桥杯单片机底层驱动改了??
- 底层驱动代码(主要改动):3-底层驱动代码参考.zip - 蓝奏云
- 完整数数据包:https://pan.baidu.com/s/19Uu1z1kLv68arud6SwslcA?pwd=1234 提取码:1234
- 官方技术文档:蓝桥杯大赛
- 声明:谁都不知到比赛时的数据包是怎么样的!!有备无患
二、小蜜蜂教程——自撸代码
DS18B20、NE555、DS1302、PCF8951、串口函数(包含打印)全都有!!!
当你温度显示不出来、电压读不出、串口通信没有数据。。。。
从主要程序、底层驱动程序还有.hex找到BUG。
三、个人心得
1.NE555
3个5K电阻
P34和NAL用跳帽相接;
定时器T0计数,定时器T1定时
2.DS1302
由日历时钟寄存器、31字节静态RAM组成
TASLL公司
DS1302手册第9页
3.DS18B20
高五位 符号位 00000温度为正
中间数据位
低四位 小数位
数据手册
DS18B20手册第18页
初始化
0xcc
0x44
900ms 延时
初始化
0xcc
0xbe
底层驱动
T*12
还要加延时
带小数 temp>>=4; temp=(temp*10)| (LSB &0x0xf)
不带小数 temp *=0.0625;
负温度 : temp 取反加一
4.AT24C02
读取流程图
ATC2402手册第11页
第12页的
5.PCF8951
读取流程图
PCF8951手册第6页
和第14页
//DA转换只是比AD转换多加这一段代码
void Set_PCF8591_DAC(uchar digtal) //DAC输出 float 102.4 可能更准确
{
IIC_Start();
IIC_SendByte(0x90); //PCF8591的写设备地址
IIC_WaitAck();
IIC_SendByte(0x43); //输出DAC,转换AIN3
IIC_WaitAck();
IIC_SendByte(digtal); //设置DAC电压输出参数
IIC_WaitAck(); //产生非应答信号
IIC_Stop();
6.串口指令读取
串口中断只有定时器1 和定时器2
控制低4位LED
led=(led | 0x0f) & (~command | 0xf0)
控制高四位LED
led=(led | 0xf0) & (~command<<4 | 0x0f)
//串口重定向
#include <stdio.h>
void SendByte(unsigned char dat)
{
SBUF=dat;
while(TI==0);
TI=0;
}
void Sendstring( unsigned char *str)
{
while(*str !='\0')
{
SendByte(*str++);
}
}
char putchar(char c)
{
SendByte(c);
return c;
}
printf("c=%.2f",c); //打印值保留后两位小数
sscanf(S,"%x",&x); //将s按照16进制格式转换为整型,并赋值给X
printf( "%d\n",x); / /输出x的十进制
//怎么判断下位机发出的字符串
unsigned char StuBUf[6];
unsigned char rexover=0;
unsigned char* ReadUart(void)//串口接收到的一串数据数组表示
{
return StuBUf;
}
void ServiceUart() interrupt 4 //接受到数据,启动定时
{
if(RI==1)
{
TR0=1;
TL0 = 0x00; //复位定时初值
TH0 = 0x00;
RI=0;
StuBUf[R_I++]=SBUF;
rexover=1;
}
}
void coomand_mange()
{
if(rexover==1)
{
rexover=0; //用数组判断收到的字符串
if((StuBUf[0]=='r')&&(StuBUf[1]=='e')&&(StuBUf[2]=='t')&&(StuBUf[3]=='u')&&
(StuBUf[4]=='r')&&(StuBUf[5]=='n'))
{
Sendstring("goodbyeoword");
}
}
}