

单片机发展简史
单片机的分类及应用
单片机的基本功能
全球主流单片机制造商
(排名不分先后,整理为主流厂商,如有缺少请在评论区补充)
10、义隆电子:主要提供8位、16位MCU。应用范围:消费电子、电脑、智能手机。
单片机的学习窍门
单片机的程序编写
要防止在中断和主程序体中同时访问或设置同一个变量或数据的情况。有效的预防方法是,将此类数据的处理安排在一个模块中,通过判断触发标志来决定是否执行该数据的相关操作;而在其他的程序体中(主要是中断),对需要进行该数据的处理的地方只设置触发的标志。――这可以保证数据的执行是可预知和唯一的。
七
工程师对单片机编程的总结
八
单片机开发技巧
1
对于如何减少程序的bug,应该先考虑系统运行中应考虑的超范围管理参数如下。
物理参数:这些参数主要是系统的输入参数,它包括激励参数、采集处理中的运行参数和处理结束的结果参数。 资源参数:这些参数主要是系统中的电路、器件、功能单元的资源,如记忆体容量、存储单元长度、堆叠深度。 应用参数:这些应用参数常表现为一些单片机、功能单元的应用条件。过程参数:指系统运行中的有序变化的参数。
用C语言进行单片机程序设计是单片机开发与应用的必然趋势。如果使用C编程时,要达到最高的效率,最好熟悉所使用的C编译器。先试验一下每条C语言编译以后对应的汇编语言的语句行数,这样就可以很明确的知道效率。在今后编程的时候,使用编译效率最高的语句。各家的C编译器都会有一定的差异,故编译效率也会有所不同,优秀的嵌入式系统C编译器代码长度和执行时间仅比以汇编语言编写的同样功能程度长5-20%。
防止干扰最有效的方法是去除干扰源、隔断干扰路径,但往往很难做到,所以只能看单片机抗干扰能力够不够强了。在提高硬件系统抗干扰能力的同时,软件抗干扰以其设计灵活、节省硬件资源、可靠性好越来越受到重视。
当一个单片机系统设计完成,对于不同的单片机系统产品会有不同的测试项目和方法,但是有一些是必须测试的:
测试单片机软件功能的完善性 上电、掉电测试 老化测试 ESD和EFT等测试
芯片操作总结
对芯片的操作主要是对芯片内寄存器的操作,芯片内寄存器在存储器上映射的都有自己的唯一地址,这也就是对相应的地址的操作。看芯片,首先看时序图,再了解相应的寄存器,了解是如何操作的,定义需要的端口(程序可以识别),编写写操作程序和读操作程序。
为了将汉字在显示器或打印机上输出,把汉字按图形符号设计成点阵图,就得到了相应的点阵代码(字形码)。
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而已,这样,汉字内码处直接放汉字字符串就可;
绘图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 垂直地址 VERTICALADDwrite_com(0x80); //SET 水平地址 HORIZONTAL ADDfor(j=0;j<16;j++){write_data(*adder);adder++;}}//*******显示下半屏内容设置for(i=0;i<32;i++) //{write_com(0x80 + i); //SET 垂直地址 VERTICALADDwrite_com(0x88); //SET 水平地址 HORIZONTAL ADDfor(j=0;j<16;j++){write_data(*adder);adder++;}}}
单片机可以定义位变量,但是不可以定义位数组。用c语言写只是看着简单,实际生成的代码量是最多的,用于控制的单片机几乎不用浮点数运算,不仅慢还麻烦还占地方,如果是DSP芯片,本身有适合的硬件结构,会好很多。
推荐阅读
(点击标题可跳转阅读)
简诉我和 Qt 的故事以及发文方向
学会读源码,很重要!

