希望对初学者提供帮助,我采用的C语言。有人说C语言容易比较容易掌握,汇编比较难。这种说法其实只是针对初学者。对于希望提高或者达到一定水平来说其实都有一样。我有个同事使用C语言设计一个多任务切换的程序,发现很难完成。但是使用汇编编写程序的程序员就比较容易。因为他对内存结构、堆栈分配非常清楚所以就比较容易实现。特别是做精确延迟,汇编显得非常有优势。在有些项目中C与汇编要嵌套使用,这就对程序员的要求非常高。
我的意思是,如果您希望以后将编写嵌入式软件作为一个工作手段。如果您的同事中有位汇编高手,那您就做汇编吧。有位这是一个绝好的机会。有人一辈子也不会有!
但是C语言比较易学易用,我们就以C入门吧。
IO就输入/输出的意思。单片机通过IO管脚与外界其他电路通讯。AT89S52应该是标准单片机,具有P0-P4合计4组IO,每组IO有8个管脚。以后一些其他厂家基本按照这个规范生产产品。我们随便找一个C51的单片机看看。
这就一个标准的双列直插的单片机。我们稍微观察一下看到1-8是P0端口,10-17是P3管脚,
40-32是P0管脚,28-21是P2管脚。4组管脚都可以做为普通的IO使用,也就是输出高低电平。或者读取外界电平。 其中P3管脚可以作为其他第二功能使用。
C51的P1-P3 IO是准双向/弱上拉工作模式,这句我们来分析一下,“准双向”的意思他可以作为IO管脚使用。“准”的意思是不能同时作为输入、输出使用。“弱上拉”也就是说外部电路如果希望他置低,需要比较大的电流。我理解就是这样,具体大家再查查资料吧。
P0管脚是开漏输出的,只能输出低电平,如果需要输出高电平,需要在外部使用上拉。但是P0管脚具有强灌电流能力,也就是吸收电流的能力。
XTAL1、XTAL2是晶振管脚。按照以下搭建的电路可以使单片机工作起来。
在有些单片机EA必须接高电平,有些单片机已经内部做了上拉就不需要拉。C1、R1是为了在上电时提供一个短时间的高电平。在系统上电瞬间C1是导通的,相当于导线,RST通过电阻接地。所以RST现在是高电平。随着 C1充电通过R1的电流越来越小。知道最后完全不导电。RST就成了低电平。系统就开始稳定了工作了。根据单片机复位需要的时间设计该电路。
C2、C1、R2 与晶振形成了竞争电路,一般情况下厂家会提供这几个元器件的选择。所以在初期不必太关心,只需参考别人电路即可。C5、C6是滤波电容。
如果C51已经烧写了程序, 按照上图搭建电路后系统即可工作,
这个电路就比较丰富了,如果按照以上硬件电路。我们可以通过P1口完成流水灯实验、定时器实验、串口实验。 因为LED实验很简单,参考的例子非常多。我们按照上图硬件今天随手写几个。
sbit LED0 = P1^0;
void main( )
{
P1 = 0xFF;
LED0 =0;
while(1)
{
}
}
以上代码编译、下载运行后P1^0控制的LED会亮。 我们逐行分析。
sbit LED0 = P1^0; 声明了LED0变量,LDE0是一个位。sbit并不是标准C语言的类型。只有在单片机编程时使用。
main 是主函数,也就是程序的入口。PC指针初始化位置指向他。
P1 = 0XFF; P1的输出寄存器置1,也就是输出低电平。所有P1管脚LED熄灭。
while(1){ } 在单片机编程中非常常用。防止程序执行结束后,出现不可预知的结果。
void delay( )
{
unsigned int m,n;
for(m=0;m<500;m++)
for(n=0;n<500;n++);
}
void main( )
{
P1 = 0xFF;
LED0 =0;
while(1)
{
delay( ) ;
LED0 =0;
delay( ) ;
LED0 =1;
}
}
以上代码编译、下载运行后P1^0控制的LED会闪烁!
LED0=0;点亮P10管脚LED亮,LED0 =1;熄灭LED。
delay( )是我们编写的函数,其中
for(m=0;m<500;m++)
for(n=0;n<500;n++); 是一段延迟程序。如果没有该函数否则LED0是不会闪烁的。