STC89C52:快速搭建与IO

本文详细介绍了单片机开发的初步步骤,包括安装Keil软件(推荐使用Keil4),烧写程序的方法,以及如何通过编写C语言代码实现单片机点灯和按键控制点灯的闪烁功能。同时,文中还解释了电路原理和代码中的关键指令。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

一.首先安装keil,教程在这里

 二.烧程序

1.上电

 2.烧写软件

三.第一次点灯:

 四.按键和闪烁点灯

1.按钮点灯关灯

2.延迟与闪烁


 

一.首先安装keil,教程在这里

建议安装keil4,5没有c51包,要自己打进去

Keil5英文版软件下载和安装教程 (qq.com)

 Keil4中文版软件下载和安装教程 (qq.com)

注册Keil软件时出现“ TOOLS.INI: TOOLCHAIN NOT INSTALLED ”的解决办法_帥氣的胖紙鍋的博客-CSDN博客

 (28条消息) keil注释打不出中文?_keil无法显示汉字_朵啦~A梦的博客-CSDN博客

 二.烧程序

1.上电

7077e33a587e4d7dbd3b219775707450.png

 2.烧写软件

781f4f0d68b14441869db524e89e4fdf.png

 暂不提供安装包了,网上下一个

39124d267bd44aeaab82341c15409cc1.png

 LQFP:我们用的52单片机的封装类型,看起来是方形的

打开keil开始写第一个程序:点灯

1. 创建项目工程文件夹,可以当作模板Template
2. 创建文件,取名main.c (要打开拓展名,在文件夹窗口上找 “查看”,勾选“文件拓展名”)
3. 进入keil主页面,工具栏project->new uVision project->选择第一步的工程文件夹位置->输入
工程名字->选择芯片类型AT89c52->会提示是否拷贝STARTUP.A51,选择是->生成了工程目录-
>在工程目录Source Group1上右键鼠标->add Exiting file to Source Group1...->选择代码文
件main.c
1. 编程,新手如果看不懂以下代码,可以忽略,这次实验只是强调开发流程
2. 编译,选择输出文件有hex

f7c49362be644b7c91deefc2b5a1edb9.png

 726da796274345f0a1c86b69c0bd9e29.png

 keil:ctrl + 滚轮可以调整字体大小

#include "reg52.h"
sbit led1 = P3^7;//根据原理图(电路图),设备变量led1指向P3组IO口的第7口
sbit led2 = P3^6;//根据原理图(电路图),设备变量led2指向P3组IO口的第6口
void main()
{
led1 = 0;//根据电路图,低电平点亮led
led2 = 0;
while(1);
}

 要烧录的程序,keil打开程序和原程序:

2f8dbcaf16ff41f4bd26e498054eecc5.png

 打开hex文件,然后点击“下载/编程”ce32653bb8504537b4951f2193174fb1.png

 单片机重新上电后,成功点亮:蓝黄红

9911f8457bf342dcba7b8aeb3377aed0.png

三.第一次点灯:

为什么灯会亮:

简单的串联电路,D4,D5,D6板子上有标记,D5一端通过电阻接5v,另外一端接着"LED1标志的线",我
们发现在89C52RC的电路图中也有LED1的标志,是在P3的IO口组中,在P3.7引脚,所以编程让P3.7出
低电平(0)就让D5灯完成一个串联电路,所以亮

怎么写程序找到IO口呢:ANSI C
sfr“指令”: 用来直接描述硬件地址,小白先理解成“一组IO口”的起始地址中数据

sfr P0 = 0x80;

P0= 0;
怎么找到IO口的具体一个引脚呢:
sbit“指令”:对应可位寻址空间的一个位,小白先理解成“一个IO口/针脚”的地址中数据

sbit led2 = P3^6
c语言的一个字节,char型就是8位

IO
0针
1针
2针
3针
4针
5针
6针
7针


入/
输出
P0P0^0P0^1P0^2P0^3P0^4P0^5P0^6P0^70-



1-


给变
量赋
值,
就是
输出
被赋
值,
就是
输入
P1P1^0P1^1P1^2P1^3P1^4P1^5P1^6P1^7
同上
P2P2^0P2^1P2^2P2^3P2^4P2^5P2^6P2^7
同上
P3P3^0P3^1P3^2P3^3P3^4P3^5P3^6P3^7
同上
P4P4^0P4^1P4^2P4^3P4^4P4^5P4^6
同上

 1bf2bb761a2844058cc79b1e5e32206e.png

 本开发板原理图00f580e6639043f6b60ba5dba4aa92da.png

 cd4a1935c2354efbbf2f9b94a4cdafaa.png

 d761a0b078a94cf6aa404576da8d9458.png

 找到对应

点亮一个led

#include "reg52.h"

sbit ledOne = P3^7;

void main()
{
    //灯亮,给一个P3.7低电平
    ledOne = 0;
}

 蓝红

43310c7b742949d799de4312fe5ccafd.png

 四.按键和闪烁点灯

1.按钮点灯关灯

先对照原理图

6eb964e38e6b46f0bc7d426579d9ac1c.png

 2d00f005183448c9adf8198ca1984da6.png

 发现是

key1 = p2^1;

key2 = p2^2;

低电平接地说明按钮按下

所以写下代码:while(1)循环检测

#include "reg52.h"

sbit ledOne = P3^7;
sbit key1 = P2^1;
sbit key2 = P2^0;

void main()
{
	while(1){
		if(key1 == 0){
				//灯亮,给一个P3.7低电平
				ledOne = 0;
			}
			if(key2 == 0){
				//灯灭,给一个P3.7高电平
				ledOne = 1;	
			}
	} 
}

2.延迟与闪烁

借助烧写工具

7a6825c94a3a41029a5abcfefff43669.png

 并且引入库

#include <intrins.h>

不引入也行,删掉nop那一行就行,但是会不准

ledOne = !ledOne;    //反转亮灭

软件消除抖动,延迟10ms再判断一次,就知道时抖动导致还是人为按按钮,

即 if() 嵌套 delay()+if(); 这里就不写出来了

代码

#include "reg52.h"
#include <intrins.h>

sbit ledOne = P3^7;
sbit key1 = P2^1;

void Delay200ms()		//@11.0592MHz
{
	unsigned char i, j, k;

	_nop_();
	i = 2;
	j = 103;
	k = 147;
	do
	{
		do
		{
			while (--k);
		} while (--j);
	} while (--i);
}


void main()
{
	while(1){
		if(key1 == 0){
			
				int i;
				for(i=0;i<10;i++){
					//灯亮,给一个P3.7低电平
					ledOne = 0;
					//延迟产生闪烁效果
					Delay200ms();
					
					ledOne = 1;
					Delay200ms();
				}
				i = 0;
			}
			if(key2 == 0){
				//灯亮,给一个P3.7低电平
				//灯灭,给一个P3.7高电平
				ledOne = !ledOne;	
			}
			//消除按按钮时时长的影响
			Delay200ms();
	} 
}

在业务场景比较复杂的情况下,不希望在判断里改变外设,这时使用标志位/状态位:

#include "reg52.h"
#include <intrins.h>

#define ON_STATUS  1
#define OFF_STATUS 0

sbit ledOne = P3^7;
sbit key1 = P2^1;
sbit key2 = P2^0;

void main()
{
	int ledMark = OFF_STATUS;
	
	
	while(1){
			if(key1 == 0){
				ledMark = 1;
			}
			if(key2 == 0){
				ledMark = 0;
			}
			
			if(ledMark ==1){
				//灯亮,给一个P3.7低电平
				ledOne = 0;	
			}else{
				//灯灭,给一个P3.7高电平
				ledOne = 1;		
			}
						
	} 
}

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值