900字范文,内容丰富有趣,生活中的好帮手!
900字范文 > 基于51单片机的红外计数器proteus仿真 LCD1602显示原理图程序设计

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

时间:2019-06-19 15:26:52

相关推荐

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

硬件设计

(末尾附文件)

设计要求

本设计主要任务是以单片机为主控芯片来进行软件控制,能正常进行数据计数。基于单片机构成的产品自动计数器研究的主要内容包括:如果构成检测电路、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、工作方式1ET0 = 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);elsewrite_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);elsewrite_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;}

.

文件仅供参考:

链接:/s/1khRUjXXJMTa8vNOVQoiOcQ

提取码:ach0

.

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。