使用keil
1.创建项目工程文件夹,可以当作模板template
2.创建文件,取名main.c(要打开拓展名,在文件夹窗口上赵“查看”,勾选“文件拓展名”)
3.进入keil主页面,工具栏project->new uVision project->选择第一步的工程文件夹位置->输入工程名字 ->选择芯片类型AT89c52->会提示是否拷贝STARTUP.A51,选择是->生成了工程目录->在工程目录Source Group1上右键鼠标->add Exiting file to Source Group1...->选择代码文件main.c
1.编程,新手如果看不懂以下代码,可以忽略,这次实验只是强调开发流程
2.编译,选择输出文件有hex
初始单片机
1.什么是单片机
是一种集成电路芯片
把具有数据处理能力的中央处理器CPU,随机存储器RAM,只读存储器ROM
多种I/O口和中断系统,定时器,计数器等功能(可能还包括驱动电路,脉宽调制电路,模拟多路转换器,A/D转换器等电路)
集成到一块硅芯片上构成一个小而完善的计算机系统,在工业控制领域广泛应用
STC89系列单片机
命名规则,封装LQFQ44,特性定时器,计数器,串口,看门狗,I/O口
单片机有外接电路,他会把单片机里面的针脚引出来变成一个插针,想要让一个蜂鸣器连接到单片机上的某个I/O口,查到插针上就可以了
上面有四组I/O口,有p0,p1,p2,p3,一般不推荐用p0口,因为p0口是开漏电路,可能会导致模块的使用产生问题,其他三个口都可以用
单片机编程是什么:人类要求单片机干具体的活,有点像提前写个小纸条,把它贴在冰箱上,告诉npy应该干什么
单片机程序怎么理解:看到纸条之后照做
单片机能做什么事:I/O口供电,数据的传输等等
肉眼可见的引脚是什么:方便人类对I/O口,串口接东西
单片机CPU怎么找到I/O口:通过寻址,说白了有一些地址数据,头文件帮你做很多了
sfr“指令”:用来直接描述硬件地址,小白先理解成“一组I/O口”,的起始地址中数据
sfr P0 =0x80 ;
一号89C52有5组这样的输入输出口,分别为P0,P1,P2,P3,每组对应8个针脚,P4是RC系列才有的,7个针脚
怎么才能找到IO口的具体的一个引脚呢?
sbit“指令”:对应可位寻址空间的一个位,可以先理解成“一个IO/针脚”
C语言一个字节,char型就是8位
对于单片机来说
输入(把外面的东西拿回来)输出(把东西给外面)
给变量赋值就是
sbit IFfire = P1^0;
int main()
{
int io_data;
什么情况就是输入
io_data = IFfire;给变量赋值,就是输入 --或者理解为,这个针脚有数据了,拿个变量来保存
if(io_data == 0){
}
什么情况就是输出
IFfire = 1;
被赋予一个数值,引起IO口电压变化(一般1输出高电平,0输出低电平),此时为输出,来影响外接的电路
return 0;
}
点亮一个LED灯,并闪烁
#include "reg52.h"
sbit LEDone = P3^7;
void Delay400ms() //@11.0592MHz
{
unsigned char i, j, k;
i = 3;
j = 206;
k = 43;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
void main()
{
//µãÁÁ
LEDone = 0;
//ÊýÊý£¬ÆÚ¼äά³ÖµÍµçƽ
Delay400ms();
//µÆÃð
LEDone = 1;
//ÊýÊý,ÆÚ¼äά³Ö¸ßµçƽ
Delay400ms();
}
查询法按键控制灯
怎么知道sw1按键被按下
KEY1位置和GND接通,表现为低电平,值为0
怎么知道sw1按键没有被按下
KEY1位置和GND未被接通,通过上拉电阻到5v,表现为高电平,值为1.
接下来,不断检测STC89C52RC的P2.1的值(0-按下,1-松开),即可知道按键是否被按下
KEY的作用是通过读这个位置来判断sw1
I/O口状态翻转
!符号
如:if(key1 == 0) ---> if(!key1 == 0)
#include "reg52.h"
#include <intrins.h>
sbit key1 = P2^1;
sbit key2 = P2^0;
sbit ledOne = P3^7;
//消除抖动
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()
{
ledOne = 1;
//查询法检测,是否被按下
while (1)
{
if(key1 == 0)//key1位置和GND位置接通,表现为低电平,值为0.
{
//感觉按键被按下,不知道是抖动还是人为
//增加一个延时
//灯亮,给P3.7一个低电平
Delay500ms();
if(key1 == 0){
ledOne = !ledOne;
}
}
if(key2 == 0)
{
ledOne = 1;
}
}
}
当软件的逻辑比较复杂,不希望在判断里面去控制外设,这个时候就需要用到标志位,
定义一个变量,这个变量的值可能是0可能是1,用0和1来表示我记住了某个I/O口的状态,然后再需要修改I/O口的位置去改,
#include "reg52.h"
#include <intrins.h>
#define ON_STATUS 0
#define OFF_STATUS 1
sbit key1 = P2^1;
sbit key2 = P2^0;
sbit ledOne = P3^7;
//消除抖动
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;
ledOne = 1;
//查询法检测,是否被按下
while (1)
{
if(key1 == 0)//key1位置和GND位置接通,表现为低电平,值为0.
{
//感觉按键被按下,不知道是抖动还是人为
//增加一个延时
//灯亮,给P3.7一个低电平
Delay500ms();
//通过外部改变
if(key1 == 0){
//记住key1被按下,在其他地方点灯
ledmark = ON_STATUS;
}
}
if(key2 == 0)//key2位置和GND位置接通,表现为低电平,值为0.
{
ledmark = OFF_STATUS;
}
//在这里电灯或者关闭
//进行判断,电灯或者关闭
if(ledmark == OFF_STATUS){
ledOne = 1;//维持高电平,无电流流通,熄灭
}else{
ledOne = 0;//维持低电平,有电流流通,点亮
}
}
}
key == 0表明和GND接通,维持低电平,值为0
ledOne = 0,表明维持低电平,有电流流通,灯会被点亮
要让灯被点亮,只需给它一个低电平