在前面的学习中,已经大概完成了C语言所有知识点的覆盖,接下来进入单片机的学习。
对于单片机开发的流程是:安装Keil,在keil中完成C语言代码的编写并保存为hex格式的文件 --> 使用stc-isp将hex格式的文件烧录进入单片机 --> 单片机重新上电并执行编写的代码
I/O口配置
对于C51,P1/P2/P3/P4 上电复位后为准双向口/弱上拉(传统8051的I/O口)模式,而 P0 上电复位后是开漏输出。所以P0作为I/O口时,需要加10K-4.7K的上拉电阻。
sfr 指令:用来直接描述硬件地址,sfr P0 = 0x80;
sbit 指令:对应可位寻址空间的一个位(一个字节等于8位),sbit led1 = P3^6
I/O口的输入输出: 对于89C52,这非常简单粗暴,因为不需要配置引脚的输入输出。 输入就是给变量赋值,如 io_data = P1^0; 输出就是赋值给I/O口,如P1^0 = 1;
I/O口最简单的应用就是点亮LED灯,其中稍微有些难度的就是使得LED闪烁,对于亮灭之间的精确定时,可以通过stc-isp助手中的“软件延时计算器”来实现:
对于一定的系统频率,选择想要的定时长度,选择适合芯片的指令集,就可以把生成的代码直接复制到KEIL里面去用了。
也可以将LED灯的亮灭绑定到按键上,这就首先需要查看原理图判断: 按键按下后对应高电平还是低电平。并且加上按键的消抖。
如图,当SW1被按下,KEY1和GND接通,为低电平;否则为高电平。
因此可以编写如下代码实现按下KEY1时led1的状态反转:
#include "reg52.h"
sbit led1 = P3^7;
sbit led2 = P3^6;
sbit key1 = P2^1;
void Delay100ms() //@11.0592MHz //从stc-isp上复制过来的
{
unsigned char i, j;
i = 180;
j = 73;
do
{
while (--j);
} while (--i);
}
void main()
{
int ledMark = 0; //变量定义必须放在第一行!!
led1 = 1;
//使用查询法查看KEY对应的I/O口是否被按下
while(1){
if(key1 == 0){ //key1位置和GND接通,表现为低电平,值为0
Delay100ms();//感觉被按下,但不确定是否是抖动还是人为的,所以等一等
if(key1 == 0){ //此时还被按着,说明是人为的
ledMark = 1;
}
}
if(ledMark == 1){
led1 = !led1;
ledMark = 0;
}
}
}
其中,ledMark的使用在这段程序中很鸡肋,但是面对很大的代码量的工程文件会很有用,所以可以先使用一下养成习惯