当前位置:   article > 正文

STC89C52:快速搭建与IO_keil里的at89c52安装

keil里的at89c52安装

目录

一.首先安装keil,教程在这里

 二.烧程序

1.上电

 2.烧写软件

三.第一次点灯:

 四.按键和闪烁点灯

1.按钮点灯关灯

2.延迟与闪烁


 

一.首先安装keil,教程在这里

建议安装keil4,5没有c51包,要自己打进去

Keil5英文版软件下载和安装教程 (qq.com)

 Keil4中文版软件下载和安装教程 (qq.com)

注册Keil软件时出现“ TOOLS.INI: TOOLCHAIN NOT INSTALLED ”的解决办法_帥氣的胖紙鍋的博客-CSDN博客

 (28条消息) keil注释打不出中文?_keil无法显示汉字_朵啦~A梦的博客-CSDN博客

 二.烧程序

1.上电

7077e33a587e4d7dbd3b219775707450.png

 2.烧写软件

781f4f0d68b14441869db524e89e4fdf.png

 暂不提供安装包了,网上下一个

39124d267bd44aeaab82341c15409cc1.png

 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

f7c49362be644b7c91deefc2b5a1edb9.png

 726da796274345f0a1c86b69c0bd9e29.png

 keil:ctrl + 滚轮可以调整字体大小

  1. #include "reg52.h"
  2. sbit led1 = P3^7;//根据原理图(电路图),设备变量led1指向P3组IO口的第7口
  3. sbit led2 = P3^6;//根据原理图(电路图),设备变量led2指向P3组IO口的第6口
  4. void main()
  5. {
  6. led1 = 0;//根据电路图,低电平点亮led
  7. led2 = 0;
  8. while(1);
  9. }

 要烧录的程序,keil打开程序和原程序:

2f8dbcaf16ff41f4bd26e498054eecc5.png

 打开hex文件,然后点击“下载/编程”ce32653bb8504537b4951f2193174fb1.png

 单片机重新上电后,成功点亮:蓝黄红

9911f8457bf342dcba7b8aeb3377aed0.png

三.第一次点灯:

为什么灯会亮:

简单的串联电路,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针


入/
输出
P0P0^0P0^1P0^2P0^3P0^4P0^5P0^6P0^70-



1-


给变
量赋
值,
就是
输出
被赋
值,
就是
输入
P1P1^0P1^1P1^2P1^3P1^4P1^5P1^6P1^7
同上
P2P2^0P2^1P2^2P2^3P2^4P2^5P2^6P2^7
同上
P3P3^0P3^1P3^2P3^3P3^4P3^5P3^6P3^7
同上
P4P4^0P4^1P4^2P4^3P4^4P4^5P4^6
同上

 1bf2bb761a2844058cc79b1e5e32206e.png

 本开发板原理图00f580e6639043f6b60ba5dba4aa92da.png

 cd4a1935c2354efbbf2f9b94a4cdafaa.png

 d761a0b078a94cf6aa404576da8d9458.png

 找到对应

点亮一个led

  1. #include "reg52.h"
  2. sbit ledOne = P3^7;
  3. void main()
  4. {
  5. //灯亮,给一个P3.7低电平
  6. ledOne = 0;
  7. }

 蓝红

43310c7b742949d799de4312fe5ccafd.png

 四.按键和闪烁点灯

1.按钮点灯关灯

先对照原理图

6eb964e38e6b46f0bc7d426579d9ac1c.png

 2d00f005183448c9adf8198ca1984da6.png

 发现是

key1 = p2^1;

key2 = p2^2;

低电平接地说明按钮按下

所以写下代码:while(1)循环检测

  1. #include "reg52.h"
  2. sbit ledOne = P3^7;
  3. sbit key1 = P2^1;
  4. sbit key2 = P2^0;
  5. void main()
  6. {
  7. while(1){
  8. if(key1 == 0){
  9. //灯亮,给一个P3.7低电平
  10. ledOne = 0;
  11. }
  12. if(key2 == 0){
  13. //灯灭,给一个P3.7高电平
  14. ledOne = 1;
  15. }
  16. }
  17. }

2.延迟与闪烁

借助烧写工具

7a6825c94a3a41029a5abcfefff43669.png

 并且引入库

#include <intrins.h>

不引入也行,删掉nop那一行就行,但是会不准

ledOne = !ledOne;    //反转亮灭

软件消除抖动,延迟10ms再判断一次,就知道时抖动导致还是人为按按钮,

即 if() 嵌套 delay()+if(); 这里就不写出来了

代码

  1. #include "reg52.h"
  2. #include <intrins.h>
  3. sbit ledOne = P3^7;
  4. sbit key1 = P2^1;
  5. void Delay200ms() //@11.0592MHz
  6. {
  7. unsigned char i, j, k;
  8. _nop_();
  9. i = 2;
  10. j = 103;
  11. k = 147;
  12. do
  13. {
  14. do
  15. {
  16. while (--k);
  17. } while (--j);
  18. } while (--i);
  19. }
  20. void main()
  21. {
  22. while(1){
  23. if(key1 == 0){
  24. int i;
  25. for(i=0;i<10;i++){
  26. //灯亮,给一个P3.7低电平
  27. ledOne = 0;
  28. //延迟产生闪烁效果
  29. Delay200ms();
  30. ledOne = 1;
  31. Delay200ms();
  32. }
  33. i = 0;
  34. }
  35. if(key2 == 0){
  36. //灯亮,给一个P3.7低电平
  37. //灯灭,给一个P3.7高电平
  38. ledOne = !ledOne;
  39. }
  40. //消除按按钮时时长的影响
  41. Delay200ms();
  42. }
  43. }

在业务场景比较复杂的情况下,不希望在判断里改变外设,这时使用标志位/状态位:

  1. #include "reg52.h"
  2. #include <intrins.h>
  3. #define ON_STATUS 1
  4. #define OFF_STATUS 0
  5. sbit ledOne = P3^7;
  6. sbit key1 = P2^1;
  7. sbit key2 = P2^0;
  8. void main()
  9. {
  10. int ledMark = OFF_STATUS;
  11. while(1){
  12. if(key1 == 0){
  13. ledMark = 1;
  14. }
  15. if(key2 == 0){
  16. ledMark = 0;
  17. }
  18. if(ledMark ==1){
  19. //灯亮,给一个P3.7低电平
  20. ledOne = 0;
  21. }else{
  22. //灯灭,给一个P3.7高电平
  23. ledOne = 1;
  24. }
  25. }
  26. }

 

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/笔触狂放9/article/detail/531279
推荐阅读
相关标签
  

闽ICP备14008679号