光电计数器源程序
光电计数器的设计

总结与展望光电计数器的设计摘要本系统采用的是以单片机STC89c52为核心的自动计数器。
采用反射式光电传感器,将红外发光管与光电接收管相邻安放,每当物体通过一次,红外光就被物体反射,光电接收管接收一次,光电接收管的输出电压就发生一次变化,这个变化的电压信号通过放大和处理后,形成计数脉冲,通过光电隔离耦合并行输入至STC89c52单片机的P1口,通过软件控制和键盘设定计数值并用LED加以显示,便可实现对物体的计数统计。
本计数器可将机械或人工计数方式变为电子计数,并且采用LED数码管显示,可适用于诸多行业,以满足现代生产、生活方式的需求。
所谓的光电式传感器是将光信号转化为电信号的一种传感器。
它的理论基础是光电效应。
这类效应大致可分为三类。
第一类是外光电效应,即在光照射下,能使电子逸出物体表面。
利用这种效应所做成的器件有真空光电管、光电倍增管等。
第二类是内光电效应,即在光线照射下,能使物质的电阻率改变。
这类器件包括各类半导体光敏电阻。
第三类是光生伏特效应,即在光线作用下,物体内产生电动势的现象,此电动势称为光生电动势。
这类器件包括光电池、光电晶体管等。
光电效应都是利用光电元件受光照后,电特性发生变化。
敏感的光波长是在可见光附近,包括红外波长和紫外波长。
市场上的光电计数器采用的光电传感器有摄像头、光电管等,采用的光的种类有普通光和激光,可见光和不可见光等。
光电传感器一般由光源、光学通路和光电元件三部分组成。
光电式传感器是以光电器件作为转换元件的传感器,光电检测方法具有精度高、应用快、非接触等优点,而可测参数多,光电传感器的结构简单,形式灵活多变因此,光电式传感器在检测和控制中应用非常广泛。
【关键词】计数器光电传感器单片机数码管调研报告1.1当今生活是信息时代,是获取信息和处理信息,以及信息应用的时代.传感信息与检测技术的重要性在于它是获得信息并对信息进行一定处理的基础技术,是获取信息和信息加工处理的重要手段之一。
光电感应计数器原理图

光电感应计数器原理图
不包含标题的光电感应计数器原理图如下:
[image]
光电感应计数器是一种电子设备,用于通过光电传感器检测光线的存在或者光的强度变化,并将其转换为数字信号进行计数。
它通常包括一个光源和一个光电传感器。
光源通常是一种发光二极管(LED),它发出一束光线以照明待检测区域。
光线经过待检测区域后,被光电传感器接收。
光电传感器是一种能够将光线转换为电信号的器件。
它通常由一个光敏元件和一个电路组成。
光敏元件可以是光敏电阻、光敏二极管或者光敏三极管等。
当光线照射到光敏元件上时,它的电阻、电流或者电压会发生变化。
光电传感器的电路会将光敏元件输出的电信号进行放大和处理,然后将其转换为数字信号。
这些数字信号会传送到计数器电路,进行计数并显示。
光电感应计数器常用于对通过某个区域的物体或人员进行计数。
当物体或人员经过待检测区域时,遮挡光线,光电传感器感知到信号的变化,计数器根据信号的变化进行计数。
光电感应计数器具有快速、精确、可靠等特点,广泛应用于超市、图书馆、展览场所等需要进行人流或物品计数的场合。
光电计数器c语言程序

光电计数器c语言程序
下面是一个使用C语言编写的光电计数器程序的示例:
```c
#include <stdio.h>
int main() {
int count = 0;
int prevState = 0;
int currentState = 0;
while (1) {
// 从光电传感器获取当前状态
// 假设 1 代表有物体通过,0 代表没有物体通过
currentState = readSensorState();
// 当前状态与上一个状态不相同时,说明有物体通过
if (currentState != prevState) {
count++;
printf("当前数量: %d\n", count);
}
prevState = currentState;
}
return 0;
}
```
注意:上述代码是一个简化的示例,你需要根据实际硬件使用情况进行相应修改。
例如,`readSensorState()` 函数需要根据具体的光电传感器连接方式和读取方法进行实现。
此外,你可能还需要添加适当的延时函数,以避免过快的计数。
光电计数器的工作原理

光电计数器的工作原理光电计数器是一种常见的电子计数器,它是一种使用光学器件来实现计数功能的计数器。
它的工作原理基于光电效应,通过光电转换将物体通过光线的照射变成电子信号来进行计数。
光电计数器主要包括探测器和计数器两个部分。
探测器一般由光电开关、发光二极管、光电二极管等电子元件组成。
当物体穿过光电计数器时,物体挡住光线,光线被遮挡后,照射到光电开关或光电二极管上的光电元件因而无法继续发射或接收光线,会产生相应的电信号。
这些电信号经过调理和放大处理后,然后发送到计数器中进行计数。
计数器是光电计数器中的核心部件,它完成了对每个物体的计数动作。
计数器使用数字技术来实现物体计数,通过将输入的电信号转化为数字模数,在计数器中对其进行编码、存储和运算等处理,以获得准确的物体计数结果。
计数器还可以设置相应的警报、返回、自动复位等功能,使得光电计数器具有高效性和便捷性。
光电计数器的工作原理主要分为两个阶段:探测信号的产生和计数处理。
① 探测信号的产生在探测信号产生的第一步中,发光二极管将发射准直方向的光线,光线照射到光电二极管上,光电二极管产生电信号。
在探测信号产生的第二步中,光电开关直接将关于受遮挡现象的信号发送到计数器。
其中,发光二极管和光电二极管的发出和接收光线的方向可以任意设置,使得光电计数器能够适应不同的应用场景。
② 计数处理通过探测信号的产生,计数器会将信号进行编码和存储,最终实现对物体的计数。
在实际使用中,光电计数器计数量的增加通常是以值的形式显示出来。
在计数处理阶段,计数器接受来自探测器的数字信号,将其转换为数字模拟信号,信号经过调理进行放大处理后,被转换为数字信号。
然后将转换的数字信号经过诸如二进制、八进制等算法进行编码,以便数字之间的运算以及数字之间的比较。
数字计数器还可通过特殊的电子线路或运算逻辑实现特殊功能,例如设置报警功能、回退功能、自动累加等功能。
在这些功能完成后,数字计数器可以重置,以使得计数器能够进行新的计数。
光电计数器的原理与制作

制作天地HANDS ON PROJECTS光电计数器的应用非常广泛,例如绕线机线圈匝数的检测、点钞机纸币张数的检测、复印机纸张数量的检测等。
它和机械计数器相比具有可靠性高、体积小、计数频率高、能和计算机连接实现自动控制等优点。
本文介绍一种光电计数器的原理与制作方法,供大家参考。
一、电路组成光电计数器电路如图1所示,由T1槽型光耦、IC1单稳态触发器、IC2~IC4计数译码显示电路所组成。
计数范围是0~999。
显示器采用共阴极LED数码管。
该电路具有上电自动清零功能,也可通过“复位”按钮实现手动清零。
二、检测电路槽型光耦ITR9608、R1、R2组成光电检测电路,负责把被检测物的数量转换成电压脉冲信号。
槽型光耦是由红外发光管和光敏三极管构成的,工作时红外发光管发出红外光线透过光耦的槽投射到光敏三极管上,光敏三极管导通,集电极输出低电平;当红外光线被检测物遮断时,光敏三极管截止,集电极输出高电平。
遮挡一次槽型光耦输出一个脉冲,因此脉冲的个数就是被检测物的数量。
槽型光耦中红外发光管的正向电流为50mA,在环境温度为25℃时它的最大耗散功率100mW,正向压降为1.5V。
当环境温度上升时,允许的正向工作电流还要减小。
为了留有一定的裕量,取它的工作电流为20mA。
则R1=5V-1.5V20mA=175Ω取R1=200Ω,其中5V是电源电压,1.5V是红外发光管的正向压降。
根据槽型光耦ITR9608的技术手册可知,使红外发光管的正向电流为20mA,当有遮挡时,光敏三极管ICE O=100nA;无遮挡时,光敏三极管的I C≈0.7mA。
为了使光敏三极管能工作在开关状态,则R2=5V-0.4V=6.5kΩ取R2=10kΩ,其中5V是电源电压,0.4V是光敏三极管的饱和压降。
R3、C2、C3和IC1组成单稳态触发器。
其作用是对槽型光耦传来的脉冲信号进行整形,去掉杂波信号,提高抗干扰能力。
IC1的型号是NE555,电路中将输入端TH和放电端DIS同时接在定时电容上,触发端TR平时为高电平。
电子信息工程专业毕业论文--基于单片机的光电计数器的设计

基于单片机的光电计数器的设计摘要:近年来,随着工业发展和科学技术的创新,光电计数器技术越来越多的被应用到工业生产和生活中。
光电计数器采用光敏元件作为传感器,利用不同光强产生不同电平信号流进一步实现计数的原理,使得光电计数器现在广泛应用于工业生产线的计数。
本论文主要介绍了基于单片机AT89S51的软硬件设计过程,以及实现光电计数的工作原理和理论基础,实现了光电计数器基本的工作要求和性能指标,采用LCD显示技术显示计数结果。
本次光电计数器设计使用PCB板和LCD模块显示,因此电路结构简单清晰、焊接过程简单、电路稳定性好、操作难度小。
关键词:传感器;光电计数器;AT89S51Design based on single chip microcomputer photoelectric counterAbstract: in recent years, along with industrial development and the innovation of science and technology, photoelectric counter technology more and more applied to industrial production and life. Photoelectric counter using photosensitive element as the sensor, the use of different light intensity have different level signal flow to further realize the counting principle, makes the photoelectric counter now counts are widely used in industrial production line. This thesis mainly introduces the hardware and software design process, based on single chip microcomputer AT89S51 and photoelectric counting principle and theoretical basis of implementing the basic job requirements and performance indicators, photoelectric counter use LCD display technology to display the count result. The photoelectric counter design using the PCB and the LCD display module, so the circuit structure is simple and clear, the welding process simple, circuit stability is good, operation difficulty is small.Key words: sensor;Photoelectric counter; AT89S51目录1引言 (1)2任务要求 (2)3方案论证 (2)3.1两种方案的选择 (2)3.2方案的选择 (2)4 系统组成概述 (3)5 硬件系统各部分介绍 (3)5.1光电传感器 (3)5.2 AT89S51单片机 (4)5.2.1 AT89S51系列单片机的主要性能特点 (4)5.2.3 51系列单片机的基本组成 (5)5.2.4外接晶体引脚 (6)5.2.5 控制信号或与其它电源复用引脚 (6)5.3显示器件 (7)6 硬件电路设计 (8)6.1 最小系统 (8)6.1.1 电源电路 (8)6.1.2 复位电路 (8)6.1.3 晶振电路 (9)6.2 单片机控制电路 (10)6.3 显示电路 (10)7 系统软件设计 (11)8 结论 (13)参考文献 (13)致谢............................................................................................................................ 错误!未定义书签。
电子线路设计课程实验报告--光电计数器

电子技术课程设计实 验 报 告光电计数器指导教师: 李维敏李维敏学生姓名学生姓名 班级班级 学号学号 张树良张树良 通信0902 周冠龙周冠龙 通信0902 王昭越王昭越 通信0906 日期:2011年12月20日星期二评语:指导教师签字:日期:组员照片组员照片 作品照片作品照片作品照片作品照片 作品照片作品照片目录一、设计任务书………………………………………………………………..3 二、设计框图及电路系统概述………………………………………………..3 三、各单元电路的设计方案及原理说明……………………………………..4 四、调试过程及结果分析……………………………………………………..11 五、设计、安装及调试中的体会……………………………………………..11 六、参考文献…………………………………………………………………..13 光电计数器一、 设计任务书 1实验目的掌握非电量测量系统的工作原理,学习传感器知识。
掌握掌握非电量测量系统的工作原理,学习传感器知识。
掌握 555 555 555 时基电路构成单稳态触发时基电路构成单稳态触发器、多谐振荡器的设计方法。
掌握数字电路计数、译码、显示系统的工作原理及设计方法。
器、多谐振荡器的设计方法。
掌握数字电路计数、译码、显示系统的工作原理及设计方法。
2设计要求2.1基本部分1、发光器件和光接收器件之间的距离大于1m 1m;;2、有抗干扰技术,防止背景光或瓶子抖动产生误计数;、有抗干扰技术,防止背景光或瓶子抖动产生误计数;3、最大计数值为9999;;4、每计数满1010,用灯闪烁,用灯闪烁2s 指示一下;指示一下;5、 数码管显示计数值;数码管显示计数值;6、工作电源为220V 交流电。
交流电。
2.2发挥部分1、可上电自动复位和外部手动人工复位;、可上电自动复位和外部手动人工复位;2、高位为零时,采用灭零处理;、高位为零时,采用灭零处理;3、发光器件和光接收器件之间的距离大于2m 2m;;4、每当计数值满10时,灯闪烁的同时喇叭发出提示音(音频为500-1000Hz 之间);5、设计一个倒计数器。
红外光电计数器实验报告

信息与电气工程学院课程设计说明书(2015 /2016 学年第1 学期)课程名称:小型数据设计题目:红外线计数器专业班级:计算机1401学生姓名:何亚茹赵君王中昆学号:140210122 140210107 140210121指导教师:生龙设计周数:二周设计成绩:2016年01月08日目录1 程序设计 (1)2 课程设的主要内容 (1)2.1设计的要求.............. . (1)2.2创新方案及原理分析 (1)2.3方案论证与选择 (2)2.4软件的设计 (3)3主要芯片设计 (4)3.1介绍 (4)3.2 51 单片机的特点 (5)3.3数码管 (7)4系统设计 (8)4.1单片机最小设计系统 (8)4.2红外线检测电路 (9)4.3计数显示部分 (10)4.4蜂鸣器报警电路 (10)4.5按键控制电路 (11)5 红外计数器程序设计 (11)5.1主程序设计 (11)5.2子程序设计 (13)6总结 (15)7参考文献 (16)1、程设计目的课利用AT89C51单片机来制作一个手动计数器。
通过具体的项目设计包括确定控制任务、系统总体方案设计、硬件系统设计、控制程序的设计等,以便掌握单片机系统设计的总体思路和方法,掌握基于单片机控制的电子产品开发的技术方法,培养个人的创新意识和动手能力。
2、课程设计的主要内容2.1设计的要求1.利用AT89C51单片机来制作一个红外线计数器。
有物体经过红外对管时计数一次。
计数的范围是0~99, 计数满时,又从零开始计数。
2.整个系统有较强的抗干扰能力,具有报警能力。
3.将计数值准确显示出来。
2.2创新方案及原理分析总体电路是由AT89C51单片机系统、红外光电管电路、蜂鸣器报警电路、数码管显示部分、复位电路部分组成,其结构如图2.1所示图 2.1 整体方框图红外传感器感受到外界信息时,产生高低电平,通过软件程序设置单片机内部寄存器,当传感器的高低脉冲被单片机接收到时,单片机产生中断,中断产生后进入中断服务程序,通过设置中断服务程序,进行计数。
光电计数器工作原理

光电计数器工作原理
光电计数器是一种根据光电效应原理来实现计数的装置。
其工作原理如下:
1. 光电效应:当光线照射到某些材料表面时,光子的能量可以导致电子从材料中解离出来,这个过程称为光电效应。
2. 光电效应的应用:光电计数器利用光电效应,将光线照射到光电计数器的光电导(例如光电二极管)上。
当光照射到光电导上时,光电导会产生电流。
3. 计数原理:光电计数器通过测量光电导上的电流来实现计数。
当有光线照射到光电导上时,光电导会产生电流,这时计数器会对电流进行检测和记录。
4. 计数过程:光电计数器会根据光电导上产生的电流来判断光线的存在与否。
当光线照射到光电导上时,计数器会记录一次计数。
当光线消失时,计数器停止计数。
通过记录每次计数的次数,可以得到光线的数量。
需要注意的是,光电计数器的工作原理可以根据具体的设计和制造与不同,上述介绍只是一种典型的工作原理。
光电计数器资料

图 4-1 数字式光电计数器原理图电路接通电源后,红外线发光二极管发出稳定的红外线信号。
当红外线接收管VT 接收到红外线发光二极管LED 发出的红外线信号时,其集电极输出低电平,此低电平送至电压比较器IC2B ,比较器的参考电压由电阻R3 、R4分压获得。
送至IC2B 反向输入端的低电平信号使得反相输入端电位低于同相输入端的电位,IC2B 输出高电平。
IC2B 输出的高电平送至电压比较器IC2A 的反相输入端。
IC2A 的参考电压同样由电阻R3 、R4分压获。
送至IC2A 反向输入端的高电平高于同相输入端电位,IC2A 输出低电平,使得光电耦合器得电工作,VT 导通,其T集电极输出低电平。
当有物体通过LED和VTD之间时,红外线被阻挡,VTD接收不到红外线信号,其集电极输出高电平,使得比较器IC2B输出低电平,IC2A输出高电平,光电耦合器停止工作VT截止,其集电极输出高电平。
由此,当有物体从红外线发光二极管LED和接收管VTD之间通过时,VT就截止1次,其集电极电位也随之跳变1次,相当于输出1 个计数脉冲。
如果有物体不断通过,VT就输出连续的计数脉冲。
双十进制同步计数器集成电路CD4518对VT的集电极输出的计数脉冲的下降沿进行计数。
为了满足下降沿计数的要求,需要将CD4518的正脉冲计数输入1CP端1脚接地,计数脉冲由EN端2脚输入。
本电路将CD4518的第一级计数器的输出端Q3连接第二级的2EN端10脚,构成两级串联计数,可实现0——99计数。
R12和C2是计数器的上电清零电路,电路接通电源的瞬间,CD4518的清零端15脚得到一个高电平脉冲,计数器被清零。
两片四线-七线锁存、译码驱动器CD4543和共阴极型LED数码管构成了计数显示电路,计数器CD4518输出的BCD码计数脉冲送至CD4543进行译码锁存处理,驱动LED数码管显示计数结果,本电路可显示0——99。
电路中,C4和R12组成开机复位电路,接通电源后由RC电路产生一个复位脉冲的复位端R,计数器自动清0.本电路中的计数器采用脉冲下降沿触发方。
毕业论文光电计数器设计及制作

目录摘要 (2)第一章光电转换部分 (5)§1。
1光源的基本特性和选择 (5)1。
1。
1热辐射光源 (5)1。
1.2气体放电光源 (5)1.1。
3固体发光光源 (5)1。
1.4激光器 (6)§1。
2 光电探测器 (7)1。
2.1光伏探测器的原理 (7)1。
2.2光伏探测器的特性 (9)1.2.3 快速硅PIN光电二极管 (10)§1.3 光电信号输出 (11)第二章计数电路 (12)§2。
1 十进制计数电路设计 (12)§2.2 显示译码电路设计 (13)§2.3 数码显示 (14)第三章光电计数器电路的安装及改进 (16)§3.1 器件准备 (16)3.1。
1 器件清单表 (16)3。
1.2 其它使用的仪器: (16)§3。
2 电路连接 (16)3。
2.1 光电部分 (16)3.2。
2 计数部分 (17)3.2。
3 显示译码部分 (17)3.2.4 显示部分 (18)§3.3 电路分步测试 (18)3。
3.1 光电二极管的测试 (18)3。
3.2 555定时器的测试 (18)3。
3.3 计数电路的测试 (18)3.3。
4显示电路的测试 (19)§3.4 电路总体调试 (19)§3.5 光电转换电路改进 (19)3。
5.1阻抗匹配改进 (19)3。
5。
2 光电计数器适用性改进 (21)参考文献 (23)致谢 ................................................. 错误!未定义书签。
摘要数字式计数器因为其有使用方便,计数精确,显示直观等优点,被广泛应用于各行业生产线上的物件计数。
本论文利用光电二极管接收激光光源发射的光信号,并通过数字计数与显示电路设计了一种光电计数器。
当物件从光电二极管与激光器之间通过时会对光束进行遮挡,光电二极管的电压发生变化。
毕业论文光电计数器设计及制作

毕业论文光电计数器设计及制作光电计数器是一种常见的数字传感器,可以通过光电元件对光强度进行测量,并将得到的信号转换成数字信号进行计数。
本文将介绍光电计数器的设计和制作过程。
一、原理介绍光电计数器的基本原理是利用光敏元件(比如光敏二极管)和计数器芯片(比如74LS76)实现对光强的测量和数字计数。
具体流程如下:1. 光敏元件接收光信号,将光信号转化为电信号。
这里我们使用光敏二极管,通过照射它来产生电流(或电压)信号。
2. 信号放大。
由于光敏二极管产生的电流信号非常微弱,需要经过一个放大器进行放大,通过构建像素放大器来对信号进行放大。
3. 信号滤波处理。
由于光信号中包含噪声,在进行信号测量之前需要对信号进行滤波处理,通常可以采用低通滤波器来消除高频噪声。
4. 数字计数。
将上述处理之后的信号输入74LS76芯片进行数字计数,可以实现对光信号的计数。
其中,74LS76是一款可同步74LS系列预置式双稳态计数器,包含两个独立恒压源的JK触发器。
二、设计过程1. 光敏元件的选择。
在本设计中,我们选择了光敏二极管作为光敏元件,其灵敏度较高,响应速度较快,此外成本也相对较低。
需要注意选择合适的工作波长(根据不同应用场景的光源波长进行选择)。
2. 像素放大器的设计。
为了放大光敏二极管产生的微弱信号,我们需要构建一个像素放大器。
放大器的主要部件包括一个放大电路和一个反馈电路。
电路设计采用了双运算放大器,具备高增益、高输入阻抗和低噪声等特点。
反馈电路采用了电压跟随器结构,能够实现电压放大,同时对电压进行平滑处理,起到滤波作用。
3. 滤波器设计。
为了消除光信号中的高频噪声,我们采用了一级低通滤波器。
该低通滤波器采用R-C串联结构,通过改变电容的大小可以调节滤波器的截止频率。
4. 计数器的选择。
在本设计中,我们选择了74LS76芯片作为计数器。
这款芯片具有高速、低功耗、低成本的特点,可以满足光电计数器的计数要求。
三、制作过程1. 光电元件的连接。
光电计数器

AT89C51的工作电源电压为5(1±0.2)V且典型值为5V,最高工作频率为24MHz。
4.2 键盘输入电路及数码管LED显示当前键入数字电路
键盘是计算机最常用的输入设备,是实现人机对话的纽带。按其结构形式可分为非编码键盘和编码键盘。
编码键盘采用硬件方法产生键码。每按下一个键,键盘能自动生成键盘代码,键数较多,且具有去抖动功能。这种键盘使用方便,但硬件较复杂,PC机所用键盘即为编码键盘。非编码键盘仅提供按键开关工作状态,其键码由软件确定,这种键盘键数较少,硬件简单,广泛应用于各种单片机应用系统,本次试验使用的就是非编码键盘。
3.2 设计原理
1、系统利用红外LED发光管作为光源,光敏三极管接受计数脉冲,当光敏三极管未受到光照时,使光电管截止,其集电极输出高电平,光敏三极管受到光照时,使光电管导通,集电极变为低电平,如此便在光敏三极管的集电极产生一个负脉冲。若将此脉冲接在单片机定时器/计数器的输入端,便可以进行光电计数。
2、光电计数器的计数值通过单片机扩展的电路在LED显示器上11553
12级通信工程二班
指导老师王琼
2015年7月18日
一、课题概述
在许多实际生产过程中都要对事件进行计数,例如,通过传送带上的货物,生产流水线上的产品数量等均要进行自动计数,可见计数器在工业控制中有着广泛的应用。传统的数字计数器都是用中小规模数字集成电路构成的,不但电路复杂,成本高,功能修改也不易。用单片机制作的计数器可以克服传统数字电路计数器的局限,有着广阔的应用前景。
六、软件流程图
七、心得体会
通过这次光电计数器的设计,使我对单片机系统有了更深的了解。本设计只是一个简单的光电计数器,还可以有很多的附加功能。这次实验不仅使我对单片机的认识有了加深,也提高了自己的动手能力。我意识到实践的重要性,同时也学到了很多书本上学不到的知识。
毕业设计(论文)电子类课题题目

毕业设计(论文)电子类课题题目一、光电计数器的设计(设计要求:1、实现0―999范围计数,能在超出最大值后溢出报警;2、要求使用红外发光二极管、光电管检测;3、能在设定值报警,能在报警后延时3秒钟自动关闭报警并自动重新计数;可以手动清除报警;4、要求光电发射管与接收管有1米以上的间距;5、画出完整的电路原理图(包含电源部分)和PCB板图。
二、水温控制器的设计1、水温能控制在25℃-60℃之间;2、可以以2℃为步进调节,控制误差±2℃;2、画出完整的电路原理图(包含电源部分)和PCB板图。
三、数字式可调稳压电源1、用89C51系列单片机控制实现;2、输出电压在0-24V之间可以任意调节,分辨率0.1V,输出电流最大1.5A;3、整机效率>60% ;4、画出完整的电路原理图(包含电源部分)和PCB板图,写出完整的汇编程序。
四、采用protel实现XX电路板的设计1、画出完整的电路原理图、PCB板图;2、“XX”指电路可以自拟,但要求元件数须大于50个(至少包含一个多于40引脚的集成电路);3、电路原理图、PCB板图必须同时有电子文件和纸质文件;4、最好能通过工厂制作PCB实物;5、详细叙述设计过程,包括必要的设计原则说明。
五、12v/220v车载逆变电源1、实现DC12V到AC220V的转换,输出电流最大1A;2、电压稳定率220V±5%3、画出完整的电路原理图(包含电源部分)和PCB板图。
六、电子温度计的设计1、温度测量范围0℃~100℃,分辨率0.1℃;2、测量值用LED数码管显示;3、画出完整的电路原理图(包含电源部分)和PCB板图。
4、七、声光控制楼道灯开关1、白天灯灭,晚上有声响时灯亮,延迟25秒后熄灭;2、灯泡最大功率60W;3、画出完整的电路原理图(包含电源部分)和PCB板图。
八、用单片机实现电子钟的设计1、用89C51实现秒、分、时计数,可以在24时制和12时制间转换;2、可以在任意时刻对分、时进行校准;3、计时误差小于0.01s/天;4、画出完整的电路原理图(包含电源部分)和PCB板图,写出完整的汇编程序。
光电测速(基于计数)系统+完成的C程序和电路图

光电计数器设计班级学号姓名指导老师2011-07-01光电计数器实验报告摘要光电计数器有直观和计数精确的优点,目前已在各种行业中普遍使用。
光电计数器有多种计数触发方式,它是由实际使用条件和环境决定的。
有采用机械方式的接触式触发的,有采用电子传感器的非接触式触发的,光电式传感器是其中之一,它是一种非接触式电子传感器。
这种计数器在工厂的生产流水线上作产品统计,有着其他计数器不可取代的优点。
本文针对光电计数器的设计要求,在实现了基本要求的基础上改加了测物体转速的功能。
内容简介光电计数器是通过光电耦合器OPTOISO1发光二极管一端在加电压的条件下发出红外光,红外光照射光电耦合器的光敏三极管一端是光敏三级管导通,从而使光敏三级管集电极一端产生低电平。
当有物体遮住红外光时,光敏三极管截止从而产生高低电平的跳变。
并通过74LS14反相器整形送入单片机进行处理。
本设计计数器可将机械或人工计数方式变为电子计数形式,并且采用8*8戴南镇显示屏来计数显示。
一、方案设计和论证采用单片机控制模块提供电源。
改方案的优点是系统简明扼要,节约成本;缺点是输出功率不高。
1.2、技术传感器部分根据老师要求我们一律采用光电耦合器进行计数1.3、显示部分根据实验要求我们一律采用8*8点阵进行计数显示。
系统硬件图2.1 复位电路为确保微机系统中电路稳定可靠工作,复位电路是必不可少的一部分,复位电路的第一功能是上电复位。
一般微机电路正常工作需要供电电源为5V±5%,即4.75~5.25V。
由于微机电路是时序数字电路,它需要稳定的时钟信号,因此在电源上电时,只有当VCC超过4.75V低于5.25V以及晶体振荡器稳定工作时,复位信号才被撤除,微机电路开始正常工作。
电路图如下:上电自动复位是通过外部复位电路的电容充电来实现的。
只要Vcc的上升时间不超过1ms,就可以实现自动上电复位。
2.2 时钟电路时钟电路可以简单定义如下: 1.就是产生象时钟一样准确的振荡电路。
光电计数器电路工作原理

光电计数器电路工作原理嘿,咱聊聊光电计数器电路工作原理呗!这可老神奇啦!光电计数器,那可是个厉害的小玩意儿。
就像一个小精灵,默默地数着来来往往的东西。
光电计数器电路是咋工作的呢?简单来说,就像一个小侦探在破案。
它有个光发射的部分,就像一个小太阳,不断地发出光芒。
这光芒照到要计数的东西上,然后反射回来。
这就好比你拿个手电筒照在墙上,光会反弹回来一样。
接着呢,有个光接收的部分。
这个部分就像一个小眼睛,紧紧地盯着反射回来的光。
一旦有光进来,它就马上反应。
这就像一个站岗的士兵,时刻保持警惕。
要是没有光接收部分,那光发射出去不就白费了吗?肯定不行啊!当光被接收后,电路就开始工作啦。
这就像一个小工厂,各个零件都忙碌起来。
有个部分专门负责把光信号变成电信号。
这就像一个魔法师,把一种东西变成另一种东西。
光信号变成电信号后,就可以被处理啦。
这就好比把一堆乱麻整理成一根绳子,变得有条有理。
然后呢,还有个计数的部分。
这个部分就像一个小会计,一笔一笔地记着数。
每来一个光信号,它就加一。
这可不能出错,要是记错了数,那可就麻烦啦。
就像你去买东西,收银员算错了钱,你能乐意吗?肯定不乐意啊!光电计数器电路还得稳定可靠。
不能一会儿好一会儿坏,那可不行。
就像一辆车,得能稳稳地跑在路上,不能突然抛锚。
要是电路不稳定,一会儿能计数,一会儿不能计数,那还有啥用?肯定没用啊!你说,光电计数器电路神奇不?那肯定神奇啊!它能在不知不觉中数清楚那么多东西。
我的观点是,光电计数器电路通过光发射、光接收、信号转换和计数等过程,实现了准确计数的功能,是个非常实用的小发明。
光电计数器课程设计报告

目录摘要 (2)第1章引言 (2)第2章明确任务 (2)第3章方案产生 (3)第4章光电计数器的系统设计 (4)4.1 系统硬件设计 (4)4.2 系统软件设计 (11)第5章设计原理 (13)5.1 计数测量 (13)5.2 中断方式计数 (13)第6章软件程序设计 (13)6.1 时间控制设置 (13)6.2 10ms定时 (13)6.3 中断闪烁 (13)6.4 总程序调试 (14)6.5 实物安装调试 (17)附:心得体会 (18)元件清单 (18)参考文献 (19)摘要21世纪是信息时代,是获取信息,处理信息,运用信息的时代。
传感与检测技术的重要性在于它是获得信息并对信息进行必要处理的基础技术,是获取信息和处理加工信息的手段,无法获取信息则无法运用信息。
基于光电效应的传感器。
光电式传感器在受到可见光照射后即产生光电效应,将光信号转换成电信号输出。
它除能测量光强之外,还能利用光线的透射、遮挡、反射、干涉等测量多种物理量,如尺寸、位移、速度、温度等,因而是一种应用极广泛的重要敏感器件。
关键词:计数光电传感器第一章引言传感与检测技术是一门知识面广、综合程度高、实用性很强的专业课程。
它从传感器的基本理论入手,着重讲叙传感器的结构与感测原理,传感器是一个二端口的装置,不同的传感器输入-输出特性不同,同一传感器适应不同的被测信号呈现的特性也有所不同。
尤其当被测信号为静态信号时两种状态下,传感器的输入-输出特性完全不同。
感测技术在许多新技术、新器件里都有应用,在课程安排上,以信息的传感、转换、处理为核心,从基本物理概念入手,阐述热工量、机械量、几何量等参数的测量原理及方法。
自动化的计数提高了工业生产上的效率以及准确性,计数的自动化和智能化最终能加速实现现代化的工业。
随着生产自动化、设备数字化和机电一体化的发展,对光电计数器的需求日益增多。
光电计数器设计一方面是为了巩固课本所学知识,完成知识迁移,另一方面加强动手能力,识图能力及设计能力。
光电计数器

二、设计要求:1、设计光电计数器,要求使用红外发光二极管、红外接收管,实现计数功能;2、发光器件和接收器件之间的距离大于1m;3、有抗干扰技术,防止由于抖动产生的误计数;4、每计数100,用等闪烁2s指示一下;5、LED数码管显示计数值。
方案二:采用单片机编程实现利用单片机外部中断方式,当光电转换电路检测到外界有物体移动时,输出由高电平变为低电平。
将这一负跳变信号传送给单片机可使其产生一次外部中断,进而执行中断中的指令,由中断服务程序控制计数,LED灯闪烁程序流程图如下图所示:方案比较: 方案一采用组合与时序逻辑电路,采用模块化方法设计电路图,易于实现对电路的检查,且制作成本较低。
但其运用了较多的模拟器件,比较容易受到外界的影响。
方案二运用单片机编程,可降低设计电路的周期,具有很高的精确性。
综合考虑后,我决定采用了方案一完成本次课程设计,系统的原理框图如图1所示。
图 1 系统电路原理图具体各部分电路图如下文所述。
五、具体实现:总电路图如下:1、电源部分:采用5V电源直接驱动。
2、光电转换部分:红外对管和R1,R2组成的光电检测电路,负责把被检测的数量转换成电压脉冲信号。
工作时红外发光管发出的红外光线投射到光敏三极管上,光敏三极管导通,集电极输出低电平;当红外光线被检测物遮断时,光敏三极管截止,集电极输出高电平。
遮断一次输出一个脉冲,因此脉冲的个数就是被检测物的数量红外对管中红外发光管的正向电流为50mA,在环境温度为25°C时,它的最大耗散功率100mW,正向压降1.5V。
当环境温度上升时,允许的正向工作电流还要减小。
为了留有一定的欲量,取它的工作电流为20mA。
则R1=mA VV 205.15-=175 ῼ取R1=200ῼ,其中5V是电源电压,1.5V是红外发光管的正向压降。
根据红外对管的计数手册可知:使红外发光管的正向电流为20mA,当有遮挡时,光敏三极管Iceo=100nA;无遮挡时,光敏三极管的Ic=0.7mA.为了使光敏三极管能工作在开关状态,则R2=mA VV7.04.05-=6.7Kῼ取R2=10Kῼ,其中5V是电源电压,0.4V是光敏三极管的饱和压降。
光电计数器源程序

#include<reg51.h> //单片机头文件#include<absacc.h>//访问绝对地址#include<math.h>#include<stdio.h>//输入输出流#define COM8279 XBYTE[0X5FFF] //8279控制命令地址#define DATA8279 XBYTE[0X5EFF] //8279数据地址#define uint unsigned int#define uchar unsigned char //定义无字符变量uint x;//高位计数值uint y;//定时中断重复值uint keyboard;//键值uint i;uint now;uint z;uchar code table[]={ 0x0C0,0x0F9,0x0A4,0x0B0,0x99, 0x92, 0x82, 0x0F8,0x80, 0x90, 0x88, 0x83,0x0C6,0x0A1,0x86, 0x8E};//共阳极LED段码表,0x表示十六进制,表示0~9,a~fuint LED[]={0,0,0,0,0,0};//六个数码管的初值void show1(void);//数码管显示程序void show2(void);void main(void){COM8279=0xDC;//清除显示RAM和FIFO命令字COM8279=0x34;//程序时钟编程命令 (11000)24分频COM8279=0x00;//键盘方式设置(8*8字符显示左边输入,编码方式扫描键盘,双键互锁)COM8279=0x92;//设置写显示命令(AI=1每次写入后地址自动加1;显示RAM一个单元地址0010)for(i=0;i<6;i++){DATA8279=table[LED[i]];//数据地址,数码管置零}x=0;TMOD=0x16; //T1定时50ms,方式1;T0计数,方式2 TH0=0x00;TL0=0x00; //计数赋初值,计数值为256TH1=0x3C;TL1=0x0B0; //50ms定时器赋初值(65536-50ms/1us=15536=0x3CB0) ET0=1;//开中断,计数器,P3.4(光电门)ET1=1;//开中断,定时器TR0=1;TR1=1;IT0=0;//外部中断0选用电平触发方式,低电平触发中断EX1=1; //开外部中断EA=1;//打开总中断while(1);//等待中断}void inter0(void) interrupt 1//外部中断程序{COM8279=0x40;//读键盘命令(AI=0仅读一个单元)keyboard=DATA8279;/*扫描键盘输入值*/if(keyboard==0)//清零重新计数{TL0=0;x=0;}else if (keyboard==1)//暂停计数 {TR0=0;TR1=0;now=TL0;//存储当前计数值}else if (keyboard==2)//开始计数 {TR0=1;TR1=1;TL0=now;//将原计数值赋给计数器}else if (keyboard==3)//计数加1 {TL0++;}else if (keyboard==4)//计数总值 {TR1=0;z=256*x+TL0;show2();}else if (keyboard==5)//重新显示计数值{TR1=1;TL0=z%256;}else{TR0=1;TR1=1;} //继续计数}void timer0(void) interrupt 2//计数器中断程序{x++;//高位计数}void timer1(void) interrupt 3//50ms定时器中断程序{while(y<10){TH1=0x3C; //50msTL1=0x0B0;y++;}y=0;show1();} //目的是每0.5s扫描一次数值,使计数值一直显示在数码管上/*显示函数*/void show1(void){COM8279=0x92;//设置写显示命令,8279命令字LED[0]=TL0%10;//显示低位计数0-255LED[1]=TL0%100/10;LED[2]=TL0%1000/100;LED[3]=x%10;//显示高位计数LED[4]=x%100/10;LED[5]=x%1000/100;for(i=0;i<6;i++){DATA8279=table[LED[i]];//显示display数组 }}void show2(void)//显示计数总值{COM8279=0x92;//设置写显示命令,8279命令字LED[0]=z%10;LED[1]=z%100/10;LED[2]=z%1000/100;LED[3]=z%10000/1000;LED[4]=z%100000/10000;LED[5]=z%1000000/100000;for(i=0;i<6;i++){DATA8279=table[LED[i]];//显示display数组 }}。
光电测速系统软件程序设计C语言

#include<reg52.h>#define uint unsigned int#define uchar unsigned charsbit key1=P3^0; //程序开始,进入设置最大值阶段第二功能:设置个位数值sbit key2=P3^1; //设置十位数值第二功能:开始/暂停sbit key3=P3^2; //设置百位数值第二功能:显示设定的最大值sbit key4=P3^3; //设置千位数值第二功能:显示测速结果sbit key5=P3^4; //设置最大值完设定工作时间阶段第二功能:结束,并显示----回到程序初始阶段sbit dula=P3^6; //锁存器段选控制sbit wela=P3^7; //锁存器位选控制sbit led1=P1^0; //正在测速sbit led2=P1^1; //超速报警sbit buzz=P1^2; //蜂鸣器控制位sbit led3=P1^3; //反转指示灯sbit led4=P1^4; //正转指示灯sbit count=P3^5; //脉冲输入端口sbit a1=P1^5; //继电器控制高电平接电源sbit a2=P1^6; //继电器控制高电平接地uint ge,shi,bai,qian,num1,num2,num3,num4,aa,bb,t1,t2,t3,t4;uint maxspeed; //最大速uint t2time; //定时时间uchar timeset; //定时标志位long double respeed,respeed1; //测得实际速度uchar key1flag,key2flag,key5flag,keytime; //按键标志位uchar time1count,flagt2,a;/*-------------------字形表0-9---------------------------*/uchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf};void delay(uint z);void portinit();void timeinit();void time0start();void time1start();void time2start();void display(uchar g,uchar g1,uchar s,uchar s1,uchar b,uchar b1,uchar q,uchar q1);void keyconve();void key1conve();void key2conve();void key5conve();void key5convetime();void key1convetime();void speedcompare();/********************************************************/ /* 延时子函数*/ /* */ /********************************************************/ void delay(uint z){uint x,y,i;for(x=z;x>0;x--)for(y=6;y>0;y--)for(i=19;i>0;i--);}/********************************************************/ /* */ /* 变量、标志位和端口初始化*/ /* */ /********************************************************/ void portinit(){P0=P1=P2=P3=0xff;buzz=0;ge=shi=bai=qian=0;bb=t1=t2=t3=t4=t2time=0;num1=num2=num3=num4=0;aa=key1flag=key2flag=key5flag=time1count=0;maxspeed=respeed=respeed1=0;flagt2=keytime=timeset=0;EA=1;a1=a2=1;T2MOD=0;EXEN2=0;T2CON=0;}/********************************************************/ /* */ /* 定时计数初始化*/ /* */ /********************************************************/ void timeinit(){TH1=0;TL1=0;TH0=(65536-20000)/256;TL0=(65536-20000)%256;TMOD=0x51;}/********************************************************//* 定时器0开启;定时器0关闭;*/ /* 计数器1开启;计数器1关闭;*/ /* 定时器2开启;*/ /********************************************************/ void time0start(){TR0=1;ET0=1;}void time1start(){TR1=1;ET1=1;TH1=TL1=0;}void time2start(){TR2=1;ET2=1;TH2=(65536-50000)/256;TL2=(65536-50000)%256;RCAP2H=(65536-50000)/256;RCAP2L=(65536-50000)%256;}/********************************************************//* 定时器0中断*/ /* *//********************************************************/ void timer0() interrupt 1{TH0=(65536-20000)/256;TL0=(65536-20000)%256;aa++;if(aa==50){aa=0;ET0=0;ET1=0;if(a<1)a++;else{respeed1=(TH1*256+TL1)*60/6.0+time1count*65536*60/6.0;/*假设转一圈接收6个脉冲信号,则一秒所接收的脉冲数m/6*60即为每分钟转数,即m*10*/respeed=respeed1/10;num4=(uint)respeed/1000;num3=(uint)respeed%1000/100;num2=(uint)respeed%100/10;num1=(uint)respeed%10;}time0start();time1start();}}/********************************************************//* 计数器1中断*//********************************************************/void timer1() interrupt 3{ET1=0;time1count++;ET1=1;}/********************************************************//* 定时器2中断*//********************************************************/void timer2() interrupt 5{if(flagt2==1){bb++;if(bb==20){bb=0;if(t2time==0)a2=!a1;else{t2time--;t4=t2time/1000;t3=t2time%1000/100;t2=t2time%100/10;t1=t2time%10;}}}TF2=0;}/********************************************************//* 两个四位数码管动态分时显示*//* -----显示设定值和转速*//* -----倒计时显示*//********************************************************/void display(uchar g,uchar g1,uchar s,uchar s1,uchar b,uchar b1,uchar q,uchar q1) {wela=1;P2=0xf7;wela=0;dula=1;P0=table[g];dula=0;P0=0xff;delay(1);wela=1;P2=0x8f;wela=0;dula=1;P0=table[g1];dula=0;delay(1);wela=1;P2=0xfb;wela=0;dula=1;P0=table[s];dula=0;P0=0xff;delay(1);wela=1;P2=0x4f;wela=0;dula=1;P0=table[s1];dula=0;delay(1);wela=1;P2=0xfd;wela=0;dula=1;P0=table[b];dula=0;P0=0xff;delay(1);wela=1;P2=0x2f;wela=0;dula=1;P0=table[b1];dula=0;delay(1);wela=1;P2=0xfe;wela=0;dula=1;P0=table[q];dula=0;P0=0xff;delay(1);wela=1;P2=0x1f;wela=0;dula=1;P0=table[q1];dula=0;delay(1);}/********************************************************/ /* key1,key2,key3,key4第一功能*/ /* 个位十位百位千位设值*/ /* 设定最高警戒速度按键转换程序*/ /********************************************************/void keyconve(){if(key1==0){delay(10);if(key1==0){if(timeset==0){ge++;if(ge>9)ge=0;while(!key1){display(t1,ge,t2,shi,t3,bai,t4,qian);}}else{t1++;if(t1>9)t1=0;while(!key1){display(t1,num1,t2,num2,t3,num3,t4,num4);}}}}if(key2==0){delay(10);if(key2==0){if(timeset==0){shi++;if(shi>9)shi=0;while(!key2){display(t1,ge,t2,shi,t3,bai,t4,qian);}}else{t2++;if(t2>9)t2=0;while(!key2){display(t1,num1,t2,num2,t3,num3,t4,num4);}}}}if(key3==0){delay(10);if(key3==0){if(timeset==0){bai++;if(bai>9)bai=0;while(!key3){display(t1,ge,t2,shi,t3,bai,t4,qian);}}else{t3++;if(t3>9)t3=0;while(!key3){display(t1,num1,t2,num2,t3,num3,t4,num4);}}}}if(key4==0){delay(10);if(key4==0){if(timeset==0){qian++;if(qian>9)qian=0;while(!key4){display(t1,ge,t2,shi,t3,bai,t4,qian);}}else{t4++;if(t4>9)t4=0;while(!key4){display(t1,num1,t2,num2,t3,num3,t4,num4);}}}}}/********************************************************/ /* key1第二功能开始设定最大值*/ /* 初始显示0000 */ /********************************************************/ void key1conve(){if(key1==0){delay(10);if(key1==0){key1flag=!key1flag;while(!key1){display(t1,ge,t2,shi,t3,bai,t4,qian);}}}}/********************************************************/ /* key2第二功能:控制程序开始(暂停)测速*//********************************************************/ void key2conve(){if(key2==0){delay(10);if(key2==0){key2flag=!key2flag;while(!key2){display(t1,num1,t2,num2,t3,num3,t4,num4);}}}}/********************************************************/ /* key5第二功能:设定最大速结束进入设倒计时阶段*/ /********************************************************/ void key5conve(){if(key5==0){delay(10);if(key5==0){key5flag=!key5flag;timeset=!timeset;while(!key5){display(t1,ge,t2,shi,t3,bai,t4,qian);}}}}/********************************************************/ /* key5第三功能:开始倒计时*/ /********************************************************/ void key5convetime(){if(key5==0){delay(10);if(key5==0)keytime=!keytime;t2time=1000*t4+100*t3+10*t2+t1;if(t2time==0);elseflagt2=1;while(!key5){display(t1,num1,t2,num2,t3,num3,t4,num4);}}}}/********************************************************/ /* key1第三功能:控制正反转*/ /********************************************************/ void key1convetime(){if(key1==0){delay(10);if(key1==0){a1=a2=!a1;while(!key1){display(t1,num1,t2,num2,t3,num3,t4,num4);}}}}/********************************************************/ /* 实测转速与警戒速比较超出警报*/ /* 蜂鸣器报警,LED警报灯亮*/ /* 显示正反转,指示灯显示*/ /********************************************************/ void speedcompare(){maxspeed=1000*qian+100*bai+10*shi+ge;if(maxspeed<respeed){if(maxspeed==0) //设定最大速为零即未设置时不警报;{if(a1==1&&a2==1)led3=0;if(a1==0&&a2==0)led4=0;led2=0;buzz=1;}}else{led2=1;buzz=0;led3=1;led4=1;}}/********************************************************//* *//* 主程序*//* *//********************************************************/void main(){portinit(); //开始初始化timeinit(); //定时计数初始化time0start(); //开定时0time1start(); //开计数1TR0=0;TR1=0;while(key1flag==0) //key1标志位:设定最大值,初始显示0000{display(10,10,10,10,10,10,10,10);key1conve();}while(key5flag==0) //key5标志位置1后则设定最大速结束进入设定倒计时阶段{display(t1,ge,t2,shi,t3,bai,t4,qian);keyconve();key5conve();}delay(300);while(keytime==0) //key5,开始倒计时,设0不会有影响{display(t1,num1,t2,num2,t3,num3,t4,num4);keyconve();key5convetime();}time2start(); //定时器2开启while(1){display(t1,num1,t2,num2,t3,num3,t4,num4);key1convetime();key2conve(); //按键key2第二功能开始与暂停测速if(key2flag==1){TR0=1;TR1=1;led1=0;if(a1==1&&a2==1)led3=0;if(a1==0&&a2==0)led4=0;display(t1,num1,t2,num2,t3,num3,t4,num4);speedcompare();}else{if(key2flag==0){TR0=0;TR1=0;led1=1;led3=1;led4=1;buzz=0;a=0;}}if(key3==0) //key3显示设定的最大值{delay(10);if(key3==0){while(key4==1) //切换显示实际转速{display(t1,ge,t2,shi,t3,bai,t4,qian);}}display(t1,num1,t2,num2,t3,num3,t4,num4);}if(key5==0) //程序结束,重新开始进入显示----{delay(10);if(key5==0)goto end;}}end:;}Z111光电测速系统十位个位千位百位/测速/暂停/设值/正反转/显实测速/显设定值个十百千结束设值/ 测速显设/显实每步正反转开/停定值测速结束正转反转。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
#include<reg51.h> //单片机头文件
#include<absacc.h>//访问绝对地址
#include<math.h>
#include<stdio.h>//输入输出流
#define COM8279 XBYTE[0X5FFF] //8279控制命令地址
#define DATA8279 XBYTE[0X5EFF] //8279数据地址
#define uint unsigned int
#define uchar unsigned char //定义无字符变量
uint x;//高位计数值
uint y;//定时中断重复值
uint keyboard;//键值
uint i;
uint now;
uint z;
uchar code table[]={ 0x0C0,0x0F9,0x0A4,0x0B0,
0x99, 0x92, 0x82, 0x0F8,
0x80, 0x90, 0x88, 0x83,
0x0C6,0x0A1,0x86, 0x8E};//共阳极LED段码表,0x表示十六进制,表示0~9,a~f
uint LED[]={0,0,0,0,0,0};//六个数码管的初值
void show1(void);//数码管显示程序
void show2(void);
void main(void)
{
COM8279=0xDC;//清除显示RAM和FIFO命令字
COM8279=0x34;//程序时钟编程命令 (11000)24分频
COM8279=0x00;//键盘方式设置(8*8字符显示左边输入,编码方式扫描键盘,双键互锁)
COM8279=0x92;//设置写显示命令(AI=1每次写入后地址自动加1;显示
RAM一个单元地址0010)
for(i=0;i<6;i++)
{
DATA8279=table[LED[i]];//数据地址,数码管置零
}
x=0;
TMOD=0x16; //T1定时50ms,方式1;T0计数,方式2 TH0=0x00;
TL0=0x00; //计数赋初值,计数值为256
TH1=0x3C;
TL1=0x0B0; //50ms定时器赋初值(65536-50ms/1us=15536=0x3CB0) ET0=1;//开中断,计数器,P3.4(光电门)
ET1=1;//开中断,定时器
TR0=1;
TR1=1;
IT0=0;//外部中断0选用电平触发方式,低电平触发中断
EX1=1; //开外部中断
EA=1;//打开总中断
while(1);//等待中断
}
void inter0(void) interrupt 1//外部中断程序
{
COM8279=0x40;//读键盘命令(AI=0仅读一个单元)
keyboard=DATA8279;
/*扫描键盘输入值*/
if(keyboard==0)//清零重新计数
{
TL0=0;
x=0;
}
else if (keyboard==1)//暂停计数 {
TR0=0;
TR1=0;
now=TL0;//存储当前计数值
}
else if (keyboard==2)//开始计数 {
TR0=1;
TR1=1;
TL0=now;//将原计数值赋给计数器
}
else if (keyboard==3)//计数加1 {
TL0++;
}
else if (keyboard==4)//计数总值 {
TR1=0;
z=256*x+TL0;
show2();
}
else if (keyboard==5)//重新显示计数值
{
TR1=1;
TL0=z%256;
}
else
{
TR0=1;
TR1=1;
} //继续计数
}
void timer0(void) interrupt 2//计数器中断程序
{
x++;//高位计数
}
void timer1(void) interrupt 3//50ms定时器中断程序
{
while(y<10)
{
TH1=0x3C; //50ms
TL1=0x0B0;
y++;
}
y=0;
show1();
} //目的是每0.5s扫描一次数值,使计数值一直显示在数码管上
/*显示函数*/
void show1(void)
{
COM8279=0x92;//设置写显示命令,8279命令字
LED[0]=TL0%10;//显示低位计数0-255
LED[1]=TL0%100/10;
LED[2]=TL0%1000/100;
LED[3]=x%10;//显示高位计数
LED[4]=x%100/10;
LED[5]=x%1000/100;
for(i=0;i<6;i++)
{
DATA8279=table[LED[i]];//显示display数组 }
}
void show2(void)//显示计数总值
{
COM8279=0x92;//设置写显示命令,8279命令字
LED[0]=z%10;
LED[1]=z%100/10;
LED[2]=z%1000/100;
LED[3]=z%10000/1000;
LED[4]=z%100000/10000;
LED[5]=z%1000000/100000;
for(i=0;i<6;i++)
{
DATA8279=table[LED[i]];//显示display数组 }
}。