MCU最强科普总结
共 17579字,需浏览 36分钟
·
2021-05-13 16:45
MCU是Microcontroller Unit 的简称,中文叫微控制器,俗称单片机,是把CPU的频率与规格做适当缩减,并将内存、计数器、USB、A/D转换、UART、PLC、DMA等周边接口,甚至LCD驱动电路都整合在单一芯片上,形成芯片级的计算机,为不同的应用场合做不同组合控制,诸如手机、PC外围、遥控器,至汽车电子、工业上的步进马达、机器手臂的控制等,都可见到MCU的身影。
1
单片机出现的历史并不长,但发展十分迅猛。它的产生与发展和微处理器(CPU)的产生与发展大体同步,自1971年美国英特尔公司首先推出4位微处理器以来,它的发展到目前为止大致可分为5个阶段。下面以英特尔公司的单片机发展为代表加以介绍。
2
单片机的分类及应用
3
单片机的基本功能
对于绝大多数MCU,下列功能是最普遍也是最基本的,针对不同的MCU,其描述的方式可能会有区别,但本质上是基本相同的:
4
全球主流单片机制造商
欧美地区
5
单片机的学习窍门
6
单片机的程序编写
MCU的程序的编写与PC下的程序的编写存在很大的区别,虽然现在基于C的MCU开发工具越来越流行,但对于一个高效的程序代码和喜欢使用汇编的设计者来讲,汇编语言仍然是最简洁、最有效的编程语言。
要防止在中断和主程序体中同时访问或设置同一个变量或数据的情况。有效的预防方法是,将此类数据的处理安排在一个模块中,通过判断触发标志来决定是否执行该数据的相关操作;而在其他的程序体中(主要是中断),对需要进行该数据的处理的地方只设置触发的标志。――这可以保证数据的执行是可预知和唯一的。
7
工程师对单片机编程的总结
1、要养成总结的好习惯,总结不仅是对自己学习的一个总结,还是对学习过程的一个回顾与加深,还可避免第二次犯错。
8
单片机开发技巧
1.如何减少程序中的bug
对于如何减少程序的bug,应该先考虑系统运行中应考虑的超范围管理参数如下。
物理参数:这些参数主要是系统的输入参数,它包括激励参数、采集处理中的运行参数和处理结束的结果参数。
资源参数:这些参数主要是系统中的电路、器件、功能单元的资源,如记忆体容量、存储单元长度、堆叠深度。
应用参数:这些应用参数常表现为一些单片机、功能单元的应用条件。过程参数:指系统运行中的有序变化的参数。
2.如何提高C语言编程代码的效率
用C语言进行单片机程序设计是单片机开发与应用的必然趋势。如果使用C编程时,要达到最高的效率,最好熟悉所使用的C编译器。先试验一下每条C语言编译以后对应的汇编语言的语句行数,这样就可以很明确的知道效率。在今后编程的时候,使用编译效率最高的语句。各家的C编译器都会有一定的差异,故编译效率也会有所不同,优秀的嵌入式系统C编译器代码长度和执行时间仅比以汇编语言编写的同样功能程度长5-20%。
对于复杂而开发时间紧的项目时,可以采用C语言,但前提是要求你对该MCU系统的C语言和C编译器非常熟悉,特别要注意该C编译系统所能支持的数据类型和算法。虽然C语言是最普遍的一种高级语言,但由于不同的MCU厂家其C语言编译系统是有所差别的,特别是在一些特殊功能模块的操作上。所以如果对这些特性不了解,那么调试起来问题就会很多,反而导致执行效率低于汇编语言。
测试单片机软件功能的完善性 上电、掉电测试 老化测试 ESD和EFT等测试
9
芯片操作总结
对芯片的操作主要是对芯片内寄存器的操作,芯片内寄存器在存储器上映射的都有自己的唯一地址,这也就是对相应的地址的操作。看芯片,首先看时序图,再了解相应的寄存器,了解是如何操作的,定义需要的端口(程序可以识别),编写写操作程序和读操作程序。
为了将汉字在显示器或打印机上输出,把汉字按图形符号设计成点阵图,就得到了相应的点阵代码(字形码)。
GB1616.h//------------------ 汉字字模的数据结构定义 ------------------------//
struct typFNT_GB16 //汉字字模数据结构
{
unsignedchar Index[3]; //汉字内码索引
unsignedchar Msk[32]; //点阵码数据
};
/////////////////////////////////////////////////////////////////////////
// 汉字字模表 //
// 汉字库: 宋体16.dot,横向取模左高位,数据排列:从左到右从上到下 //
/////////////////////////////////////////////////////////////////////////
conststruct typFNT_GB16 codeGB_16[]= //数据表
{
/*------------------------------------------------------------------------------
; 源文件 /文字 :徐
; 宽×高(像素):16×16
------------------------------------------------------------------------------*/
"徐",0x10,0x80,0x10,0x80,0x21,0x40,0x42,0x20,0x94,0x10,0x1B,0xEC,0x20,0x80,0x60,0x80,
0xAF,0xF8,0x20,0x80,0x22,0xA0,0x24,0x90,0x2A,0x88,0x21,0x00,0x00,0x00,0x00,0x00,
这个结构,很简单的:一个是内码,一个点阵序列,以前的点阵库是按内码顺序放的,不需要内码索引的,如果只放部分汉字,就需要内码索引了。(前面的汉字“徐”是为了要输出“徐”的时候找到该字的点阵序列,这个点阵序列是自己写的,当用1602显示时,因为该芯片内存在英文的点阵序列,所以就不用写了)一般内码两个字节就行了,多用1个字节是加了个尾0而已,这样,汉字内码处直接放汉字字符串就可;
13、12864液晶:
每个显示点对应一位二进制数,1 表示亮,0 表示灭。存储这些点阵信息的RAM称为显示数据存储器。要显示某个图形或汉字就是将相应的点阵信息写入到相应的存储单元中。
绘图RAM的地址计数器(AC)只会对水平地址(X 轴)自动加一, 当水平地址=0FH 时会重新设为00H 但并不会对垂直地址做进位自动加一,故当连续写入多笔资料时,程序需自行判断垂直地址是否需重新设定
[ ] view plain copy
// 显示汉字
voiddispString (uchar X, Y,uchar *msg) //X为哪一行,Y 为哪一列。msg
为汉字
{
if(X==0) X = 0x80; // 第一行,汉字显示坐标
else if(X==1) X = 0x90; // 第二行
else if(X==2) X = 0x88; // 第三行
else X = 0x98; //第四行
Y = X + Y; //Y 为1 往右移一位
write_com(Y); // 写入坐标
while (*msg)
{
write_data(*msg++); //显示汉字
}
}
//////////////////////////////// //////////////// ///////////////
// 显示图象
voiddisppicture(uchar code *adder)
{
uint i,j;
//*******显示上半屏内容设置
for(i=0;i<32;i++) // 上半屏32个列地址
{
write_com(0x80 + i); //SET 垂直地址 VERTICALADD
write_com(0x80); //SET 水平地址 HORIZONTAL ADD
for(j=0;j<16;j++)
{
write_data(*adder);
adder++;
}
}
//*******显示下半屏内容设置
for(i=0;i<32;i++) //
{
write_com(0x80 + i); //SET 垂直地址 VERTICALADD
write_com(0x88); //SET 水平地址 HORIZONTAL ADD
for(j=0;j<16;j++)
{
write_data(*adder);
adder++;
}
}
}
单片机可以定义位变量,但是不可以定义位数组。用c语言写只是看着简单,实际生成的代码量是最多的,用于控制的单片机几乎不用浮点数运算,不仅慢还麻烦还占地方,如果是DSP芯片,本身有适合的硬件结构,会好很多。