目录
一.首先安装keil,教程在这里
二.烧程序
1.上电
2.烧写软件
三.第一次点灯:
四.按键和闪烁点灯
1.按钮点灯关灯
2.延迟与闪烁
建议安装keil4,5没有c51包,要自己打进去
Keil5英文版软件下载和安装教程 (qq.com)
Keil4中文版软件下载和安装教程 (qq.com)
注册Keil软件时出现“ TOOLS.INI: TOOLCHAIN NOT INSTALLED ”的解决办法_帥氣的胖紙鍋的博客-CSDN博客
(28条消息) keil注释打不出中文?_keil无法显示汉字_朵啦~A梦的博客-CSDN博客
暂不提供安装包了,网上下一个
LQFP:我们用的52单片机的封装类型,看起来是方形的
打开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
keil:ctrl + 滚轮可以调整字体大小
#include "reg52.h"
sbit led1 = P3^7;//根据原理图(电路图),设备变量led1指向P3组IO口的第7口
sbit led2 = P3^6;//根据原理图(电路图),设备变量led2指向P3组IO口的第6口
void main()
{
led1 = 0;//根据电路图,低电平点亮led
led2 = 0;
while(1);
}
要烧录的程序,keil打开程序和原程序:
单片机重新上电后,成功点亮:蓝黄红
为什么灯会亮:
简单的串联电路,D4,D5,D6板子上有标记,D5一端通过电阻接5v,另外一端接着"LED1标志的线",我
们发现在89C52RC的电路图中也有LED1的标志,是在P3的IO口组中,在P3.7引脚,所以编程让P3.7出
低电平(0)就让D5灯完成一个串联电路,所以亮
怎么写程序找到IO口呢:ANSI C
sfr“指令”: 用来直接描述硬件地址,小白先理解成“一组IO口”的起始地址中数据
sfr P0 = 0x80;
P0= 0;
怎么找到IO口的具体一个引脚呢:
sbit“指令”:对应可位寻址空间的一个位,小白先理解成“一个IO口/针脚”的地址中数据
sbit led2 = P3^6
c语言的一个字节,char型就是8位
IO 组 |
0针 脚 |
1针 脚 |
2针 脚 |
3针 脚 |
4针 脚 |
5针 脚 |
6针 脚 |
7针 脚 |
数 值 |
输 入/ 输出 |
P0 | P0^0 | P0^1 | P0^2 | P0^3 | P0^4 | P0^5 | P0^6 | P0^7 | 0- 低 电 平 1- 高 电 平 |
给变 量赋 值, 就是 输出 被赋 值, 就是 输入 |
P1 | P1^0 | P1^1 | P1^2 | P1^3 | P1^4 | P1^5 | P1^6 | P1^7 | 同 上 |
同上 |
P2 | P2^0 | P2^1 | P2^2 | P2^3 | P2^4 | P2^5 | P2^6 | P2^7 | 同 上 |
同上 |
P3 | P3^0 | P3^1 | P3^2 | P3^3 | P3^4 | P3^5 | P3^6 | P3^7 | 同 上 |
同上 |
P4 | P4^0 | P4^1 | P4^2 | P4^3 | P4^4 | P4^5 | P4^6 | 无 | 同 上 |
同上 |
找到对应
点亮一个led
#include "reg52.h"
sbit ledOne = P3^7;
void main()
{
//灯亮,给一个P3.7低电平
ledOne = 0;
}
蓝红
先对照原理图
发现是
key1 = p2^1;
key2 = p2^2;
低电平接地说明按钮按下
所以写下代码:while(1)循环检测
#include "reg52.h"
sbit ledOne = P3^7;
sbit key1 = P2^1;
sbit key2 = P2^0;
void main()
{
while(1){
if(key1 == 0){
//灯亮,给一个P3.7低电平
ledOne = 0;
}
if(key2 == 0){
//灯灭,给一个P3.7高电平
ledOne = 1;
}
}
}
借助烧写工具
并且引入库
#include
不引入也行,删掉nop那一行就行,但是会不准
ledOne = !ledOne; //反转亮灭
软件消除抖动,延迟10ms再判断一次,就知道时抖动导致还是人为按按钮,
即 if() 嵌套 delay()+if(); 这里就不写出来了
代码
#include "reg52.h"
#include
sbit ledOne = P3^7;
sbit key1 = P2^1;
void Delay200ms() //@11.0592MHz
{
unsigned char i, j, k;
_nop_();
i = 2;
j = 103;
k = 147;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
void main()
{
while(1){
if(key1 == 0){
int i;
for(i=0;i<10;i++){
//灯亮,给一个P3.7低电平
ledOne = 0;
//延迟产生闪烁效果
Delay200ms();
ledOne = 1;
Delay200ms();
}
i = 0;
}
if(key2 == 0){
//灯亮,给一个P3.7低电平
//灯灭,给一个P3.7高电平
ledOne = !ledOne;
}
//消除按按钮时时长的影响
Delay200ms();
}
}
在业务场景比较复杂的情况下,不希望在判断里改变外设,这时使用标志位/状态位:
#include "reg52.h"
#include
#define ON_STATUS 1
#define OFF_STATUS 0
sbit ledOne = P3^7;
sbit key1 = P2^1;
sbit key2 = P2^0;
void main()
{
int ledMark = OFF_STATUS;
while(1){
if(key1 == 0){
ledMark = 1;
}
if(key2 == 0){
ledMark = 0;
}
if(ledMark ==1){
//灯亮,给一个P3.7低电平
ledOne = 0;
}else{
//灯灭,给一个P3.7高电平
ledOne = 1;
}
}
}