历史上的今天
今天是:2025年08月20日(星期三)
2021年08月20日 | 51单片机-模块初始化
2021-08-20 来源:eefocus
1.硬件的初始化
学单片机需要往前走,所以我们必须提前熟悉单片机嵌入式的代码书写风格。
还记得我们要点亮小灯需要的条件吗
首先:
sbit LED2 = P0^0;
sbit ADDR2 = P1^2;
sbit ADDR1 = P1^1;
sbit ADDR0 = P1^0;
sbit ENLED = P1^4;
sbit ADDR3 = P1^3;
然后:
ADDR3 = 1;//使能三八译码器
ENLED = 0;//
ADDR2 = 1;//**************************
ADDR1 = 1;//让三八译码器的IO6输出低电平
ADDR0 = 0;//**************************
上面这些条件满足了就叫LED的初始化,也就是说,要想使用硬件上的模块,我们必须配置好它的IO端口输出情况或者设置好函数的参数使其能工作。
注意:初始化不是放在while(1)循环中反复执行,而是在主函数开头把相应的IO端口该输出低电平的输出低电平,该输出高电平的输出高电平,配置好这些器件,它只需在主函数开头执行一次即可,后面就是进入死循环去真正的实现相应的功能了。像有些器件的初始化需要IO端口满足一些时序要求,就是高低电平保持多长时间这些,后面我们遇到这种器件再讲。
2.小灯的初始化
我们已经知道小灯要能正常工作,就要满足P1的5个IO端口的条件
所以LED小灯的初始化就封装为
void LED_Init()
{
P1|=0x0E;//让P1.1,P1.2,P1.3强制输出1
P1&=0xEE;//让P1.0和P1.4强制输出0
}
这两行代码大家自己分析原理。
不过要记住数码管工作的时候,小灯是暂时发挥不了作用的,因为三八译码器的IO6端口的输出已经切换了。
数码管显示任务的代码我们参考了宋老师的简化书写方式,在此之前大家先看到之前的“SEG_task()”。
void SEG_task()//数码管显示函数
{
static unsigned char i=0;
P0=0xFF;//端口状态全部熄灭数码管里的LED达到刷新作用
switch(i)
{
case 0:
ADDR2 = 0;ADDR1 = 0;ADDR0 = 0;P0=LedBuff[0];i++;break;
case 1:
ADDR2 = 0;ADDR1 = 0;ADDR0 = 1;P0=LedBuff[1];i++;break;
case 2:
ADDR2 = 0;ADDR1 = 1;ADDR0 = 0;P0=LedBuff[2];i++;break;
case 3:
ADDR2 = 0;ADDR1 = 1;ADDR0 = 1;P0=LedBuff[3];i++;break;
case 4:
ADDR2 = 1;ADDR1 = 0;ADDR0 = 0;P0=LedBuff[4];i++;break;
case 5:
ADDR2 = 1;ADDR1 = 0;ADDR0 = 1;P0=LedBuff[5];i=0;break;
}
}
我们把这部分代码简化如下
void SEG_Scan()
{
static unsigned char i = 0;
P0 = 0xFF; //端口状态全部熄灭数码管里的LED达到刷新作用
P1 = (P1 & 0xF8) | i; //i等于0时,就是“ADDR2=0; ADDR1=0; ADDR0=0;”,i等于1时,就是“ADDR2=0; ADDR1=0; ADDR0=1;”,以此类推
P0 = LedBuff[i]; //6个缓冲区的值轮流赋给P0
i++;
if(i>=6)i=0; //让i在0~5之间循环变化
}
大家自己对照分析这两部分代码,作用都是一样的,后者却简化了大量的书写,而且执行的时间比前者少,所以代码执行效率高。
3.function.h的内容
看到“reg52.h”文件里发现有P3的8个IO端口的定义
sbit RD = P3^7;
sbit WR = P3^6;
sbit T1 = P3^5;
sbit T0 = P3^4;
sbit INT1 = P3^3;
sbit INT0 = P3^2;
sbit TXD = P3^1;
sbit RXD = P3^0;
那我们也可以懂得把之前的“sbit LED2 = P0^0;”等放在“function.h”中。
以及在“function.c”封装有的函数和初始化的数组都需要在“function.h”中声明一下。
比如在“function.c”中定义好了“LED_Init()”,在“function.h”就要“void LED_Init();”声明一下。
上一篇:51单片机-多文件编写
下一篇:51单片机-数码管显示函数
史海拾趣
|
我现在遇到一个奇怪的问题,如果我将电路中的某个信号赋值给一个输出管脚的话,那么整个电路的逻辑都不对了。(如果不输出的话,通过其它管脚观察时逻辑是正确的) 大家有没有碰到过这种情况?是怎么回事?请高手指点! 注:我是在quartus8.1中用 ...… 查看全部问答> |
|
CPU为32位ARM芯片 Nand flash芯片为三星K9F1G08X0M (X8),有效存储128M + 4M OOB 地址分配如下面所示: IO0 IO1 IO2 ...… 查看全部问答> |
|
公司用捷联的猫传输数据,终端用的33600md,公司总部用捷联的列架猫,终端的猫自动拨号,与列架猫建立连接后(v22bis协议,2400速率,异步),传输终端的数据。每次都是刚开始传输的时候比较正常,但逐渐数据就会延迟,延迟有时可达3分钟,但进入mo ...… 查看全部问答> |
|
收购:现需要收购 SmartARM2400 的包装盒若干个,以及装书的那个硬包装盒若干个,谢谢! 发现 SmartARM 2400 的包装盒装东西非常合适,想弄几个, SmartARM套件中的那个装书的硬纸盒也非常不错,用来整理书架是非常不错的选择,非常想多弄几个。 可以和我邮件联系, rampc@sian.com 不要太贵哦,我明天再把我想要的 ...… 查看全部问答> |
|
关于STM32 ADC用DMA采多通道时数据错位的问题,之前的错误现象是4.5A变成9A或0.5A,后来对ADC的参数配置加了定时配置后,有很大的改善,但客户现场又用了20多天后,又出现数据错误的现象,电流110A的变30多A? 急!急!急!… 查看全部问答> |
|
1、PC机串口连接TEST44X学习板的9芯串行接口 J5_232 // 2、对拨动开关P_232、P1、U_USART,只有拨动开关 U_USART 的P2脚和P5脚拨到ON 的位置; 按照上面的设置设置了,我从pc端给开发板发数据,没有回来的数据,没反应,其他几个历程也不行,请问 ...… 查看全部问答> |




