有code程序存储器、数据存储器128字节,xdata外部数据存储器。
问题:1Delay(1)消隐是什么原理?减少段选的余晖,但先位选再段选中间不需要P0=0x00;只在末尾Delay即可消隐;段选之后必消隐,先再子函数开头开端选锁存器,P0=0x00,子函数末尾Delay(2)为最佳消隐方式。
2为什么按键按下数码管不能保持原状态。答:用好定时器扫描按键和数码管。
例如:如果main函数里的while里if条件不满足(空),则会卡在while循环外的最后一条语句一直执行。
如果main函数里的while里if条件的其中一个满足一次,其他条件不满足,则会卡在满足一次的if语句里一直执行。
3共用P0的模块怎么互不干扰?设置一个变量来记录状态。
例:数码管+蜂鸣器,第一个模块用完P0后记得清0(0x00)或清1(0xff)消隐原理 或给P0中的某一位定义一个数组
4DS18B20实验中,用Timer0为什么数据会乱?时序被破坏。
5定时器扫描按键数码管有时会扫描不到。已解决。
6第九届蓝桥杯AT24C02中4设置好后会读不出来4????读的一直是0??(可能是芯片连续写四次速度太快导致存储数据错误,已解决(用for循环))
7如何防止P0口读的太快而导致其他用P0口的设备出错??
写程序时的错误:1define 名称 数值后不加分号。
2数组太大就在名称前加code 例:(code放在这里也可以)unsigned char code Music[]={};code:code是keil C51里面的关键字,一般用于定义常量数组,意思是告诉编译说把这个数组放在ROM存储。
3数组存在ROM中也有大小,如果超出大小,歌曲将不能停止,从头开始无限循环
4unsigned char OneWire_ReceiveBit(void)//5+7+52不行,好像跳过了读取环节,记得上下拉也需要时间//5+5+55可以
5注意对10000怎么取每一位的操作。
6注意有符号整型转换浮点数,以及浮点数转化无符号整数类型,unsigned int(16位),无符号长整数类型(32位).
7定时器扫描按键记得static
8我所写的定时器扫描按键都是一瞬间键数丢失,在主函数记得if判断
9要判断两个变量是否相等,不如用>=或<=来判断
10unsigned char 溢出的话,对这个数%256
11如果数组中的数据不需要更改,可以在最前面加code 放在程序存储器里面 节省数据存储器的空间
12 I2C通信只是一个大体模板,要根据不同的从机(手册)来调节,以保证从机读到主机发送的数据
13 暂定pwm调速不需要再初始化Count,10ms速度太快,暂定忽略误差
14在字符串中'\0'用作字符串的结束标志。比如说,把一个字符串赋值给数组:u8 str1[]={"cxjr.21ic.org"};实际上数组str1在内存中的实际存放情况为:
c x j r . 2 1 i c . o r g '\0' 这后面的'\0'是由C编译系统自动加上的。
15 如果不是printf()函数,一般是\r\n一起放在后面。
16指针变量不能单独++;例:*str++;
17如果用到DS18B20程序,就要尽可能减少进入定时器的频率和处理的工作(按键检测放在while中扫描),如果需要避免P0口共用,把P0口有关设备放在定时器中,增大该段程序与温度读取冲突的概率(增大进入该段的时间)。
这个开发板扫描太快,一个空函数是0.7us,一个nop为0.1us
P2&=0x1f;
P2|=0x80;
P0=0xfe;
P2&=0x1f;//这个写法是为了保证串口通信正常
当串口中断与定时器中断一起用时,记得串口中断中不要写太多语句,防止数码管瞬闪,串口中断优先级高。
用串口发送电压,温度数据时,电压检测和温度检测一定在while循环中检测,在中断中检测有时发送数据会出错!!!!!原因:UART与DS18B20一样,中断中不能放过多语句,不然会扰乱时序,快进快出!!!!!
频率计数器和超声波的定时器0/定时器1都用12T模式,TH0=0x00;TL0=0x00;s
float类型强制转换int类型放弃小数点之后的数,但printf会四舍五入,小心差别
PCF8591受按键检测的影响,加上矩阵键盘检测,频率会急速下降,并且矩阵键盘两个按键失灵,一个项目是频率加独立按键可以正常使用
void UART_String(char *str)
{
while(*str!='\0')//注意\0,*str!='\0'与*str等价,因为'\0'等于0
{
UART_SendByte(*str++);
}
}
0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xBF,0xff(0,1,2,3,4,5,6,7,8,9,-,灭)
需要加上小数点,就在高四位-8即可;
AT24C02 0xA0 (写入Delay5ms) PCF8591 0x90 光敏(0x01) 电位器(0x03) 0x40 DAC 0xcc 0x44 0xcc 0xBE 定时器工作模式为1T
#include "intrins.h"
void Delay_OneWire(unsigned int t) //STC12C5260S2
{
unsigned char i;
while(t--)
{
for(i=0;i<12;i++);
}
}
void IIC_Delay(unsigned char i)
{
do
{
_nop_();
} while(i--);
}
dspbuf[i]=rxbuf[i]-0x30;//'12',rxbuf[0]=0x31,rxbuf[1]=0x32;16进制,0为0x30,1为0x31;
将5>>'5'将原unsigned char变量值加上0x30即0011xxxx
通信协议:串行口通信协议,DS1302协议(先发低位),I2C总线通信协议(先发高位),1-Wire单总线通信协议(先发低位)(任何操作都要等数据发送接收完毕)弊端
锁存器的锁存端给1高电平有用。字母或数字上方给横线表示低电平0有效。
全局变量定义之后自动给0,局部变量定义之后不一定给0。
&用于清0 |用于置1
为unsigned char类型变量赋整数,会将十进制数转化为二进制数,最高255。如果字符型变量被赋值整数被整型变量引用,引用出来的值为整型。
J5是键盘模式选择跳线,当KBD短接时,是矩阵键盘模式;当BTN短接时,是独立按键模式(S4-S7)。
U24是74HC138译码器。U25是I/O和MM模式输出转换芯片。
U7、U8是数码管锁存器。
U6是LED锁存器。
U16是ADC转换芯片PCF8591。
ULN2003是电机驱动芯片,输入1,输出0,非门,提高电压驱动能力
板子上黄色盒子名为继电器(电磁铁),给0,电磁铁启动,吸合开关,点亮L10,给1,电磁铁关闭,断开开关,L10熄灭
位选高电平1亮,低电平0灭。段选高电平1灭,低电平0亮。(共阳极)消隐:先P0=0xff后Delay(1);先位选再段选
矩阵键盘,先列后行,
独立按键和矩阵键盘在主函数里面记得加if(变量){给其他变量赋初值};
数码管是可以让一个数字一直显示的且不需要while循环,但如果多个数字一起显示就是动态数码管,需要while循环来显示。
主要中断函数中static的作用(不可删除)作用:在函数体,一个被声明为静态的变量在这一函数被调用过程中维持其值不变(T0Count只被初始化一次,不会重复初始化)。
a=_crol_(a=0x01,1)//0x01左移(11111110)一位后赋给a,且8位一直循环。_cror_为右移。
串口通信必须用定时器1(双8位自动重装模式),定时器1只用于设置波特率,并不用于中断,中断有单独的串行口中断服务函数和寄存器,波特率加倍,不然误差较大。蓝桥杯单片机有AUXR寄存器。(比普中高级)
U19芯片为DS1302实时时钟芯片。RTC是实时时钟集成电路。DS1302命令字:最低位0为写,1为读。时序图中单片机上升沿写数据,下降沿读数据。用BCD码来表示数据。
BCD:用4位二进制数来表示一位十进制数。二进制简写为BIN 八进制简写为OCT 十进制简写为DEC 十六进制简写为HEX
例:00010011表示13,1000 0101表示85,0001 1010不合法
在十六进制中的体现:0x13表示13,0x85表示85,0x1A不合法
BCD码转十进制:DEC=BCD/16*10+BCD%16(2位BCD)
十进制转BCD码:BCD=DEC/10*16+DEC%10 (2位BCD)
extern 全局变量,所有函数都可用。
定时器进行定时有几个缺点:定时器精度不够,没有时钟芯片精度高 它会占用单片机的cpu 单片机定时器的时钟不能掉电继续运行
U9是锁存器,U10(ULN2003)是步进电机芯片,通过步进电机芯片,左边输入1,在内部取反,然后输出0。蓝桥杯板子上是有源蜂鸣器但也可演奏音乐。
AT24C02是存储器,E2PROM(电可擦除可编程ROM)是存储介质,容量:256字节 通信接口:I2C总线
U4是AT24C02存储器。WP是写保护 SCL、SDA是I2C接口 A0A1A3是I2C地址且接地都为0(1010000+0写/1读) 内容分成32页,每页8Byte,共256Byte,字地址可写0~255:32*8
弱上拉 I2C通信,主机先发送地址(找从机,每个从机都有自己的地址),再发送数据。AT24C02根据页写每页可写8个数据,再往后写回覆盖第一个数据。(不用,知道即可)
定时器扫描按键数码管不如说是 忘记的话看视频 主要目的:防止程序混乱,可以在一个定时器中进行不同时间的中断,Timer0Count1,Timer0Count2;
DS18B20是数字温度传感器,测温范围为:-55摄氏度~+125摄氏度。DS18B20可以寄生供电,使用DQ供电。CRC是一种校验码算法。
DS18B20单总线,先初始化,再主机发送数据,然后主机读取数据(默认顺序,所以虽然发和收的条件很相似,但不影响)
主机先ROM指令进入DS18B20大门,再发送功能指令读写 温度存储是以补码的形式(正好int16位存储,负数以补码形式存储) 11.0592MHz 一个空函数是0.7微秒 上电一瞬间的数据是错误的 要Delay一下;
DS18B20用数码管读取是难题,类型转换先死记。先发低八位,再发高八位。高五位是符号位,0表示正,1表示负,后四位是小数位,中间为整数。
电机是直流电机,电源正负极反接,电机可以反转。步进电机可以更精准的控制转的距离。小车转向可以使用舵机。
电机和继电器都是感性负载元件,所以要加续流二极管。现在滑动变阻器被称为电位器。
PWM重要参数:频率=1/TAll 占空比=THigh/TAll 精度=占空比变化步距
PWM调速如果频率比较低,会抖动,频率比较高调速效果比较好。10KHz~20KHz的频率合适。
PCF8591地址为1001000+0写/1读。外接LED最低亮的电压为2.5V(127)。
I2C时钟线要根据从机能够读到的时钟频率进行调整,不是一成不变的。AT24C02的时序对PCF8591并不适用。
中断有两种写法,一种是立即判断,一种是执行完上面的程序之后再中断执行中断。
100us大概能执行250行代码。