keil的使用:
具体细节请移步我上一篇博客:创建第一个51文件-CSDN博客
hex -- 汇编语言实现的文件 -- 直接与单片机对接的文件
单片机 -- 一个集成电脑芯片
单片机开发版 -- 基于单片机的集成电路
stc 89 c52RC / RD + 系列单片机 命名规则:
89 -- 版本号?
C -- 工作电压: C:3.3 ~5.5V LE :2.0~3.6 V
51 -- 程序空间大小 51 --4K 52 --8K
RC --RAM 大小 RC-- RAM位为512 RD+ 1280
工作频率
工作温度范围
封装类型
管脚数
==================================
单片机的思维发散:
1.单片机编程是什么 -- 人类要求单片机干具体的活 -- 体现写好纸条贴冰箱-- 提箱女友扫地
2.单片机执行程序怎么理解 -- 女朋友看到纸条后,照做
3.单片机能做什么事 -- IO口供电, 窜口传输
4.引脚: 方便人堆单片机额IO口,窜口接东西
5.冬季CPU怎么找到IO口: 寻址 -- 头文件
sfr指令 -- 描述硬件地址: sfr P0=Ox8o; P0=0;
sbit 指令 --对应可寻址空间的一个位,可理解为"'一组IO口 "的起始地址中的数据 sbit led2=P3^6;
C语言的一个字节, char 位8位
^ -- 访问 位
IO口 -- 推荐 使用P1~P3,P4 , 不建议使用P0口 -- 开漏输出 -- 可能会弄坏
封装 -- LQFP44
IO口的输入 -- 把外面的东西传进来
IO口的输出 -- 把数据传到外面
Such as:
sbit ifFire=P1^0;
int main()
{
int io_data;
//什么情况叫输入
io_data=ifFire; // 给变量赋值 -- 输入 or 这里引脚有数据啦,拿个变量来保存
if(io_idata == 0) {}
//什么情况输出
ifFire=1; // 赋予一个数值,引起IO电压变化,(1--高 0--低电平),此刻为输出来影响外界设备return 0;
}
==============================================
test1 -- 点亮一盏灯 -- 给低电平即可
#include"reg52.h"
sbit led1=P3^7;
sbit led2=P3^6;void main()
{
led1=0;
led2=0;
while(1);
}
test2 -- 让led 闪烁 -- 让led 高低电平迅速切换 -- 重复执行#include"reg52.h"
sbit led1=P3^7;
sbit led2=P3^6;void Delay500ms() //@11.0592MHz
{
unsigned char i, j, k;
i = 4;
j = 129;
k = 119;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}void main()
{
led2=0; // led2 一直亮
while(1) // led1 一直闪
{
led1=0;
Delay500ms(); // 给个500ms的延迟间隔 -- 方便观察
led1=1;
Delay500ms();
}
========================================
按键控制灯 :
查询法while 控制灯:
判断sw1内按下:
KEY1和GND接通 -- 0
sw1没被按下:
未接通 -- 1
key1 接到P2^1口
#include"reg52.h"
#include"reg52.h"
sbit led1=P3^7;
sbit key1=P2^1;
sbit key2=P2^0;void main()
{
while(1)
{
if(key1==0)
{
led1=0;
}
if(key2==0)
{
led1=1;
}
}
}
========================================
消除抖动
方法 -- 给个延时函数-- 判断是不是人按下的,还是抖动导致,人按下有个约50ms的反应时间
用到_nop(); // 添加头文件 #include<intrins.h>
#include"reg52.h"
#include<intrins.h>sbit led1=P3^7;
sbit key1=P2^1;
sbit key2=P2^0;
void Delay500ms() //@11.0592MHz
{
unsigned char i, j, k;_nop_();
i = 4;
j = 129;
k = 119;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
void main()
{
while(1)
{
if(key1==0)
{
Delay500ms();
if(key1==0){
led1=0;
}
}
if(key2==0)
{
Delay500ms();
if(key2==0)
led1=1;
}
}}
=========================
通过一个按键控制灯的开关 ! -- 取反
led1 =!led1;
也可以 定义一个 标记变量 ledMark -- 0 1dai 代表led的电平
keil 编译器有点damn ,局部变量的定义要放在第一行
#include"reg52.h"
#include<intrins.h>#define ON_STATUS 0
#define OFF_STATUS 1sbit led1=P3^7;
sbit key1=P2^1;
sbit key2=P2^0;
void Delay500ms() //@11.0592MHz
{
unsigned char i, j, k;_nop_();
i = 4;
j = 129;
k = 119;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
void main()
{
int LedMark=OFF_STATUS;while(1)
{
if(key1==0)
{
Delay500ms();
if(key1==0){
LedMark=ON_STATUS;
}
}
if(key2==0)
{
Delay500ms();
if(key2==0)
LedMark=OFF_STATUS;
}
if(!LedMark)
led1=0;
else
led1=1;
}
}