赞
踩
目录
建议安装keil4,5没有c51包,要自己打进去
注册Keil软件时出现“ TOOLS.INI: TOOLCHAIN NOT INSTALLED ”的解决办法_帥氣的胖紙鍋的博客-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打开程序和原程序:
打开hex文件,然后点击“下载/编程”
单片机重新上电后,成功点亮:蓝黄红
为什么灯会亮:
简单的串联电路,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 <intrins.h>
不引入也行,删掉nop那一行就行,但是会不准
ledOne = !ledOne; //反转亮灭
软件消除抖动,延迟10ms再判断一次,就知道时抖动导致还是人为按按钮,
即 if() 嵌套 delay()+if(); 这里就不写出来了
代码
- #include "reg52.h"
- #include <intrins.h>
-
- 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 <intrins.h>
-
- #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;
- }
-
- }
- }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。