基于51单片机的校园电子打铃器 proteus仿真原理图程序设计

文件仅供参考:
链接:https://pan.baidu.com/s/1yUigOtG7_7a2sxrYD_KB-Q
提取码:tviy

硬件设计

功能:
1、8位数码管显示当前时间。
2、使用DS1302获得时钟信号,能够进行时钟设置
3、能够设置10组打铃时间,并具有临时打铃功能,打铃的时长为5S钟
4、使用1602液晶屏幕显示。

仿真图:
在这里插入图片描述

程序设计

#include <all.h>

u8 LCD1602_Cursor_address=0;	//光标标记
//	uchar code degree[]={0x16,0x09,0x08,0x08,0x08,0x09,0x06,0x00};  //摄氏度 符号

 bit lcd_busy_test(void) 		//忙状态监测
{
  bit result;
  RS=0;           
  RW=1;
  EN=1;
  _nop_();
  _nop_();
  _nop_();
  _nop_();
  result = (bit)(DB&0x80);
  EN=0;
  return result;
}

void lcd_write_cmd (u8 cmd)	//写命令
{
  while (lcd_busy_test());
  RS=0;
  RW=0;
  EN=0;
  _nop_();
  _nop_();
  DB=cmd ;
  _nop_();
  _nop_();
  _nop_();
  _nop_();
  EN=1;
  _nop_();
  _nop_();
  _nop_();
  _nop_();
  EN=0;
}

void lcd_position (u8 pos)//显示起始位置
{
	if(pos<16)
		lcd_write_cmd (pos|0x80);
	else
		lcd_write_cmd (((pos)-16)|0xC0);
}

void lcd_write_data (u8 dat)//写数据
{
   while (lcd_busy_test());
  RS=1;
  RW=0;
  EN=0;
  _nop_();
  _nop_();
  DB=dat ;
  _nop_();
  _nop_();
  _nop_();
  _nop_();
  EN=1;
  _nop_();
  _nop_();
  _nop_();
  _nop_();
  EN=0;
}

//初始化
void lcd_start (void)
{
  lcd_write_cmd (0x01);
  delay_ms(1);
  lcd_write_cmd (0x02);
  delay_ms(1);
  lcd_write_cmd (0x06);
  delay_ms(1);
  lcd_write_cmd (0x0c);
  delay_ms(1);
  lcd_write_cmd (0x14);
  delay_ms(1);
  lcd_write_cmd (0x38);
  delay_ms(1);

}

void lcd_CLS()
{
	data u8 i;
	lcd_position(0x80);
	for(i=0;i<16;i++)
		lcd_write_data(' ');
	lcd_position(0xc0);
	for(i=0;i<16;i++)
		lcd_write_data(' ');
}

void LCD_1602_Cursor_address()				//光标状态
{
	switch(LCD1602_Cursor_address)
	{
		case 0:lcd_write_cmd(0x0c);break;//不显示
		//(先开启 0x0f,后地址,上0x8,下0xc)          
		case 1:lcd_write_cmd(0x0f);lcd_write_cmd(0xcb);break;//时间秒		
		case 2:lcd_write_cmd(0x0f);lcd_write_cmd(0xc8);break;//时间分
		case 3:lcd_write_cmd(0x0f);lcd_write_cmd(0xc5);break;//时间时
		case 4:lcd_write_cmd(0x0f);lcd_write_cmd(0x8c);break;//星期
		case 5:lcd_write_cmd(0x0f);lcd_write_cmd(0x8a);break;//时间日
		case 6:lcd_write_cmd(0x0f);lcd_write_cmd(0x87);break;//时间月
		case 7:lcd_write_cmd(0x0f);lcd_write_cmd(0x84);break;//时间年
	}
}


void lcd_printf_Ds1302()			//正常模式显示
{
	lcd_position(3);
	lcd_write_data(Time[6]/16%16+'0');//时间年显示
	lcd_write_data(Time[6]%16+'0');
	lcd_write_data('/');
	
	lcd_write_data(Time[5]/16%16+'0');//时间月显示
	lcd_write_data(Time[5]%16+'0');
	lcd_write_data('/');
	
	lcd_write_data(Time[4]/16%16+'0');//时间日显示
	lcd_write_data(Time[4]%16+'0');
	lcd_write_data('/');
	
	lcd_write_data(Time[3]%16+'0');//星期显示

	lcd_position(20);
	
	lcd_write_data(Time[2]/16%16+'0');//时间时显示
	lcd_write_data(Time[2]%16+'0');
	lcd_write_data('/');
	
	lcd_write_data(Time[1]/16%16+'0');//时间分显示
	lcd_write_data(Time[1]%16+'0');
	lcd_write_data('/');
	
	lcd_write_data(Time[0]/16%16+'0');//时间秒显示
	lcd_write_data(Time[0]%16+'0');
}

void lcd_printf_Ring()					//铃声调整数据显示
{
	lcd_position(20);
	
	lcd_write_data(Ring_Data[Ring][2]/16%16+'0');//时间时显示
	lcd_write_data(Ring_Data[Ring][2]%16+'0');
	lcd_write_data('/');
	
	lcd_write_data(Ring_Data[Ring][1]/16%16+'0');//时间分显示
	lcd_write_data(Ring_Data[Ring][1]%16+'0');
	lcd_write_data('/');
	
	lcd_write_data(Ring_Data[Ring][0]/16%16+'0');//时间秒显示
	lcd_write_data(Ring_Data[Ring][0]%16+'0');
}

void Alarm_Clock()				//铃声调整数据处理
{
	if(Key4x4A=='+')
	{
		Key4x4_tt=0;Key4x4A=0;
		
		Ring_Data[Ring][LCD1602_Cursor_address-1]++;
		
		if((Ring_Data[Ring][LCD1602_Cursor_address-1]&0x0f)>9) //十进制转BCD码
			(Ring_Data[Ring][LCD1602_Cursor_address-1])+=6;
		if(Ring_Data[Ring][0]>0x59)			//数据限制
			Ring_Data[Ring][0]=0x00;
		
		if(Ring_Data[Ring][1]>0x59)			//数据限制
			Ring_Data[Ring][1]=0x00;
		
		if(Ring_Data[Ring][2]>0x23)			//数据限制
			Ring_Data[Ring][2]=0x00;
		
		lcd_printf_Ring();					//铃声调整数据刷新
	}
	
	if(Key4x4A=='-')
	{
		Key4x4_tt=0;Key4x4A=0;
		
		if(Ring_Data[Ring][LCD1602_Cursor_address-1]>0)			//数据限制
			Ring_Data[Ring][LCD1602_Cursor_address-1]--;
		
		if((Ring_Data[Ring][LCD1602_Cursor_address-1]&0x0f)>9)	//十进制转BCD码
			(Ring_Data[Ring][LCD1602_Cursor_address-1])-=6;
		
		lcd_printf_Ring();					//铃声调整数据刷新
	}
}

void Time_Settings()						//时间调整数据处理
{
	if(Key4x4A=='+')
	{
		Key4x4_tt=0;Key4x4A=0;
		Time[LCD1602_Cursor_address-1]++;
		
		if((Time[LCD1602_Cursor_address-1]&0x0f)>9)	//十进制转BCD码
			(Time[LCD1602_Cursor_address-1])+=6;
		if(Time[0]>0x59)		//数据限制
			Time[0]=0x00;
		
		if(Time[1]>0x59)		//数据限制
			Time[1]=0x00;
		
		if(Time[2]>0x23)		//数据限制
			Time[2]=0x00;
		
		if(Time[3]>0x07)		//数据限制
			Time[3]=0x07;
		
		if(Time[4]>0x31)		//数据限制
			Time[4]=0x00;
		
		if(Time[5]>0x12)		//数据限制
			Time[5]=0x00;
		
		if(Time[6]>0x99)		//数据限制
			Time[6]=0x00;
		
		lcd_printf_Ds1302();	//时间调整数据刷新
	}
	

.

.

  • 1
    点赞
  • 46
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
课程设计-基于C51单片机的自动打铃系统 : 摘 要 本次设计中的LED数码管电子时钟电路采用24小时制记时方式,本次设计采用AT89C51单片机的扩展芯片和6个PNP三极管做驱动,由三块LED数码管构成的显示系统,与传统的基于8/16位普通单片机的LED显示系统相比较,本系统在不显著地增加系统成本的情况下,可支持更多的LED数码管稳定显示。设计采用AT98C51单片机,使用5V电源供电,并且在按键的作用下可以进行调时,调分,复位功能。计时数据的更新在计算机C语言的驱动下每秒自动进行一次,但不需程序干预其输出状态。 关键词:AT89C51; 数码管 ; LED 第一章 设计简介及方案论述 1.1作息时间控制钟系统概述: 本设计是一个具有报时功能的作息时间控制钟。它利用89C51单片机的2Hz时基计时,进行年历计算,并用的蜂鸣驱动模块将它报出来;在进行时间计算,分每加一时,都与规定的作息时间比较,如果相等则进行相应的控制或动作。由七段显示驱动模块、蜂鸣驱动模块和按钮控制模块三部分组成,四个按键用于报时及校正时间。现代机关企业,特别是学校要求对时间加以控制,要按时打铃及播放广播,以保证学习与工作的正常运行。本设计实现了这些功能,给学校及其他机关企业带来方便,整体性好,人性化强、可靠性高,实现了对时间控制的智能化。 1.2本设计任务和主要内容: (1)设计任务 用可编程件为主体,设计并制作一台自动打铃系统。要求完成的作品必须固化软件,测试检查时上电即可工作,不允再用计算机下载。实现能够显示当前的时间,同时能够在规定的时间点控制打铃装置打出预期的铃声。另外增设四个按钮,通过分配以实现对时间的调整,包括对时钟、分钟的增加和减少,秒钟的清零;以及强制打铃和关闭打铃。 (2)主要内容 1、基本计时和显示功能(用12小时制显示)。包括上下午标志,时、分的数字显示,秒信号指示。 2、能设置当前时间(含上、下午,时,分) 3、能实现基本打铃功能,规定: 上午6:00起床铃:打铃5秒、停2秒、再打铃5秒。 下午10:30熄灯铃:打铃5秒、停2秒、再打铃5秒。 铃声可用小喇叭播放,凡是用到铃声功能的均按此处理。 第二章 系统主要硬件电路设计 2.1单片机总体设计思路 (1)设计能正常工作的一个单片机最小硬件系统,外围电路包括设置键盘,LCD或LED的显示屏; (2)进行软件设计,利用单片机系统时钟先设计一个高精度的内部时钟系统,最小精确时间为期1秒; (3)在秒计数的基础上设计一个24小时时钟,并设计若干定时功能; (4)设计打铃执行机构,完成自动打铃功能。 2.2各功能模块程序实现原理分析
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值