用AT89C51单片机控制8段LED数码管采用动态显示的方式显示出00000000

用AT89C51单片机控制8段LED数码管采用动态显示的方式显示出00000000,第1张

你的仿真图有点问题,1,P0口要加上拉电阻,用一个排电阻。
2,两个74LS373的LE控制端,直接用单片机的2个脚控制就行了吗,何必用74LS138呢,而138却用了单片机的6个脚,反倒多用了4个,这不是即浪费又麻烦吗看这是跟谁学的这种做法。

摘 要:使用AT89C51单片机,选用集成温度传感器AD590和气体传感器TGS202作为敏感元件,利用多传感器信息融合技术,开发了可用于小型单位火灾报警的语音数字联网报警器。 关键词:单片机;传感器;信号处理;火灾报警器 1 引 言 我国的火灾自动报警控制系统经历了从无到有、从简单到复杂的发展过程,其智能化程度也越来越高。目前国内厂家多偏重用于大型仓库、商场、高级写字楼、宾馆等场所大型火灾报警系统的研发,他们采用集中区域报警控制方式,其系统复杂、成本较高。而在居民住宅区、机房、办公室等小型防火单位,需要设置一种单一或区域联网、廉价实用的火灾自动探测报警装置,因此,研制一种结构简单、价格低廉的语音数字联网火灾报警器是非常必要的。 一般小型防火单位火灾报警系统如图1所示。现场火灾报警器通过对传感器火情信息的检测,使用智能识别算法实现对火灾的监测。当报警器监测到火情信息后,直接通过Modem经公用电话交换网迅速向消防指挥中心报告火情信息(包括火灾单位编码、单位名称、火情级别以及报警时间等),同时产生声光报警信号,并按事先预留的电话号码自动拨号通知单位有关负责人。消防指挥中心根据接收到的火警信息,立即在消防信息数据库中查询单位位置、周围道路、交通、水源情况等基本信息,根据所获得的信息迅速确定最佳救火方案,通过网络将出警命令直接下达各消防中队。本文将详细介绍小型防火单位语音数字联网报警器的设计与实现。 2 报警器硬件设计 2.1 硬件组成 如图2所示,报警器硬件由温度烟雾信号采集模块、声光报警模块以及单片机与Modem通信模块组成。图中1,2,3组成数据采集模块,4,5组成声光报警模块,5,6,7组成与Modem通信模块。其中,1为传感器(包括烟感和温感),将现场温度、烟雾等非电信号转化为电信号;2为信号调理电路,将传感器输出的电信号进行调理(放大、滤波等),使之满足A/D转换的要求;3为A/D转换电路,完成将温度传感器和烟雾传感器输出的模拟信号到数字信号的转换。声光报警模块由单片机和报警电路组成,由单片机控制实现不同的声光报警(异常报警、故障报警、火灾报警)功能。单片机与Modem通信模块由单片机、GM16C550串行端口扩展芯片和RS232电平转换电路组成,实现报警器经Modem与消防指挥中心的通信。下面对上述各模块进行简要介绍。 2.2 温度烟雾信号采集模块 要准确地进行火灾报警,选择合适的温度和烟雾传感器是准确报警的前提。综合考虑各因素,本文选择集成温度传感器AD590和气体传感器TGS202用作采集系统的敏感元件。 AD590是美国Analog Devices公司生产的一种电流型二端温度传感器。电路如图3所示。由于AD590是电流型温度传感器,他的输出同绝对温度成正比,即1μA/k,而数模转换芯片ADC0809的输入要求是电压量,所以在AD590的负极接出一个10 kΩ的电阻R1和一个100Ω的可调电阻W,将电流量变为电压量送入ADC0809。通过调节可调电阻,便可在输出端VT获得与绝对温度成正比的电压量,即10 mV/K。 火灾中气体烟雾主要是CO2和CO。TGS202气体传感器能探测CO2,CO,甲烷、煤气等多种气体,他灵敏度高,稳定性好,适合于火灾中气体的探测。如图4所示,当TGS202探测到CO2或CO时,传感器的内阻变小,VA迅速上升。选择适当的电阻阻值,使得当气体浓度达到一定程度(如CO浓度达到0.06%)时,VA端获得适当的电压(设为3 V)。 A/D转换电路采用了常用的8位8通道数模转换专用芯片ADC0809,电路如图5所示。温度、烟雾传感器的输出分别接到ADC0809的IN0和IN1。ADC0809的通道选择地址A,B,C分别由89C51的P0.0~P0.2经地址锁存器74LS373输出提供。当P27=0时,与写信号WR共同选通ADC0809。图中ALE信号与ST信号连在一起,在WR信 号的前沿写入地址信号,在其后沿启动转换。例如,输出地址7FF8H可选通通道IN0,实现对温度传感器输出的模拟量进行转换;输出地址7FF9H可选通通道IN1,实现对烟雾传感器输出的模拟量进行转换。图中ADC0809的转换结束状态信号EOC接到89C51的INT1引脚,当A/D转换完成后,EOC变为高电平,表示转换结束,产生中断。在中断服务程序中,将转换好的数据送到指定的存储单元。 2.3 声光报警模块 声光报警电路在单片机P1口的控制下,可以根据不同情况(火灾、异常、故障)发出不同的声光报警信号。声音信号由专用语音芯片提供。通过给语音芯片的S1和S2端输入不同的逻辑电平(00,01,10,11),便可以获得4种不同的声音信号。由单片机的P1.0和P1.1控制。另外该芯片还需要一个选通信号,由P1.3提供。只有当该信号为高电平时,芯片才会根据S1和S2端的控制信号发出不同的报警声,否则不会发声报警。 由P1口的P1.4~P1.7分别控制4个发光二极管,予以光报警,如图6所示。P1.4~P1.7控制的灯依次为绿色(正常信号灯)、(故障信号灯)、红色(异常信号灯)和红色(火灾信号灯)。当这些输出端输出低电平时,对应的信号灯便会发光报警。 2.4 单片机与Modem通信模块 当报警器监测到火灾信息后,除了在火灾现场产生声光报警信号外,还需要将火灾信息按事先预留的电话号码自动拨号通知单位有关人员,并迅速上报消防指挥中心,为此,系统设计了单片机与Modem通讯模块,该模块由单片机、GM16C550串行端口扩展芯片和RS232电平转换电路组成。限于篇幅,对通讯模块的硬件电路及编程不做详细论述。 3 报警器监控程序设计 监控程序流程图如图7所示。系统复位后,首先要进行初始化,包括对各个控制用寄存器的初始化、设置中断服务程序的入口地址、设置堆栈等。 为了便于系统维护和功能扩充,采用了模块化程序设计方法,系统各个模块的具体功能都是通过子程序调用实现的。本系统主要包括数据采集子程序、火灾判断与报警子程序以及Modem通讯子程序等。 3.1 数据采集子程序 数据采集部分的程序设计包括:驱动ADC0809的IN0和IN1进行A/D转换,分别由子程序ADC1(温度转换)和ADC2(烟雾浓度转换)完成;单片机接收转换好的数据,存入指定内存单元,由INT1中断服务程序完成。每次驱动A/D转换后等待外部中断1,中断到来说明A/D转换已经完成,通过中断服务程序读取转换得到的数据。 3.2 火灾判断与报警程序 为了降低误报率,系统采用了多次采集、多次判断的方法。每次数据采集后根据得到的数据对现场情况进行判断:00H表示正常、01H表示异常、02H表示火灾;然后综合多次判断结果做出最终的火情判断。数据在内部RAM存储单元中的存放情况如表1所示。具体判断方法如下: (1)对温度和烟雾进行了两次数据采集与判断 温度≥100℃,温度异常,置标志位为1,否则为0;烟雾(CO,CO2)浓度≥0.06%,烟雾浓度异常,置标志位为1,否则为0。 (2)根据温度和烟雾的异常标志位判断现场情况 2个标志位均为0,表示情况正常,给53H或56H单元送00H;2个中仅有1个为1,表示情况异常,送01H;2个均为1,表示有火灾发生,送02H。 (3)综合两次情况做最后判断,并予以报警 若53H和56H中数据不相同,说明是误报,调故障报警子程序;否则按该单元中的数据调相应的报警子程序。 00H为情况正常,返回。 01H为情况异常,调异常报警子程序。 02H为现场有火灾,调火灾报警子程序,并向消防中心报告火情。 4 结 语 本文研制的用于小型防火单位的语音数字联网火灾报警器具有以下特点: (1)能对室内烟雾(CO2,CO)及温度突变进行报警(声光报警)。 (2)如果出现硬件故障(如传感器遗落、内部元器件损坏等),能发出故障报警。 (3)如果只有一种参数出现异常(如烟雾浓度过大或是温度较高),能发出异常报警信号,令值班人员到现场处理。 (4)如果烟雾和温度同时出现异常,则说明有火灾,发出火灾警报,并及时将火灾信息上报消防指挥中心。 现场模拟实验表明,本系统安全可靠,误报率低。且由于其体积小、 *** 作维护方便、成本低廉等,具有广阔的应用前景。
v
我可以帮助你,你先设置我最佳答案后,我百度Hii教你。你的串号我已经记下,采纳后我会帮你制作

思路:

红灯停,绿灯行,黄灯闪烁提示行人红绿灯即将切换。四个方向各有一个红、黄、绿显示和两个数码管。

东西道为人行道(20秒),南北道为车行道(60秒),黄灯延时最后三秒时,闪烁并切换。

三、硬件电路设计

此电中路设计采用AT89C51单片机,74LS47(数码管驱动)74LS373(数码管驱动输出锁存),8个数码管显示其延时值,四个红、黄、绿指示灯。硬件设计关键在于,延时显示时,要考虑到当个位数字显示时,要确保十位数字显示输出的不变。因此,可加输出锁存器。在延时最后三秒时,要让黄灯进行闪烁,并同时显示数字(这一步在软件设计上很关键)。

四、软件程序(C语言)

以下是整个设计的软件程序,直接可以编译成。Hex代码。通过以上电路,下载到单片机,可直接运行。

////

//程序名:十字路口交通灯控制

//编写人:黄庭剑

//初写时间:2009年1月2日

//程序功能:南北为车行道,延时60秒;东西方向为人行道,延时20秒,且在最后3秒黄灯显示2秒钟再实现切换

//CPU说明:AT89C51型单片机; 24MHZ晶体振荡器

//完成时间:2009年1月6日

////

#include<stdioh>

#include<reg51h>

#include<intrinsh>

sfr p0   = 0x80;

sfr p1   = 0x90;

sfr p2   = 0xA0;

sfr p3   = 0xb0;      //这部分内容其实在“#include<reg51h>”里已经有,但里面定义的必须区分大小写,在这里,因为我程序采用的是小写,reg51h里对各个端口与寄存器的定义都是大写,所以在编译连接时,会报错,所以,在本设计程序里,我只用到了端口,在这里也就只定义了四个,而没有去改reg51h里面的内容。其实两者是一样的。

sbit  sw      = p0^0;

sbit   OE    =P0^6;

sbit   LE    =P0^7;  //74LS373锁存器控制端定义

char  display[]={ 0x00,0x11,0x22,0x33,0x44,0x55,0x66,0x77,0x88,0x99 }; //p1口的数码管时间显示调用,利用74L74BCD码,8位驱动输出;

//函数声明 begin

void  delay1(int count);

void  delay_long(int  number1,int number2);

void    people_car_drive();

//函数声明end

////延时子程序

void  delay1(int  count)

{ int  i;

for(i=count;i>0;i--)

{ ;}

}

void  delay_long(int  number1,int number2)

{

int a,b;

for(a=number1;a>0;a--)

{

for(b=number2;b>0;b--)

{ _nop_();     }

}

}

////延时子程序

void   people_car_drive()

{

int   p_1=2,i,j=9,p_2=6;    ////行人通行时,延时20秒

p2=0x09;                     //南北红灯亮

p3=0x24;                     //东西绿灯亮

while(p_1-->0)

{ LE=1;

OE=0;

if(p_1==0){OE=1;}            //当十位数减到0时,只显示个位数

p1=display[p_1];

delay1(1000);

LE=0;

j=9;

for(i=10;i>0;i--)

{

if(p_1==0&&j==3)break;     //减到3时退出循环,让其黄灯闪烁显示

p1=display[j--];

delay_long(16000,2);

if(sw==1)return;

}

}

////

p2=0x12;                  //南北黄灯闪烁三秒,以提醒行人注意

p3=0x12;

p1=display[3];

delay_long(8000,1);

p2=0x00;

p3=0x00;

delay_long(14000,1);

p2=0x12;

p3=0x12;

p1=display[2];

delay_long(8000,1);

p2=0x00;

p3=0x00;

delay_long(14000,1);

p2=0x12;

p3=0x12;

p1=display[1];

delay_long(8000,1);

p2=0x00;

p3=0x00;

delay_long(14000,1);

//以下是车辆通行时延时60秒//

p2=0x24;                 //南北绿灯亮

p3=0x09;                 //东西红灯亮

while(p_2-->0)

{ LE=1;

OE=0;

if(p_2==0){OE=1;}       //当十位数减到0时,只显示个位数

p1=display[p_2];

delay1(1000);

LE=0;

j=9;

for(i=10;i>0;i--)

{

if(p_2==0&&j==3)break;  //减到2时退出循环

p1=display[j--];

delay_long(16000,2);

if(sw==1)return;

}

}

p2=0x12;                //南北黄灯闪烁三秒,以提醒行人注意

p3=0x12;

p1=display[3];

delay_long(8000,1);

p2=0x00;

p3=0x00;

delay_long(14000,1);

p2=0x12;

p3=0x12;

p1=display[2];

delay_long(8000,1);

p2=0x00;

p3=0x00;

delay_long(14000,1);

p2=0x12;

p3=0x12;

p1=display[1];

delay_long(8000,1);

p2=0x00;

p3=0x00;

delay_long(14000,1);    //南北黄灯闪烁三秒完毕

}

void  main()               //主函数入口处

{

p0=0x01;

p1=0x00;

p2=0x00;

p3=0x00;               //初始化各端口

{ while(1)

{

if(sw==0)

{  people_car_drive();}

else

{

p2=0x00;

p3=0x00;                    //关闭所有交通灯

}

}

}

}

详情访问:>


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/yw/13202932.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-06-20
下一篇 2023-06-20

发表评论

登录后才能评论

评论列表(0条)

保存