目录
一、开发环境
1、Keil5和STC-ISP
(1)keil5创建工程并设置生成.hex文件
(2)STC-ISP烧写keil编译生成的程序到单片机
二、点亮单片机的LED灯
1、关于sbit、sfr和bit
2、延时函数实现led闪烁
3、按键控制led亮灭(一开一关)
▶按键消抖方法:
▶标志位控制灯:
4.单按键控制led亮灭(I/O状态翻转)
▶ I/O状态翻转
一、开发环境
1、Keil5和STC-ISP
(PS:本篇不涉及安装、汉化和破解等)
(1)keil5创建工程并设置生成.hex文件
①在任意位置创建项目工程文件夹命名为template(当做模板)
②在文件夹template中创建main.c
③打开keil工具栏project->new uVision project->选择第一步的工程文件夹位置->输入工程名
字->选择芯片类型AT89c52->会提示是否拷贝STARTUP.A51,选择是->生成了工程目录->在工程目
录Source Group1上右键鼠标->add Exiting file to Source Group1...->选择代码文件main.c
④Alt+F7打开设置选项,勾选create HEX file,确认即可
(2)STC-ISP烧写keil编译生成的程序到单片机
①单片机通过type-C数据线和电脑连接(如果不识别,安装ch340驱动,在资料包中选择单片机型
号STC89C52RC。
②选择生成的执行程序文件.hex
③点击"下载/编程"按钮
④单片机开关拨动重新上电
二、点亮单片机的LED灯
1、关于sbit、sfr和bit
▶sbit定义特殊功能寄存器的位变量(定义寻址对象,如访问特殊功能寄存器的某一个位)
▶sfr访问单片机内部所有特殊功能寄存器(如sfr P1 = 0x90这一句定P1为P1端口在片内寄存器)
▶bit定义一个位标量,但不能定义位指针,也不能定义位数组。它的值是一个二进制位,不是0就是1,类似一些高级语言中的Boolean类型中的True和False。 bit和int char之类的差不多,只不过char=8位, bit=1位而已,都是变量。
(sbit、bit和sfr都是C51的扩充数据类型)
2、延时函数实现led闪烁
#include "reg52.h"
#include <intrins.h>
#define ON 0
#define OFF 1
sbit led_1 = P3^7;
void Delay1000ms() //@11.0592MHz
{
unsigned char i, j, k;
_nop_();
i = 8;
j = 1;
k = 243;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
void main(){
while(1){
led_1 = ON;
Delay1000ms();
led_1 = OFF;
Delay1000ms();
}
}
3、按键控制led亮灭(一开一关)
#include "reg52.h"
#include <intrins.h>
#define ON 0
#define OFF 1
sbit led_2 = P3^6;
sbit key_1 = P2^1;
sbit key_0 = P2^0;
void Delay10ms() //@11.0592MHz
{
unsigned char i, j;
i = 108;
j = 145;
do
{
while (--j);
} while (--i);
}
void estimateLedMark(int ledMark){
if(ledMark == ON){
led_2 = 0;
}else{
led_2 = 1;
}
}
void main(){
int ledMark = OFF;
while(1){
if(key_0 == ON){
Delay10ms(); //延迟后再进行一次键位检测
if(key_0 == ON)
ledMark = ON; //这里不直接灯亮,而是改变标志位的值
}else if(key_1 == ON){
Delay10ms();
if(key_1 == ON)
ledMark = OFF;
}
estimateLedMark(ledMark); //在这里判断标志位值,再进行灯亮灭
}
}
▶按键消抖方法:
①延时消抖:最简单的消抖原理,当检测到按键状态变化后,先等待一个 10ms 左右的延时时间,
让抖动消失后再进行一次按键状态检测,如果与刚才检测到的状态相同,就可以确认按键已经稳定
的动作。
②状态机消抖(略)
▶标志位控制灯:
实现:在具体实现亮灯时,不直接将其置为低电平,而是通过赋值表示状态的变量,然后通过判断
该状态的值实现灯亮灭。
好处:这样的按键处理,让程序减少了while的松手检测,这对于程序是十分有利的。
(虽然这里并未体现得特别明显)
4.单按键控制led亮灭(I/O状态翻转)
#include "reg52.h"
#include <intrins.h>
#define ON 0
#define OFF 1
sbit key_1 = P2^1;
sbit led_2 = P3^6;
void Delay500ms(){
unsigned char i, j, k;
_nop_();
i = 4;
j = 129;
k = 119;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
void main(){
led_2 = OFF;
while(1){
if(key_1 == 0){
Delay500ms();
led_2 = ~led_2; //当按键按下,高低电平互相翻转
}
}
}