收藏 分享(赏)

基于51单片机的红外计数器 (2).doc

上传人:yoyooong 文档编号:5696208 上传时间:2022-06-13 格式:DOC 页数:20 大小:2.75MB
下载 相关 举报
基于51单片机的红外计数器 (2).doc_第1页
第1页 / 共20页
基于51单片机的红外计数器 (2).doc_第2页
第2页 / 共20页
基于51单片机的红外计数器 (2).doc_第3页
第3页 / 共20页
基于51单片机的红外计数器 (2).doc_第4页
第4页 / 共20页
基于51单片机的红外计数器 (2).doc_第5页
第5页 / 共20页
亲,该文档总共20页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

1、目录一、需求分析-4二、系统总体设计-4三、系统详细设计-5四、系统实现与测试-16五、总结-19六、参考文献-20题目:基于51单片机的红外计数器一、需求分析当今社会飞速发展的格局下,厂家基本采用流水线技术进行产品生产作业,而怎样对其线上的产品进行实时的、有效率的、精确的自动计数成为广大生产厂家十分关注的问题。传统的机械式或电子式计数器(主要是用数字电路集成组件组成)电路比较复杂,元器件数量较多,故障率较高,维修比较困难,而且设置预定数值不太方便,功能不易更改且功能过于单一,适用范围较窄。而基于单片机为核心控制的计数器有着能够实时,精确,可靠,稳定等计数优点已成为广大厂家的首选自动计数的装置

2、。二、系统总体设计红外计数STC89C52数码管显示蜂鸣器图1 总体设计逻辑图原理:电路的指导思想是红外发射管发射红外线,红外接收管接收红外线,并且接收管当有红外线照射的时候,电阻比较小,当无线外线照射的时候电阻比较大,这样就可以通过一个电压比较器和一个基准电压进行对比,当有光照的时候,红外接收管电阻比较小,那么和其串联的电压分压就会增大,所以电压比较器将会输出一高电平;当无光照射的时候,红外接收管的电阻比较大,这样电压比较器就会输出一个低电平。这个便是外部计数电平信号,这个电平信号送入AT89C51单片机进行计数控制,在经过扩展、显示驱动完成最后的显示过程。三、系统详细设计图2 原理图复位是

3、否按下报警数码管显示计数N设定E=X初始化主程序判断N是否=E图3 程序流程图程序:#include /调用单片机头文件#define uchar unsigned char /无符号字符型 宏定义变量范围0255#define uint unsigned int /无符号整型 宏定义变量范围065535#include /数码管段选定义 0 1 2 3 4 56 7 8 9uchar code smg_du=0x28,0xee,0x35,0xa2,0xe4,0xa5,0x21,0x4a,0x20,0xa1, 0x60,0x25,0x39,0x26,0x31,0x71,0xff; /断码/数码

4、管位选定义sbit smg_we1 = P34; /数码管位选定义sbit smg_we2 = P35;sbit smg_we3 = P36;sbit smg_we4 = P37;uchar dis_smg8 = 0;bit flag_500ms;sbit beep = P23; /蜂鸣器IO口定义 sbit hw = P24; /红外传感器IO口定义 uchar a_a;uchar menu_1; /设置参数用uint num; /计的数uchar miao,weimiao; / 倒计时数uchar num_value; / 用做中间的变量bit flag_num_en ; / 倒计时器开始

5、计时使能标志位uchar set_num = 80; / 设置倒计时数的启始值 #define RdCommand 0x01 /定义ISP的操作命令#define PrgCommand 0x02#define EraseCommand 0x03 #define Error 0#define Ok 1#define WaitTime 0x07 /定义CPU的等待时间sfr ISP_DATA=0xe6; /寄存器申明sfr ISP_ADDRH=0xe5;sfr ISP_ADDRL=0xe4;sfr ISP_CMD=0xe3;sfr ISP_TRIG=0xe2;sfr ISP_CONTR=0xe1;

6、/*1ms延时函数*/void delay_1ms(uint q)uint i,j;for(i=0;iq;i+)for(j=0;j 8);/* 地址赋值 */ ISP_ADDRL = (unsigned char)(byte_addr & 0x00ff); ISP_CMD = ISP_CMD | RdCommand; /* 写入读命令 */ ISPgoon(); /* 触发执行 */ ISP_IAP_disable(); /* 关闭ISP,IAP功能 */ EA = 1; return (ISP_DATA); /* 返回读到的数据 */* = 扇区擦除 = */void SectorErase

7、(unsigned int sector_addr) unsigned int iSectorAddr; ISP_CMD = ISP_CMD | EraseCommand; /* 擦除命令3 */ iSectorAddr = (sector_addr & 0xfe00); /* 取扇区地址 */ ISP_ADDRH = (unsigned char)(iSectorAddr 8); ISP_ADDRL = 0x00; ISPgoon(); /* 触发执行 */ ISP_IAP_disable(); /* 关闭ISP,IAP功能 */* = 字节写 = */void byte_write(uns

8、igned int byte_addr, unsigned char original_data) EA = 0; SectorErase(byte_addr); ISP_ADDRH = (unsigned char)(byte_addr 8); /* 取地址 */ ISP_CMD = ISP_CMD & 0xf8; /* 清低3位 */ ISP_DATA = original_data; /* 写入数据准备 */ ISP_CMD = ISP_CMD | PrgCommand; /* 写命令2 */ ISPgoon(); /* 触发执行 */ ISP_IAP_disable(); /* 关闭I

9、AP功能 */ EA =1;/*把数据保存到单片机内部eeprom中*/void write_eeprom()SectorErase(0x2000);byte_write(0x2000, set_num % 256);byte_write(0x2001, set_num / 256);byte_write(0x2002, num % 256);byte_write(0x2003, num / 256);byte_write(0x2059, a_a);/*把数据从单片机内部eeprom中读出来*/void read_eeprom()set_num = byte_read(0x2001);set_

10、num = 8;set_num |= byte_read(0x2000);num = byte_read(0x2003);num = 8;num |= byte_read(0x2002);a_a = byte_read(0x2059);/*开机自检eeprom初始化*/void init_eeprom()read_eeprom();/先读/*数码位选函数*/void smg_we_switch(uchar i)switch(i)case 0: smg_we1 = 0; smg_we2 = 1; smg_we3 = 1; smg_we4 = 1; break;case 1: smg_we1 =

11、1; smg_we2 = 0; smg_we3 = 1; smg_we4 = 1; break;case 2: smg_we1 = 1; smg_we2 = 1; smg_we3 = 0; smg_we4 = 1; break;case 3: smg_we1 = 1; smg_we2 = 1; smg_we3 = 1; smg_we4 = 0; break;/*定时器0初始化程序*/void time_init() EA = 1; /开总中断TMOD = 0X01; /定时器0、工作方式1ET0 = 1; /开定时器0中断 TR0 = 1; /允许定时器0定时/*数码显示函数*/void di

12、splay()uchar i;for(i=0;i= 2)menu_1 = 0;dis_smg0 = smg_dunum % 10;dis_smg1 = smg_dunum / 10 % 10;dis_smg2 = smg_dunum / 100 % 10;dis_smg3 = smg_dunum / 1000 % 10;if(menu_1 = 0) /倒计时器按键操作开始 暂停 if(key_can = 2) /清零num = 0;dis_smg0 = smg_dunum % 10;dis_smg1 = smg_dunum / 10 % 10;dis_smg2 = smg_dunum / 10

13、0 % 10;dis_smg3 = smg_dunum / 1000 % 10;if(menu_1 = 1)/设置倒计时器开始数if(key_can = 2)set_num + ;/ 设置数加if(set_num 9999)set_num = 9999;/最大加到99if(key_can = 3)set_num - ;/ 设置数减if(set_num = 9999)num = 9999;dis_smg0 = smg_dunum % 10;dis_smg1 = smg_dunum / 10 % 10;dis_smg2 = smg_dunum / 100 % 10;dis_smg3 = smg_d

14、unum / 1000 % 10;write_eeprom(); /保存数据else value = 1;/*主程序*/ void main()beep = 0; /开机蜂鸣器叫一声delay_1ms(100);P0 = P1 = P2 = P3 = 0xff; /初始化IO口time_init();init_eeprom(); /把设置的参数从eeprom内读出来dis_smg0 = smg_dunum % 10;dis_smg1 = smg_dunum / 10 % 10;dis_smg2 = smg_dunum / 100 % 10;dis_smg3 = smg_dunum / 1000

15、 % 10;while(1)key(); /按键扫描函数if(key_can = set_num)beep = beep; /报警else beep = 1;display(); /数码管显示函数/*定时器0中断服务程序*/void time0_int() interrupt 1static uint value;TH0 = 0xd8;TL0 = 0xf0; / 10msvalue +;if(value = 50)value = 0;flag_500ms = flag_500ms;四、系统实现与测试图4 仿真图1图5 仿真图2图6 实物图1(通电)图7 实物图2(计数到11)1、设值为10(当

16、红外管检测人数到达10时,蜂鸣器会报警,并且LED会闪烁)2、实物与仿真无较大差别3、但是实物由于元件的问题,按键-和按键复位已经坏了,因此这里将复位键调到按键+,按键-失灵五、总结作品的完成程度:可以实现进多少人的计数,通过数码管显示;可以通过按键设置人数上限,当人数到达设置上限时,LED灯亮、蜂鸣器闪烁。不足和展望:1、由于时间紧迫,加上自己的疏忽,原理图转为PCB时,DC底座没有看好封装,导致DC底座只能外接,给红外管的VCC只能改为用跳线。2、买元器件时,淘宝商家发错元件,因此数码管的型号不对,因此数码管也只能用杜邦线外接,导致数码管接触有点不稳定。3、因为板子反复修改,部分元件损坏,导致设置按键减失灵。4、没有实现对人数进出的同时检测,只能实现单边。六、参考文献1 王松德,梁会琴,王丹红外线计数器的设计与制作J.农机化研究,2005,5 期.2 谢洪用单片机控制红外编码探测障碍物J.单片机与嵌入式系统应用,2007,8 期.3 戴培山,冯成德,刘栋基于keil+c51 的红外遥控器解码设计J.自动化与仪器仪表,2003,6 期.4 梅海峰红外线光电计数器的设计及制作J.大氮肥,2005,28(5).5 铁牛简易红外线人数统计器J.实用影音技术,2005,9 期.6 杨汉祥,张琦红外计数器的设计J.科技广场,2009 ,7 期.

展开阅读全文
相关资源
相关搜索
资源标签

当前位置:首页 > 教育专区 > 高等教育

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:文库网官方知乎号:文库网

经营许可证编号: 粤ICP备2021046453号世界地图

文库网官网©版权所有2025营业执照举报