STC89C51/52 单片机

在前面的学习中,已经大概完成了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的使用在这段程序中很鸡肋,但是面对很大的代码量的工程文件会很有用,所以可以先使用一下养成习惯

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值