从单片机基础到程序框架(连载) - 单片机论坛、单片机技术交流论坛 - 21ic电子技术开发论坛
阅读笔记
1.关键词sbit和符号“^组合类似于宏定义:
sbit P1_4=P1^4;//变量P1_4就和P1.4关联起来了
2.51系列单片机,最短的单周期指令由12个心跳数组成,
如果51单片机的晶振频率为12MHz,所以心跳速度是1/12万,
因此,单周期指令的节拍时间是:心跳数*心跳速度 = 12*1/12000000 = 1微秒;
在这种情况下,如果定时器的16位模式最大值为65535,则最大定时值为65.535ms
- 中断函数:
- 无返回值,无参数;
- 函数名需要紧跟关键字interrupt,说明是中断函数;
- 关键字interrupt后面要跟中断号,说明这个服务函数是为那个中断服务的;
4)格式:void 函数名() interrupt 中断号
中断开关:中断主开关EA 局部开关(如定时器0中断开关)ET0)两者必须同时打开;中断允许
5.定时器/计数器 模式控制寄存器TMOD
GATE C/T M1 M0
两个开关决定了定时器的开启和停止:1)GATE是定时器是否受其他外部开关影响的标志位;2)自身原配开关(定时器0自身原配开关为TR可启动定时器中断);
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 <include> <source>
---------------------------------------------------------------------------------------------------------------------------------
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. 过采样:在信号处理中,(英语:
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.
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("%
d.51单片机中sprintf函数使用,一定要注意,需要强制类型转换:
sprintf(num, "%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编译器就会擅自在最后一个成员的后面插入若干个“填充字节”来满足这个规则。