基于51单片机的红外计数器proteus仿真 LCD1602显示原理图程序设计

链接:https://pan.baidu.com/s/1khRUjXXJMTa8vNOVQoiOcQ
提取码:ach0

硬件设计

设计要求
本设计主要任务是以单片机为主控芯片来进行软件控制,能正常进行数据计数。基于单片机构成的产品自动计数器研究的主要内容包括:如果构成检测电路、MCS-51 单片机用何种方式对外部计数脉冲进行计数显示控制、LCD 显示驱动模块的选择、MCS-51 单片机的扩展。在这个设计中主要需要解决的问题便是如何提高MCS-51单片机的抗干扰能力以及稳定性。
主要技术指标:
(1)显示并能计数;
(2)具有报警功能;
(3)具有较强的抗干扰性。

方案
在这里插入图片描述

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

程序设计

在这里插入图片描述

#include <reg52.h>	         //调用单片机头文件
#define uchar unsigned char  //无符号字符型 宏定义	变量范围0~255
#define uint  unsigned int	 //无符号整型 宏定义	变量范围0~65535
#include <intrins.h>


bit flag_500ms;
sbit beep = P1^4; //蜂鸣器IO口定义 

sbit hw_jin = P2^0;   //红外传感器IO口定义 
sbit hw_chu = P2^1;   //红外传感器IO口定义 
uchar a_a;
uchar menu_1;	   	//设置参数用

uint num;  //计的数
uint jin,chu;
uchar set_num = 80; // 设置倒计时数的启始值 


/***********************1ms延时函数*****************************/
void delay_1ms(uint q)
{
	uint i,j;
	for(i=0;i<q;i++)
		for(j=0;j<120;j++);
}

/*************定时器0初始化程序***************/
void time_init()	  
{
	EA   = 1;	 	  //开总中断
	TMOD = 0X01;	  //定时器0、工作方式1
	ET0  = 1;		  //开定时器0中断 
	TR0  = 1;		  //允许定时器0定时
}

sbit rs=P1^0;	 //寄存器选择信号 H:数据寄存器  	L:指令寄存器
sbit rw=P1^1;	 //寄存器选择信号 H:数据寄存器  	L:指令寄存器
sbit e =P1^2;	 //片选信号   下降沿触发

/********************************************************************
* 名称 : delay_uint()
* 功能 : 小延时。
* 输入 : 无
* 输出 : 无
***********************************************************************/
void delay_uint(uint q)
{
	while(q--);
}

/********************************************************************
* 名称 : write_com(uchar com)
* 功能 : 1602命令函数
* 输入 : 输入的命令值
* 输出 : 无
***********************************************************************/
void write_com(uchar com)
{
	e=0;
	rs=0;
	rw=0;
	P0=com;
	delay_uint(25);
	e=1;
	delay_uint(100);
	e=0;
}

/********************************************************************
* 名称 : write_data(uchar dat)
* 功能 : 1602写数据函数
* 输入 : 需要写入1602的数据
* 输出 : 无
***********************************************************************/
void write_data(uchar dat)
{
	e=0;
	rs=1;
	rw=0;
	P0=dat;
	delay_uint(25);
	e=1;
	delay_uint(100);
	e=0;	
}


/***********************lcd1602上显示两位十进制数************************/
void write_sfm4(uchar hang,uchar add,uint date)
{
	if(hang==1)   
		write_com(0x80+add);
	else
		write_com(0x80+0x40+add);
	write_data(0x30+date/1000%10);
	write_data(0x30+date/100%10);
	write_data(0x30+date/10%10);
	write_data(0x30+date%10);	
}

/***********************lcd1602上显示这字符函数************************/
void write_string(uchar hang,uchar add,uchar *p)
{
	if(hang==1)   
		write_com(0x80+add);
	else
		write_com(0x80+0x40+add);
		while(1)														 
		{
			if(*p == '\0')  break;
			write_data(*p);
			p++;
		}	
}

/***********************lcd1602初始化设置************************/
void init_1602()	//lcd1602初始化
{
	write_com(0x38);	
	write_com(0x0c);
	write_com(0x06);
	delay_uint(1000);
	write_string(1,0,"     Z:0000       ");	
	write_string(2,0," J:0000  C:0000   ");	
	write_sfm4(2,1,jin);  //显示人数
	write_sfm4(1,6,num);  //显示人数
	write_sfm4(2,11,chu);  //显示人数
}


/********************独立按键程序*****************/
uchar key_can;	 //按键值

void key()	     //独立按键程序
{
	static uchar key_new;
	key_can = 20;               //按键值还原
	P3 |= 0xf0;
	if((P3 & 0xf0) != 0xf0)		//按键按下
	{
		delay_1ms(1);	     	//按键消抖动
		if(((P3 & 0xf0) != 0xf0) && (key_new == 1))
		{						//确认是按键按下
			key_new = 0;
			switch(P3 & 0xf0)
			{
				case 0xd0: key_can = 1; break;	   //得到k1键值
				case 0xb0: key_can = 2; break;	   //得到K2键值
				case 0x70: key_can = 3; break;	   //得到k3键值
			}
		}			
	}
	else 
		key_new = 1;	
}

.

文件仅供参考:

.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值