单片机就是一个具有很多功能的电脑控制芯片,也叫微控制器(mcu),它内部集成了运算器,寄存器,程序存储器,数据存储器,定时/计数器,比较器。。。等等微电路,通过循环执行存放在程序存储器中的程序,让单片机的引脚接受输入或发送输出信号来控制外部电路。显然对于完全相同的硬件线路,只要存放在芯片里面的程序不同,其所实现的控制功能也就会大不相同。因此鼓捣单片机除了硬件电路以外,如何设计它的软件:程序就是要关注的重点。
单片机的“位“和“指令”:
尽管电脑CPU已经从32位进化到64位,可是现在最常用的仍然是8位单片机,也就是在其中存储,来回传递,加工的数据都是8位二进制数据如:01110100 00001000 。。。这样的形式,每个数据都是8位的。这个8位二进数并不是任意的,就以上述2个8位二进制数,在51单片机中表示的就是“把00001000(等于10进数“8”)放到累加器A中,太不直观了也!为了避免写那么多0和1可能产生的错误,我们常用16进数,同样上面两个数用16进数写出来就是 E4H 08H 或 0XE4 0X08,简单是简单些,还是不直观。。。,那么 MOV A, #08H 怎么样?直观多了吧?这个就是51单片机的一条指令,。。。,当然,单片机可不认识英语,它只认二进数,把英文指令翻译成二进数,需要专门的编程软件,“汇编器“,我们在电脑上运行编程软件,正确无误后翻译成相应的机器码文件,再通过专门装置“编程器“把他从电脑中取出灌入单片机不就妥了?。。。这些指令和数据都是8位的,单片机可以识别?可以,它会根据先后排列顺序和当前状态自动判断眼下的是指令还是数据,。。。那如果判断错了呢?这样的情况并非永远不存在,如果一旦发生(例如强电干扰)并且没有采取预防措施,就会引起乱套,。。。那是后话。还要注意咯,不同系列的单片机,同样的二进数表示的指令完全不同,51,AVR,430,等等都各是各,而且都是说自己最好。。。,管他那么多,能用就好。
单片机的引脚:要实现输入输出控制,当然要通过它的引脚进行啦,除了电源端,晶振端,复位端几个必须占用的引脚以外(大部分单片机如此,也有可以只要电源+-线的),其他很多引脚都是用来做输入/输出的,即所谓输入输出口或 I/O口。例如51机就有 P0 ,P1, P2, P3口;AVR则是PORTA, PORTB, PORTC, PORTD口。一般,和“8'位机对应,每个口也是8位(或更少)的,对于51机,如P1口,就有P1.0, P1.1, P1.2, P1.3, P1.4, P1.5, P1.6, P1.7 一共8个引脚。现在看下面2条指令:
MOV A, #08H
MOV P1,A
表示:给累加器A,一个数:08相当于二进数00001000;
把A的内容现在就是00001000传送到P1口;
结果:P1口的各个引脚上的电压除了P1.3是高(1)以外,其余各脚都是低(0),如果把8个发光管负极经过限流电阻接到P1口的8个脚正极接电源正,那么就有7个管子发光,哪个不亮呢?答案你一定知道了吧。。。这不是用软件控制了硬件吗?
或许你又说了,干吗转弯抹角用2条指令?直接
MOVP1, #08H 不是更直截了当?好是好,不过51机没有这样直接把一个数送到口上的指令,没法子,我们只能照规矩:“指令表”行事。
当然我们做单片机绝不是仅仅跑1、2条指令,怎样让他实现更复杂的功能呢?人们采取的高招就是用专门装置--编程器把许多指令按执行顺序一条条存放在程序存储器中,这个程序存储器在掉电时也保存其中的内容,那么给单片机一通电,他就按照程序存储器中的指令一条条执行下去,到最后再循环,不就实现了单片机吗? |