sbit P1_4=P1^4; //变量P1_4就和P1.4关联起来了
2.51系列单片机,最短的单周期指令是由12个“心跳个数”组成,
假如51单片机是晶振频率12MHz,那么心跳速度就是1/12000000,
所以一个单周期指令的节拍时间就是:心跳个数*心跳速度 = 12*1/12000000 = 1微秒;
这种情况下假如定时器的16位模式,最大值是65535,因此最大定时值就是65.535ms
4)格式:void 函数名称() interrupt 中断号
中断的开启:中断的总开关EA + 局部开关(比如定时器0中断的开关ET0),两个必须同时打开;中断允许
5.定时器/计数器 模式控制寄存器TMOD
GATE C/T M1 M0
定时器开启和停止由两个开关决定:1)GATE是定时器是否受“其他外部开关”影响的标志位;2)自身原配开关(定时器0的自身原配开关是TR0,可以启动定时器的中断);
C/T 计数器/定时器;
6.定时中断里面关键词:1)1ms, 1ms是系统时钟的节拍来源;2)互斥量;3)volatile;volatile是针对编译器的;
7.初始化注意事项:
1)单片机系统初始化SystemInitial(),这里主要放对上电瞬间要求高需要立即处理的,比如控制继电器
2)延时Delay(10000)---为3)做准备
3)外设初始化PeripheralInitial(),主要用来处理不要求上电立即处理的外设芯片和模块,如液晶屏、存储芯片、时钟芯片等等,这些芯片在上电的瞬间,内部自身、外部的电压稳定都需要一点时间,只有过了这一点时间,这些芯片才处于正常的工作状态,也只有这情况下,单片机才能跟它们正常通讯
8. 蜂鸣器分类:
有源蜂鸣器:通电响,断电停。驱动电路有NPN(高电平导通,低电平关闭)和PNP(高电平关闭,低电平导通)方式;
无源蜂鸣器:一直通电或者一直停电都不会响,而需要反复“通关通关通关”电源,才能产生稳定的声音。为脉冲驱动方式或者叫做PWM驱动方式;
9.定时器中断函数里面适合处理的事情:
需要保证时间的及时性和均匀一致性的:比如蜂鸣器的驱动,动态数码管的驱动,按键扫描驱动
---------------------------------------------------------------------------------------------------------------------------------
嵌入式程序设计框架
1.主函数层main.c
2.应用程序层app.c app.h isr.c isr.h
3.用户模块层user_device.h example.c example.h
A.配置函数:引脚配置 功能配置 事件配置
B.初始化
C.API接口函数:
这里可以有GPIO、中断、定时器、
4.MCU外设层stc_device.h stc_device.c
---------------------------------------------------------------------------------------------------------------------------------
1. 8051常用寄存器符号:A表示累加器ACC;
DPTR表示16位的数字指针;
PC表示16位的程序计数器;
C表示进位标志CY;
AB表示A和B寄存器对,用于乘和除操作;
R0-R7表示当前所使用寄存器组内的8位通用寄存器;
SP表示堆栈指针;
DSP表示数据指针选择寄存器;
2. 中断向量表:用于保存处理不同类型事件的程序代码起始地址的存储空间,是程序存储器的一块特定的存储空间,一般在程序Flash存储空间的低地址区0---0x100,用户程序0x100之后开始编写。
3. Keil uvision5 调试的时候查看SFR地址:view-symbols window;
4. Keil uvision5 调试的时候查看P0-P3端口引脚的状态:peripherals-I/O port;
5. Keil uvision5 调试的时候, view-analysis window--logic analyzer,在主界面下面的command窗口的指令行,输入la P1---->添加一个信号,这个不是随便添加的,。
6. 过采样:在信号处理中,过采样(英语:Oversampling)是指以远远高于信号带宽两倍或其最高频率对其进行采样的过程。一般来说是指采样频率高于信号最高频率的两倍。过采样适用于温度等慢速的场景。
7. 机械周期:单片机执行一单位指令所需要的时钟周期个数,1T就表示需要一个时钟周期,即一单位指令的时间;现在经常用指令周期指代机械周期。
8. 串口通讯有三种常用的硬件方式:TTL、232、485,如下:
9. TTL(Transistor-Transistor Logic)也称双极型晶体管(三极管)逻辑。TTL方式中:RX接TX,TX接RX,在TTL逻辑中,规定了以0V表示逻辑“0”(低电平),以5V表示逻辑“1”(高电平);
10. 232方式:CPU经过了MAX232等电平转换芯片,RS232接口在总线上只允许接一个收发器,即单站能力,传输距离是15米内,RS232的电平标准为+12V为逻辑负,-12为逻辑正,请注意,负的是逻辑1;
11. 485方式:CPU经过了MAX485等电平转换芯片,与TTL和232不同的是: 485通讯需要多增加一个IO口来控制数据流的方向,输出低电平接收数据,输出高电平接收数据。RS485接口最大传输距离可以达到千米,在总线上允许接连128个收发器。RS-485的电气特性:逻辑“1”以两线间的电压差为+(2—6)V表示;逻辑“0”以两线间的电压差为-(2—6)V表示。接口信号电平比RS-232-C降低了,就不易损坏接口电路的芯片,且该电平与TTL电平兼容,可方便与TTL电路连接
12. “TTL串口”是由三根线组成的,分别是数据发送线(TXD),数据接收线(RXD),和公共地(GND), RS232串口线、RS485的串口线跟TTL串口线是一样的;不会接电源线,避免与目标设备上的供电冲突;
13.Keil中使用printf:
a. 需要包含stdio.h头文件 b.串口初试化函数中需要有 TI = 1;就可以使用。假如是485通讯,那么还需要在printf前enable 485;
b.要特别注意,printf函数执行完毕后,最后一个字节并未发送完毕,例如在485通讯中,此时如果切换为收模式,会丢失最后一字节
c.还有需要注意的是:51单片机和标准C打印是有区别的:
Keil里面扩展了字节宽的设置,用 b表示8位,h代表16位,l代表32位
根据描述,我们打印char类型的数据的时候,应该加b:printf("%bd", x); 打印16位数据的时候加h
d.51单片机中sprintf函数使用,一定要注意,需要强制类型转换:
sprintf(num, "%d", (int)d); 这里的强制类型必须要有,否则什么也输不出来。
14. 51单片机的平台软件是Keil,编译器软件用C51,编译软件是当做一种独立配件嵌入到平台软件里面使用的,统一接收平台软件的控制。
15. KEIL有多个版本:
KEIL2 内置了C51编译器,只适用于51单片机,不适用于ARM单片机
KEIL4-5,有C51编译器和MDK-ARM编译器两种选择,可以用于C51,也可以用于ARM类单片机如STM32, 但是编译器一般只能二选一,切换时可能不兼容。
16.const 和code
关键字 |
51单片机的C编译器 |
其他类型单片机 |
||
const |
认 |
const变量存放在RAM |
认 |
const变量存放在ROM |
code |
认 |
code变量存放在ROM |
不认 |
-- |
17.指针即为地址,指针几个字节跟语言无关,而是由芯片硬件的寻址范围决定,C51编译器下:
8位 |
变量类型 |
Unsigned char |
Unsigned int |
Unsigned long |
Unsigned char * |
Unsigned int * |
Unsigned long * |
Struct xxx * |
占用空间 |
1字节 |
2字节 |
4字节 |
3字节 |
3字节 |
3字节 |
3字节 |
18.结构体的内存对齐:
a)结构体内部某个成员相对结构体首地址的偏移地址必须能整除该单片机的“对齐倍数”(单片机的位数除以8),如果不能,C编译器就会擅自在各成员之间插入若干个“填充字节”来满足这个规则;
b)一个结构体变量所占的内存总容量必须能整除该单片机的“对齐倍数”(单片机的位数除以8),如果不能,C编译器就会擅自在最后一个成员的后面插入若干个“填充字节”来满足这个规则。