STC89C52:快速搭建与IO

目录

一.首先安装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.上电

STC89C52:快速搭建与IO_第1张图片

 2.烧写软件

781f4f0d68b14441869db524e89e4fdf.png

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

STC89C52:快速搭建与IO_第2张图片

 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

STC89C52:快速搭建与IO_第3张图片

 STC89C52:快速搭建与IO_第4张图片

 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打开程序和原程序:

STC89C52:快速搭建与IO_第5张图片

 打开hex文件,然后点击“下载/编程”STC89C52:快速搭建与IO_第6张图片

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

STC89C52:快速搭建与IO_第7张图片

三.第一次点灯:

为什么灯会亮:

简单的串联电路,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针


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



1-


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

 STC89C52:快速搭建与IO_第8张图片

 本开发板原理图STC89C52:快速搭建与IO_第9张图片

 STC89C52:快速搭建与IO_第10张图片

 STC89C52:快速搭建与IO_第11张图片

 找到对应

点亮一个led

#include "reg52.h"

sbit ledOne = P3^7;

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

 蓝红

STC89C52:快速搭建与IO_第12张图片

 四.按键和闪烁点灯

1.按钮点灯关灯

先对照原理图

STC89C52:快速搭建与IO_第13张图片

 STC89C52:快速搭建与IO_第14张图片

 发现是

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.延迟与闪烁

借助烧写工具

STC89C52:快速搭建与IO_第15张图片

 并且引入库

#include

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

ledOne = !ledOne;    //反转亮灭

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

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

代码

#include "reg52.h"
#include 

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 

#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;		
			}
						
	} 
}

 

 

你可能感兴趣的:(C51,单片机,嵌入式硬件)