1.新建工程
- 这里建议直接复制第一篇文章所讲的工程模板,减少平时创建工程的时间。
2.各模块初始化
首先,在我们拿到题目的时候都会让我们先关闭蜂鸣器,继电器等无关外设。
我们可以看原理图,LED、数码管、以及驱动芯片2003所控制的外设均由P25、P26、P27三个I/O口连接标号为U24的74LS138控制,74LS138译码之后经过一个标号为U25的74HC02或非门控制,74HC02的输出连接四个74LS573的输入使能端。或非门的一端连接标号为J13的排针,我在这里使用的是IO模式,所以就是或非门的一端接GND,为低电平。而74LS573的输入使能端为高有效。每个外设的数据输入为P0口控制。
所以关闭外设就是打开每一个外设的片选74LS573,使其输入使能端为高电平,然后写入无效数据。
根据74HC02的真值表:
74HC138的真值表:
所以打开每个74LS573就是74HC138的相应输出端输出低电平。
再看每个外设,LED是单片机给出低电平时点亮,数码管是共阳的,所以也是给出低电平点亮。由于2003是反向输出,所以蜂鸣器和继电器是单片机给出高电平工作。
注意:置0用与&,置1用或|
3.代码
sys.h 头文件
#ifndef __SYS_H__
#define __SYS_H__
//头文件包含
#include <STC15F2K60S2.H>
#include <intrins.h>
//管脚声明
//变量类型声明
typedef unsigned int uint;
typedef unsigned int u16;
typedef unsigned char uchar;
typedef unsigned char u8;
//外部变量声明
//函数声明
void ALL_Init();
void Operate_Delay(unsigned int ms);
#endif
sys.c
#include "sys.h"
/**
*@brief 外设初始化
*@param[in] none
*@return none
**/
void ALL_Init()
{
P2 = (P2&0x1f)|0xa0; //打开Y5C
P0 = 0x00; //关闭蜂鸣器&继电器
P2 = (P2&0x1f)|0xe0; //打开Y7C
P0 = 0xff; //关闭数码管
P2 = (P2&0x1f)|0x80; //打开Y4C
P0 = 0xff; //关闭LED
P2 = P2&0x1f; //关闭所用使能
}
/**
*@brief 延时函数
*@param[in] 延时多少ms(0~65535)
*@return none
**/
void Operate_Delay(u16 ms)
{
u16 i;
for(ms;ms>0;ms--)
for(i=921;i>0;i--);
}
main.c
#include "sys.h"
void main()
{
ALL_Init();
}