当前位置:   article > 正文

第一篇 51单片机入门篇_c51单片机基础教学

c51单片机基础教学

目录

一、开发环境

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、Keil5STC-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、关于sbitsfrbit

▶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闪烁

  1. #include "reg52.h"
  2. #include <intrins.h>
  3. #define ON 0
  4. #define OFF 1
  5. sbit led_1 = P3^7;
  6. void Delay1000ms() //@11.0592MHz
  7. {
  8. unsigned char i, j, k;
  9. _nop_();
  10. i = 8;
  11. j = 1;
  12. k = 243;
  13. do
  14. {
  15. do
  16. {
  17. while (--k);
  18. } while (--j);
  19. } while (--i);
  20. }
  21. void main(){
  22. while(1){
  23. led_1 = ON;
  24. Delay1000ms();
  25. led_1 = OFF;
  26. Delay1000ms();
  27. }
  28. }

3、按键控制led亮灭(一开一关)

  1. #include "reg52.h"
  2. #include <intrins.h>
  3. #define ON 0
  4. #define OFF 1
  5. sbit led_2 = P3^6;
  6. sbit key_1 = P2^1;
  7. sbit key_0 = P2^0;
  8. void Delay10ms() //@11.0592MHz
  9. {
  10. unsigned char i, j;
  11. i = 108;
  12. j = 145;
  13. do
  14. {
  15. while (--j);
  16. } while (--i);
  17. }
  18. void estimateLedMark(int ledMark){
  19. if(ledMark == ON){
  20. led_2 = 0;
  21. }else{
  22. led_2 = 1;
  23. }
  24. }
  25. void main(){
  26. int ledMark = OFF;
  27. while(1){
  28. if(key_0 == ON){
  29. Delay10ms(); //延迟后再进行一次键位检测
  30. if(key_0 == ON)
  31. ledMark = ON; //这里不直接灯亮,而是改变标志位的值
  32. }else if(key_1 == ON){
  33. Delay10ms();
  34. if(key_1 == ON)
  35. ledMark = OFF;
  36. }
  37. estimateLedMark(ledMark); //在这里判断标志位值,再进行灯亮灭
  38. }
  39. }

▶按键消抖方法:

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

①延时消抖:最简单的消抖原理,当检测到按键状态变化后,先等待一个 10ms 左右的延时时间,

让抖动消失后再进行一次按键状态检测,如果与刚才检测到的状态相同,就可以确认按键已经稳定

的动作。

②状态机消抖(略)

▶标志位控制灯

实现:在具体实现亮灯时,不直接将其置为低电平,而是通过赋值表示状态的变量,然后通过判断

该状态的值实现灯亮灭。

好处:这样的按键处理,让程序减少了while的松手检测,这对于程序是十分有利的。

                        (虽然这里并未体现得特别明显)

4.单按键控制led亮灭(I/O状态翻转)

  1. #include "reg52.h"
  2. #include <intrins.h>
  3. #define ON 0
  4. #define OFF 1
  5. sbit key_1 = P2^1;
  6. sbit led_2 = P3^6;
  7. void Delay500ms(){
  8. unsigned char i, j, k;
  9. _nop_();
  10. i = 4;
  11. j = 129;
  12. k = 119;
  13. do
  14. {
  15. do
  16. {
  17. while (--k);
  18. } while (--j);
  19. } while (--i);
  20. }
  21. void main(){
  22. led_2 = OFF;
  23. while(1){
  24. if(key_1 == 0){
  25. Delay500ms();
  26. led_2 = ~led_2; //当按键按下,高低电平互相翻转
  27. }
  28. }
  29. }

 I/O状态翻转

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小惠珠哦/article/detail/951388
推荐阅读
相关标签
  

闽ICP备14008679号