新闻中心

EEPW首页 > 嵌入式系统 > 设计应用 > 51单片机工程实践--第3章 74HC595+ULN200

51单片机工程实践--第3章 74HC595+ULN200

作者: 时间:2016-11-25 来源:网络 收藏
首先上图,有图才有真相。实验中的图片。

1、刚上电,继电器不动作,很稳定。这是工程上需要的结果。

本文引用地址:https://www.eepw.com.cn/article/201611/321350.htm

2、按下KEY1,继电器1吸合,其它继电器断开。

3、按下KEY2,继电器2吸合,其它继电器断开。


#include
#include


sbit KEY_IN1 = P2 ^ 4; // 输入按键 接10K上拉电阻
sbit KEY_IN2 = P2 ^ 5;
sbit KEY_OUT1 = P2 ^ 3; // 输出按键
sbit KEY_OUT2 = P2 ^ 2;

sbit BUZZER_OUT = P1 ^ 7; // 蜂鸣器
sbit LED = P0 ^ 7; // LED


sbit HC595_SCK_OUT = P1 ^ 0;// 74HC595数据输入时钟线
sbit HC595_RCK_OUT = P1 ^ 1;// 74HC595输出存储器锁存时钟线
sbit HC595_OE_OUT = P1 ^ 2;// 74HC595输出使能端 接10K上拉电阻
sbit HC595_SI_OUT = P1 ^ 3;// 74HC595数据线


typedef unsigned char uint8;
typedef unsigned int uint16;

typedef unsigned char u8;
typedef unsigned int u16;

#define CNT_DELAY_CNT1 25 // 按键去抖动延时阀值
#define CNT_DELAY_CNT2 5 // 按键列输出信号稳定的小延时

#define CNT_BUZZER_TIME 40



void interrupt_init(void);
void key_scan(void);
void key_service(void);
void relay_status_clear(void);
void relay_status_set_1(void);
void relay_status_set_2(void);
void relay_status_set_3(void);
void relay_status_set_4(void);
void relay_drive(void);
void delay(void);


u8 key_step = 1; // 按键扫描步骤变量,在switch()括号里面
u8 key_lock1 = 0; // 按键自锁标志
u8 key_sec = 0; // 按键被触发的变量
u16 delay_cnt1 = 0; // 延时计数器的变量
u16 delay_cnt2 = 0; // 延时计数器的变量
u16 buzzer_time_cnt = 0; // 蜂鸣器声音长短的计数延时
u16 relay_status = 0;// 继电器状态寄存器

int main(void)
{
interrupt_init();


HC595_OE_OUT = 1;// 置1,595输出口为高阻态,ULN2003输入口内部有下拉电阻,所以把595输出口拉低了
relay_status_clear();// 把relay_status清零
relay_drive();// 继电器驱动程序,relay_status映射继电器的状态
HC595_OE_OUT = 0;// 输出使能端拉低,595输出口有效

BUZZER_OUT = 1;// 上电关闭蜂鸣器

while(1)
{
key_service();// 按键服务函数
}


return 0;
}


上一页 1 2 下一页

评论


技术专区

关闭