赞
踩
目录
(PS:本篇不涉及安装、汉化和破解等)
①在任意位置创建项目工程文件夹命名为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,确认即可
①单片机通过type-C数据线和电脑连接(如果不识别,安装ch340驱动,在资料包中选择单片机型
号STC89C52RC。
②选择生成的执行程序文件.hex
③点击"下载/编程"按钮
④单片机开关拨动重新上电
▶sbit定义特殊功能寄存器的位变量(定义寻址对象,如访问特殊功能寄存器的某一个位)
▶sfr访问单片机内部所有特殊功能寄存器(如sfr P1 = 0x90这一句定P1为P1端口在片内寄存器)
▶bit定义一个位标量,但不能定义位指针,也不能定义位数组。它的值是一个二进制位,不是0就是1,类似一些高级语言中的Boolean类型中的True和False。 bit和int char之类的差不多,只不过char=8位, bit=1位而已,都是变量。
(sbit、bit和sfr都是C51的扩充数据类型)
- #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();
- }
- }
- #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的松手检测,这对于程序是十分有利的。
(虽然这里并未体现得特别明显)
- #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; //当按键按下,高低电平互相翻转
- }
- }
- }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。