admin管理员组

文章数量:1794759

第一篇 51单片机入门篇

第一篇 51单片机入门篇

目录

一、开发环境

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); //在这里判断标志位值,再进行灯亮灭 } } ▶按键消抖方法:

(详见单片机按键“消抖”的思考_守恒的博客-CSDN博客_单片机按键消抖) 

①延时消抖:最简单的消抖原理,当检测到按键状态变化后,先等待一个 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; //当按键按下,高低电平互相翻转 } } } ▶ I/O状态翻转

本文标签: 单片机第一篇入门篇