作者:peter8888<? target="xml" content="namespace prefix = o ns = \"urn:schemas-microsoft-com:office:office\" /"/>?>
摘要:本文从硬件和软件方面阐述了想从事单片机开发如何入门的问题。希望能给那些想入门而未入门的人员一些启发,少走弯路,尽快能够进行单片机应用设计和开发。
关键词 :单片机 数字电路 CPU PCB C++
引言
现在这个时代可以说是网络的时代。各种电子产品、高科技技术充斥整个人类的生活。由电阻、电容、二极管、三极管、集成电路构成的各种产品与人们的生活息息相关,可以说人类离不开这些电子产品。
电子产品的开发也是空前的兴旺。越来越多的人员加入到这个开发队伍。还有很多正在朝着这方面努力。单片机的应用在电子产品中占有很大的份额,单片机应用工程师所占比例也不小。那么怎样才能登堂入室,步入单片机应用的大门呢?下面将从硬件和软件方面加以阐述。
1、 单片机应用之硬件设计和开发
1.1硬件设计和开发
如果要从事单片机应用的硬件设计和开发,那么你必须具备以下几个方面的基础或正在做这方面的准备。
1) 脉冲电路知识
在短暂时间内作用于电路的电压或电流,统称为脉冲信号。广义讲,凡按照非正弦规律变化的带有突变特点的电压或电流,都可称之为脉冲。数字化的电路是与脉冲电路紧密联系的。因此需要熟悉和具有脉冲电路的知识。
2) 数字电路基础
能够理解十进制、二进制、八进制、十六进制及其间的相互转化。研究数字电路(也称逻辑电路)的数学工具是逻辑代数。那么就应该熟悉在逻辑代数中的三种基本逻辑运算“与”、“或”、“非”。
逻辑门电路、组合逻辑电路(如半加器、全加器、编码器、译码器等、时序逻辑电路(如触发器[从结构上分为基本触发器、钟控触发器、维持阻塞触发器、主从触发器、边沿触发器]、寄存器、二进制计数器、十进制计数器等)也需要有所了解。
3) 单片机相关知识
单片机也称CPU、MCU。CPU就是Central Processing Unit的缩写,MCU是Micro Control Unit的缩写。这可以从最简单的51系列单片机着手,当然也可以买些单片机方面的参考书。了解单片机的资源,包括寻址方式、时钟、结构、存储器、中断、堆栈、总线、IO口、ADC、UART等及其应用。
4) 原理图及PCB设计
原理图及PCB设计可以参考我的另一篇文章《PCB绘制如何入门》,在此不再赘诉。
有了以上几方面的准备,相信你就可以开始单片机应用的硬件设计了。其实实践是非常重要的。如果有机会多做些设计和调试,并且多学习别人的设计,通过实践不断总结经验教训,相信你很快就能在单片机应用的硬件设计中游刃有余。
2、单片机应用之软件设计和开发
2.1单片机相关知识
除具有上面所描述的单片相关基础知识外,必须对单片机的各寄存器配置、中断使用、端口等控制了如指掌。
2.2 单片机开发的语言准备
早几年大家都直接用汇编语言开发单片机程序。随着单片机厂家推出支持c语言开发的环境,和整个单片机开发环境的发展,现在使用c语言来开发单片机程序比较普遍,当然最基础的部分还用汇编语言来写。
所以起码要能用c语言编写程序。当然能用汇编编写关键程序或对时间精度要求比较高的程序就更好。
现在的嵌入式编程还使用c++语言。
2.3 数据结构方面的知识
在开发程序过程中经常会用到一些算法。如堆栈、队列、排序等算法。这就要求开发人员具有数据结构方面的知识。可以买些这方面的书籍进行学习或在网上寻找一些这方面的资料。
如果你具有本章所述几方面的知识,那么你编写单片机方面的程序应该不成问题。通过一段时间的实践和学习别人的程序,那么很快你就会得心应手了。
结语
在看完这篇文章之后,你应该对单片机应用设计和开发入门有一个了解了。如果你具有第一章方面的基础,那么你可以进行单片机应用的硬件设计了。如果你具有第二章方面的基础,那么你可以进行单片机应用的软件设计了。如果你具有第一、二章两方面的基础,那么你可以进行单片机应用的软、硬件设计了;同时恭喜你,你将是单片机应用设计和开发的全才。
参考文献
[1] 脉冲数字电路(修订本) 郭桂芬 郭建华 编
用户1133385 2006-11-3 14:02
用户1378541 2006-11-2 18:05
1、中断处理程序中直接延时那么中断处理时间就会过长。如果中断较多,别的对时间要求较高的中断就会受到影响。中断处理时间越短越好,尽量把事情放在中断外来处理。
2、如果是定时器中断里面再延时,并且延时时间跟跟中断定时时间相近或更大,那么程序就会一直执行中断,别的事情就没法干了。
3、对do{}while(IR_Rec==0); 语句采取出错处理就是让它在多长时间没检测到IR_Rec变高就退出。而不至于在这里死循环。
4、for(j="0";j<4;j++)是拷贝有这个问题。
应该是:for( j = 0 ; j<4; j++)
用户1133385 2006-11-2 17:21
首先谢谢答复!
在请问:
1:“中断处理程序中直接延时是程序设计所忌讳的”,请问:如果采用了,有什么严重后果?
2:对“do
{
}while(IR_Rec==0); 这句怎样采用出错方式,这方面我还没有概念!
3:“for(j="0";j<4;j++)”这句复制时不知什么原因在0处添加了双引号,原本没有,谢谢指正!
再次感谢!
用户1378541 2006-11-2 09:22
个人觉得你这个程序有重大问题,且问题较多。有以下几个方面:
1、中断处理程序中直接延时是程序设计所忌讳的。
2、程序中没有出错处理,下列语句中IR_Rec如果一直为低,程序将死在中断里。
do
{
}while(IR_Rec==0); //等到第一个高电平,开始接受数据
3、for(j="0";j<4;j++)中,j初始值为字符0,而比较时与数字4比较,根本就不能执行FOR循环。不知你的本意是什么?我想应该为:for(j="0";j<4;j++)。类似的for循环还有几句。
4、初始值是根据程序和数据需要设置的。多看看HT6221手册。
用户1133385 2006-11-1 17:17
上段程序是HT6221红外线中断解码程序,请斑竹看看有没问题?提提建议,谢谢!
用户1133385 2006-11-1 17:15
我对硬件略懂一些,在看一些别人写的软件时,搞不懂增加的一些常量、初始值是怎么得来的,位移方面的知识也似懂非懂,例如:
void Int0_Service(void) interrupt 0
{
unsigned char i,j;
unsigned char Temp1 = 0x80;
unsigned char Temp0 = 0x7F;
unsigned char Xray_Data = 0x00;
EA = 0;
Delay0R1ms(6984);//8.8ms
if(IR_Rec == 0)
{
Run_Flag1 = 1;
}
Delay0R1ms(3889);//4.5ms
if(IR_Rec == 0)
{
Run_Flag2 = 1;
}
if ((Run_Flag1 == 1)&&(Run_Flag2 == 1)) //引导码正确,开始进行数据的记录阶段
{
do
{
}while(IR_Rec==0); //等到第一个高电平,开始接受数据
for(j="0";j<4;j++)
{
for(i="0";i<8;i++)
{
Delay0R1ms(730);//0.9ms
if(!IR_Rec) //数据代码为"0"
{
Xray_Data = Xray_Data&Temp0;
}
else //数据代码为"1"
{
Xray_Data = Xray_Data|Temp1;
Delay0R1ms(730);//0.9ms
}
Temp0 = ((Temp0>>1)|0x80);
Temp1 = (Temp1>>1);
P1 = ~P1;
do
{
}while(IR_Rec==0); //等到下一个高电平,继续接收数据
}
IR_Decoder[j]=Xray_Data;
Temp1 = 0x80;
Temp0 = 0x7F;
Xray_Data = 0x00;
}
for(j="0";j<4;j++)//
{
Send_Byte(IR_Decoder[j]);
}
X_Ray_Flag = 1;
Run_Flag1 = 0;
Run_Flag2 = 0;
}
EA = 1;
}
上面的unsigned char Temp1 = 0x80;
unsigned char Temp0 = 0x7F和Xray_Data = Xray_Data&Temp0;
怎么理解?