最近学的真的很杂,没办法,毕竟要恰饭。keil和proteus从没用过,本篇博客用于记录两个软件的学习过程以及嵌入式编程学习过程。
本篇包括:
安装过程
新手村任务
keil的使用
proteus的使用
一、安装过程:
我之前的博客提到过keil怎么安装,并且附带了地址,可以破解。
proteus也很简单,直接下载然后破解即可
二、新手村任务
keil不方便的地方就在于他没有代码补全的功能。其他还好,支持C\C++编译,自带的内核也很多。
这里准备了两个新手项目入手,点亮led灯和跑马灯。
1. 点亮led灯
首先先来一个最简单的led点亮程序吧:
1. 新建项目,选择at89c52,空白项目,新建一个c语言文件。
2. 配置编译参数,魔术棒---output----creat hex file打钩。
3. 输入代码:
#include <reg52.h> sbit led = P0^1; void main() { led = 0; }
led = 0 代表了低电平,低电平就亮了,这个原理也不知道。慢慢摸索。
完事以后编译会生成hex文件。
打开proteus软件,开始画图
在proteus软件内,也是生成一个空的图纸,选择工具栏鼠标下面的devices---p(pick)先搜索at89c52然后画进去,同理画一个LED-YELLOW进去,然后在下面几个图标中找到power。
然后用线点连起来就完事了。
选择芯片右键,编辑属性,把
hex文件放进program file 里面,然后确定,点击左下角的开始,灯就亮了。
小程序挺有意思的,还是再弄一个跑马灯的试一下吧,我这里有一个跑马灯的代码,现在就差proteus的图纸不会画。
另外,我还需要理解哪些代码代表什么,为什么会有一个p^1这种东西。
2. 跑马灯小程序
先开始做跑马灯吧。
代码如下
#include <reg52.h> sbit led1 = P1^0; sbit led2 = P1^1; void delay(unsigned int n) { unsigned char i; while(--n) for(i = 0; i<125;i++); } int main(void) { while(1) { led1=0; led2=1; delay(1000); led1=1; led2=0; delay(1000); } }
建立图纸,然后80c52芯片,添加一对元器件
那个两竖线的是电容,中间一个矩阵的是晶振其他都还好,r后画完以后就跑通了,非常稳。
既然实现已经实现了,接下来重要的问题在于理解代码。
我们先从点亮led灯开始理解代码:
#include <reg52.h>
sbit led = P0^1;
void main()
{
led = 0;
}
这个代码的疑问就在于那个:led = P0^1是什么东西,为什么P0这个参数能直接出来赋值?
我们还是到reg52.h里面一探究竟:
#ifndef __REG52_H__
#define __REG52_H__
/* BYTE Registers */
sfr P0 = 0x80;
sfr P1 = 0x90;
sfr P2 = 0xA0;
sfr P3 = 0xB0;
sfr PSW = 0xD0;
sfr ACC = 0xE0;
sfr B = 0xF0;
sfr SP = 0x81;
sfr DPL = 0x82;
我节选一点reg52.h里面的代码片段,可以看到,里面是吧P0初始赋值了的,用的是16进制。
我们知道16进制的东西大多数用于地址,那么也说得通,这个reg52.h就是初始化我们的80c52芯片的一个程序。
先理解两个概念:字节地址和位地址。
1B=8Bit,所以一个字节中会有8个二进制数。我们说的按字节寻址就是找到第X个字节的位置,而按位寻址就是不仅能找到在哪个自己,还能找到具体哪一个二进制数。这个在单片机的存储单元里面会经常接触。
接下来这个sfr是一个神奇的东西,他不是广义上的类型,是一种特殊功能寄存器。
首先这个单片机的所有地址是布好的,这个比如说0x90这个地址就是引脚P1的地址,当你输入 sfr P1 = 0x90这个代码,就意味着P1就是P1了,说白了就是代码变量P1就是板子上画的P1引脚了。
我们之后对代码变量P1的操作都会直接映射到芯片P1引脚,等价于直接映射到那个地址。这三个量就是同一个东西,0x90地址、代码P1变量、板子上的P1引脚三位一体。更细节的REG52.h的分析请参考另一篇博客https://blog.csdn.net/lirunqi3/article/details/97889851