版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
基于单片机课程设计报告2(完整资料)(可以直接使用,可编辑优秀版资料,欢迎下载)
基于单片机课程设计报告2(完整资料)(可以直接使用,可编辑优秀版资料,欢迎下载)单片机课程设计单片机课程设计课题:基于51单片机的交通灯设计专业:ﻩ机械设计制造及其自动化学号:ﻩ指导教师:ﻩ 邵添设计日期: ﻩ2017/12/18成绩:重庆大学城市科技学院电气学院基于51单片机数字温度计设计报告一、设计目的作用本设计是一款简单实用的小型数字温度计,所采用的主要元件有传感器DS18B20,单片机AT89C52,,四位共阴极数码管一个,电容电阻若干.DS18B20支持“一线总线”接口,测量温度范围—55°C~+125°C。在—10~+85°C范围内,精度为±0。5°C。18B20的精度较差,为±2°C本次数字温度计的设计共分为五部分,主控制器,LED显示部分,传感器部分,复位部分,按键设置部分,时钟电路。主控制器即单片机部分,用于存储程序和控制电路;LED显示部分是指四位共阴极数码管,用来显示温度;传感器部分,即温度传感器,用来采集温度,进行温度转换;复位部分,即复位电路,按键部分用来设置上下限报警温度.测量的总过程是,传感器采集到外部环境的温度,并进行转换后传到单片机,经过单片机处理判断后将温度传递到数码管显示。二、设计要求(1)。利用DS18B20传感器实时检测温度并显示。(2).利用数码管实时显示温度.(3).当温度超过或者低于设定值时蜂鸣器报警,LED闪烁指示.(4).能够手动设置上限和下限报警温度。三、设计的具体实现1、系统概述方案一:由于本设计是测温电路,可以使用热敏电阻之类的器件利用其感温效应,在将随被测温度变化的电压或电流采集过来,进行A/D转换后,就可以用单片机进行数据的处理,在显示电路上,就可以将被测温度显示出来,这种设计需要用到A/D转换电路,感温电路比较麻烦.方案设计框图如下:数码管显示电路数码管显示电路热敏电阻组成的感温电路AD转换方案二:考虑到用温度传感器,在单片机电路设计中,大多都是使用传感器,所以这是非常容易想到的,所以可以采用一只温度传感器DS18B20,此传感器,可以很容易直接读取被测温度值,进行转换,就可以满足设计要求.从以上两种方案,很容易看出,采用方案二,电路比较简单,软件设计也比较简单,故采用了方案二。2、
单元电路设计与分析1、硬件设计按照系统设计功能的要求,确定系统由3个模块组成:主控制器、测温电路和显示电路。数字温度计总体电路结构框图所示:蜂鸣器报警模块AT89C51单片机DB18B20温度传感器按键设置模块电源数码管显示LED闪烁报警模块蜂鸣器报警模块AT89C51单片机DB18B20温度传感器按键设置模块电源数码管显示LED闪烁报警模块单片机的选择单片机AT89S52具有低电压供电和体积小等特点,四个端口只需要两个口就能满足电路系统的设计需要,很适合便携手持式产品的设计使用系统可用二节电池供电。由于器件问题,我们使用了通用的手机5V充电器接口。复位电路模块单片机系统的复位电路在这里使用的是上电+按钮的复位电路模式,其中电阻R采用的是10KΩ的阻值,电容采用电容值为10uF的电解电容,电路图如下:温度显示模块四位共阴极数码管,能够显示小数.列扫描用P2.4~P2。7口来实现,列驱动直接51接单片机驱动。电路图如下:ﻩﻩﻩﻩﻩ ﻩﻩﻩﻩﻩﻩﻩ ﻩ ﻩﻩﻩ ﻩ 温度传感器模块DS18B20温度传感器是美国DALLAS半导体公司最新推出的一种改进型智能温度传感器,与传统的热敏电阻等测温元件相比,它能直接读出被测温度,并且可根据实际要求通过简单的编程实现9~12位的数字值读数方式。电路图如下: ﻩ ﻩﻩ ﻩﻩﻩﻩ ﻩ ﻩ ﻩ ﻩ ﻩ ﻩ 按键模块按键是用来设置报警的上下限温。K1是用来进入上下限调节模式的,当按一下K1进入上限调节模式,再按一下进入下限调节模式。在正常模式下,按一下K2进入查看上限温度模式,显示1s左右自动退出;按一下K3进入查看下限温度模式,显示1s左右自动退出;按一下K4消除按键音,再按一下启动按键音.在调节上下限温度模式下,K2是实现加1功能,K1是实现减1功能,K3是用来设定上下限温度正负的。ﻩ 2、软件设计主要包括主程序、读出温度子程序、温度转换命令子程序、计算温度子程序和现实数据刷新子程序等。主程序主程序的主要功能是负责温度的实时显示、读出并处理DS18B20的测量温度值。温度测量每1S进行一次.主流程图如下:读出温度子程序读出温度子程序的主要功能是读出RAM中的9字节。在读出时须进行CRC校验,校验有错时不进行温度数据的改写。流程图如下:温度转换命令子程序温度转换命令子程序主要是发温度转换开始命令。当采用12位分辨率时,转换时间约为750ms。在本程序设计中,采用1s显示程序延时法等待转换的完成.流程图如下:显示数据刷新子程序显示数据刷新子程序主要是对显示缓冲器中的显示数据进行刷新操作,当最高数据显示位为0时,将符号显示位移入下一位。系统的调试及性能分析:硬件调试,首先检查电感的焊接是否正确,然后可用万用表测试或通电检测。软件调试可以先编写显示程序并进行硬件的正确性检验,然后分别进行主程序、读出温度子程序、温度转换命令子程序、计算温度子程序和现实数据刷新子程序等的编程及调试由于DS18B20与单片机采用串行数据传送,因此,对DS18B20进行读/写编程时必须严格地保证读/写时序;否则将无法读取测量结果.本程序采用单片机汇编或C语言编写用KeilC51编译器编程调试。软件调试到能显示温度值,并且在有温度变化时显示温度能改变,就基本完成。性能测试可用制作的温度计和已有的成品温度计同时进行测量比较。由于DS18B20的精度很高,所以误差指标可以限制在0.5℃以内。另外,-55~+125 ﻩﻩﻩﻩ ﻩ ﻩ ﻩ四、总结本次的课程设计使我们进一步巩固了书本上的知识,做到了学以致用.这是我们第二次自己动手设计的电路,通过系统仿真软件Proteus和编译软件Keil,使我们进一步了解了单片机的设计制作过程,其中最为困难的是软件部分,即编程部分,我们上网找了好多资料,虽然经过自己的修改,但还是有很多功能不能实现,如温度上下限设置。由于Proteus并不是很熟练,在使用的过程中有很多原件的名称不知道,从而花费了大量的时间在网上查找,今后应该在这方面多多努力。最后一步的焊接硬件也遇到了不少麻烦。总结经验的时候我们得出这样的结论,学习应该学以致用,有目的的去学习,如果学了不用等于没学.其次,要学以致用,理论联系实际,这样才会取得事半功倍的效果.五、附录附录一:元件清单元件名称数量AT89C51单片机112MHZ晶振133pF电容222uF电解电容1按键开关5IC插座40Pin1DS18B20温度传感器1蜂鸣器1LEDø5红1四位一体共阴数码管1470,1K,4。7K电阻8,2,1三极管85501导线若干排针若干附录二:完整电路原理图附录三:焊接实物图附录四:源程序/*********************************************************************程序名;基于51单片机的温度计*功能:实时测量温度,超过上下限报警,报警温度可手动调整。K1是用来*进入上下限调节模式的,当按一下K1进入上限调节模式,再按一下进入下限*调节模式。在正常模式下,按一下K2进入查看上限温度模式,显示1s左右自动*退出;按一下K3进入查看下限温度模式,显示1s左右自动退出;按一下K4消除*按键音,再按一下启动按键音。在调节上下限温度模式下,K2是实现加1功能,*K1是实现减1功能,K3是用来设定上下限温度正负的。*编程者:彭明闯*编程时间:2014/05/30 ﻩ*********************************************************************/#include<reg52.h〉 ﻩ #include<intrins.h〉ﻩﻩ //将intrins.h头文件包含到主程序(调用其中的_nop_()空操作函数延时)#defineuintunsignedintﻩﻩ#defineucharunsignedchar ﻩucharmax=0x00,min=0x00;ﻩ //max是上限报警温度,min是下限报警温度bits=0; ﻩ ﻩ ﻩ ﻩﻩ//s是调整上下限温度时温度闪烁的标志位,s=0不显示200ms,s=1显示1s左右bits1=0; //s1标志位用于上下限查看时的显示voiddisplay1(uintz);ﻩﻩ //声明display1()函数(display。h头文件中的函数,ds18b20.h要用应先声明)#include”ds18b20.h" ﻩﻩ #include"keyscan.h" ﻩﻩﻩ#include"display。h" ﻩ ﻩ/******************************************************//* ﻩﻩﻩ ﻩﻩﻩ 主函数 ﻩ ﻩ ﻩ ﻩ ﻩ//*****************************************************/voidmain(){ﻩbeer=1; ﻩﻩ //关闭蜂鸣器 led=1; ﻩﻩﻩ //关闭LED灯 timer1_init(0);ﻩ //初始化定时器1(未启动定时器1) get_temperature(1); ﻩ//首次启动DS18B20获取温度(DS18B20上电后自动将EEPROM中的上下限温度复制到TH和TL寄存器) while(1) ﻩ ﻩ { ﻩ keyscan(); ﻩﻩ ﻩﻩget_temperature(0);ﻩﻩﻩdisplay(temp,temp_d*0。625); ﻩalarm();ﻩﻩﻩﻩ }}/*********************************************************************程序名;DS18B20头文件*编程者:彭明闯*编程时间:2014/5/30*说明:用到的全局变量是:无符号字符型变量temp(测得的温度整数部分),temp_d*(测得的温度小数部分),标志位f(测量温度的标志位‘0’表示“正温度"‘1’表*示“负温度"),标志位f_max(上限温度的标志位‘0’表示“正温度”、‘1’表*示“负温度”),标志位f_min(下限温度的标志位‘0’表示“正温度”、‘1'表*示“负温度”),标志位w(报警标志位‘1’启动报警‘0'关闭报警)。 ﻩ*********************************************************************/#ifndef__ds18b20_h__ ﻩﻩﻩ//定义头文件#define__ds18b20_h__#defineuintunsignedintﻩ #defineucharunsignedcharﻩ ﻩsbitDQ=P2^3; ﻩﻩﻩﻩ//DS18B20接口sbitbeer=P1^0;ﻩﻩﻩ ﻩ//用beer表示P1.0sbitled=P1^1; ﻩﻩﻩﻩﻩ //用led表示P1。1uchartemp=0; ﻩﻩ//测量温度的整数部分uchartemp_d=0; //测量温度的小数部分bitf=0;ﻩ //测量温度的标志位,0'表示“正温度"‘1’表示“负温度”)bitf_max=0; ﻩﻩﻩﻩ //上限温度的标志位‘0’表示“正温度”‘1'表示“负温度”)bitf_min=0; //下限温度的标志位‘0’表示“正温度”、‘1’表示“负温度”)bitw=0;ﻩﻩ ﻩ //报警标志位‘1’启动报警‘0’关闭报警/******************************************************//* ﻩ ﻩ ﻩﻩ 延时子函数 ﻩﻩ ﻩﻩﻩﻩﻩ//*****************************************************/voidds18b20_delayus(uintt)//延时几μs{while(t—-);}voidds18b20_delayms(uintt) ﻩ//延时1ms左右{ﻩuinti,j; for(i=t;i〉0;i——)ﻩfor(j=120;j〉0;j--);}/******************************************************//*ﻩ ﻩ DS18B20初始化函数ﻩ ﻩﻩﻩﻩﻩﻩ//*****************************************************/voidds18b20_init()ﻩﻩﻩ {ﻩucharc=0;ﻩDQ=1; DQ=0; ﻩﻩﻩ ﻩ //控制器向DS18B20发低电平脉冲 ds18b20_delayus(80); ﻩ//延时15—80μsﻩDQ=1;ﻩﻩﻩﻩﻩ ﻩﻩ ﻩ//控制器拉高总线, while(DQ); ﻩﻩ ﻩﻩﻩ//等待DS18B20拉低总线,在60—240μs之间 ds18b20_delayus(150);ﻩ //延时,等待上拉电阻拉高总线 DQ=1; ﻩ ﻩﻩﻩﻩ ﻩ//拉高数据线,准备数据传输;}/******************************************************//*ﻩﻩﻩﻩﻩ DS18B20字节读函数ﻩﻩﻩ ﻩ ﻩ//*****************************************************/uchards18b20_read()ﻩﻩﻩ { uchari; uchard=0;ﻩDQ=1;ﻩ ﻩﻩﻩﻩ//准备读; for(i=8;i〉0;i-—) { d>>=1; //低位先发; ﻩDQ=0; ﻩﻩ ﻩﻩ ﻩ _nop_();ﻩﻩ_nop_();ﻩﻩ ﻩﻩDQ=1;ﻩ ﻩﻩﻩﻩ//必须写1,否则读出来的将是不预期的数据; if(DQ)ﻩ ﻩﻩ ﻩ//在12us处读取数据; ﻩd|=0x80; ds18b20_delayus(10);ﻩ ﻩﻩ}ﻩreturnd;ﻩﻩﻩ //返回读取的值}/******************************************************//* ﻩﻩ ﻩ ﻩﻩﻩDS18B20字节写函数 ﻩﻩ ﻩ//*****************************************************/voidds18b20_write(uchard)ﻩ {uchari;for(i=8;i>0;i—-){ DQ=0; ﻩDQ=d&0x01;ﻩﻩds18b20_delayus(5); DQ=1; ﻩﻩd〉>=1;}}/******************************************************//*ﻩ ﻩ ﻩ ﻩ获取温度函数ﻩ ﻩﻩﻩ //*****************************************************/voidget_temperature(bitflag)ﻩ {ﻩuchara=0,b=0,c=0,d=0;uinti; ﻩds18b20_init();ﻩ ﻩﻩ ds18b20_write(0xcc); ﻩ//向DS18B20发跳过读ROM命令ﻩds18b20_write(0x44);ﻩﻩ //写启动DS18B20进行温度转换命令,转换结果存入内部RAM if(flag==1)ﻩ{ﻩ ﻩﻩ //首次启动DS18B20进行温度转换需要500ms,若转换时间不够就出错,读出的是85度的错误值。 display1(1); ﻩ //用开机动画耗时 }ﻩelseﻩds18b20_delayms(1);ﻩ ﻩ ds18b20_init(); ﻩﻩds18b20_write(0xcc);ﻩﻩ ﻩ ds18b20_write(0xbe);ﻩ ﻩ a=ds18b20_read();ﻩ ﻩﻩﻩ//读内部RAM(LSB)ﻩb=ds18b20_read(); ﻩ //读内部RAM(MSB)ﻩif(flag==1)ﻩﻩ ﻩ //局部位变量f=1时读上下线报警温度ﻩ{ max=ds18b20_read();ﻩﻩ//读内部RAM(TH)ﻩmin=ds18b20_read();ﻩﻩ//读内部RAM(Tl)ﻩﻩ } if((max&0x80)==0x80) ﻩ//若读取的上限温度的最高位(符号位)为‘1’表明是负温度ﻩ{f_max=1;max=(max-0x80);}//将上限温度符号标志位置‘1'表示负温度,将上限温度装换成无符号数。 if((min&0x80)==0x80)ﻩﻩﻩ//若读取的下限温度的最高位(符号位)为‘1'表明是负温度 {f_min=1;min=(min—0x80);}//将下限温度符号标志位置‘1’表示负温度,将下限温度装换成无符号数。ﻩ ﻩi=b; i>>=4; if(i==0) {f=0;ﻩ ﻩﻩ//i为0,正温度,设立正温度标记temp=((a>>4)|(b<<4));ﻩﻩ//整数部分ﻩa=(a&0x0f);ﻩtemp_d=a; ﻩﻩﻩ //小数部分 }ﻩelse { f=1;ﻩﻩ ﻩ//i为1,负温度,设立负温度标记 a=~a+1;ﻩb=~b;ﻩtemp=((a>〉4)|(b<〈4));ﻩﻩ ﻩ//整数部分 a=(a&0x0f);ﻩﻩﻩ ﻩ//小数部分ﻩtemp_d=a; }}/******************************************************//*ﻩﻩﻩ ﻩﻩ ﻩﻩ存储极限温度函数ﻩﻩﻩﻩﻩﻩﻩﻩ//*****************************************************/voidstore_t(){ if(f_max==1)ﻩﻩ ﻩ//若上限温度为负,将上限温度转换成有符号数(最高位为1是负,为0是正) max=max+0x80; if(f_min==1) ﻩﻩﻩﻩ//若下限温度为负,将上限温度转换成有符号数 min=min+0x80; ds18b20_init();ﻩﻩ ds18b20_write(0xcc); ﻩ ds18b20_write(0x4e); //向DS18B20发写字节至暂存器2和3(TH和TL)命令 ds18b20_write(max);ﻩﻩﻩ//向暂存器TH(上限温度暂存器)写温度ﻩds18b20_write(min);ﻩﻩﻩ//向暂存器TL(下限温度暂存器)写温度 ds18b20_write(0xff); //向配置寄存器写命令,进行温度值分辨率设置ﻩds18b20_init(); ﻩﻩds18b20_write(0xcc); ﻩﻩds18b20_write(0x48);ﻩ ﻩ//向DS18B20发将RAM中2、3字节的内容写入EEPROM}ﻩ ﻩ //DS18B20上电后会自动将EEPROM中的上下限温度拷贝到TH、TL暂存器/******************************************************//*ﻩ ﻩ ﻩ 温度超限报警函数ﻩﻩ ﻩ ﻩ//*****************************************************/voidalarm(){ﻩ ﻩ ﻩ ﻩﻩ//若上限值是正值 if(f_max==0)ﻩ{ﻩif(f_min==0)ﻩ ﻩ //若下限值是正值ﻩ { ﻩﻩif(f==0) ﻩ ﻩ//若测量值是正值 { ﻩif(temp〈=min||temp>=max)ﻩ ﻩ{w=1;TR1=1;}ﻩﻩ//当测量值小于最小值或大于最大值时报警 ﻩ if((temp<max)&&(temp〉min)) ﻩ {w=0;}ﻩ ﻩ //当测量值大于最小值且小于最大值时不报警 ﻩ }ﻩﻩ if(f==1){w=1;TR1=1;} //若测量值是负值时报警 }ﻩif(f_min==1) ﻩ //若下限值是负值ﻩ { ﻩif(f==0) ﻩﻩ //若测量值是正值ﻩ {ﻩﻩ if(temp>=max)//当测量值大于最大值时报警ﻩ ﻩ{w=1;TR1=1;} ﻩﻩ if(temp<max)//当测量值小于最大值时不报警 ﻩﻩ {w=0;}ﻩ }ﻩﻩ if(f==1) //若测量值是负值 ﻩ {ﻩﻩ if(temp>=min)//当测量值大于最小值时报警ﻩ {w=1;TR1=1;}ﻩﻩﻩ if(temp<min)//当测量值小于最小值时不报警ﻩﻩﻩ {w=0;}ﻩﻩ }ﻩﻩ} }ﻩif(f_max==1)ﻩ //若下限值是负值ﻩ{ﻩif(f_min==1)ﻩ ﻩﻩ//若下限值是负值 ﻩ{ ﻩﻩif(f==1)ﻩﻩﻩﻩ//若测量值是负值 ﻩﻩ{ ﻩ ﻩif((temp〈=max)||(temp〉=min))ﻩ ﻩ {w=1;TR1=1;}ﻩﻩ//当测量值小于最大值或大于最小值时报警 ﻩif((temp〈min)&&(temp>max))ﻩﻩ ﻩ{w=0;}ﻩﻩﻩﻩ//当测量值小于最小值且大于最大值时不报警 } if(f==0){w=1;TR1=1;} //若测量值是正值时报警ﻩ }ﻩ}ﻩ}#endif/***********************************************************************程序名;ds18b20keyscan函数*功能:通过键盘设定设定上下限报警温度*编程者:彭明闯*编程时间:2014/5/30**********************************************************************/#ifndef__keyscan_H__ ﻩ //定义头文件#define__keyscan_H__ sbitkey1=P2^2; ﻩﻩﻩ sbitkey2=P2^1; ﻩﻩﻩ ﻩsbitkey3=P2^0; ﻩﻩﻩ ﻩsbitkey4=P3^3; ﻩ ﻩuchari=0; //定义全局变量i用于不同功能模式的选择,‘0’正常模式,‘1’上限调节模式,‘2’下限调节模式uchara=0; //定义全局变量a用于不同模式下数码管显示的选择bitﻩk4=0; ﻩ ﻩﻩ//K4按键双功能选择位,k4=0时K4按键选择消按键音的功能,k4=1时K4按键选择正负温度设定功能bitv=0;ﻩﻩ ﻩ ﻩ //K2、K3按键双功能选择位,v=0时选择上下限查看功能,v=1时选择上下限温度加减功能bitv1=0; ﻩﻩﻩ ﻩ//v1=1时定时1250ms时间到自动关闭报警上下限查看功能bitv2=0; //消按键音功能调整位,为‘0'时开按键音,为‘1’时关按键音/******************************************************//* ﻩﻩﻩ ﻩﻩﻩ读键盘延时子函数 ﻩ ﻩﻩ ﻩ//*****************************************************/voidkeyscan_delay(uintz)ﻩﻩ //延时1ms左右{uinti,j;for(i=z;i>0;i—-)ﻩfor(j=120;j>0;j--);}/******************************************************//* ﻩ ﻩﻩﻩﻩﻩ ﻩ温度调节函数 ﻩﻩﻩ ﻩﻩ ﻩ//*****************************************************/inttemp_change(intcount,bitf) //上下限温度调整{if(key2==0)ﻩ ﻩ ﻩ//判断K2是否按下 {ﻩ ﻩﻩ ﻩ if(v2==0)beer=0; ﻩﻩ//v2=0开按键音,否则消按键音 ﻩkeyscan_delay(10);ﻩﻩﻩ//延时10msﻩ if(key2==0) ﻩ ﻩ//再次判断K2是否按下(实现按按键时消抖) {ﻩﻩﻩﻩbeer=1;ﻩ ﻩ //K2按下关按键音 if(f==0)ﻩﻩﻩ //若温度为正 {ﻩ count++;ﻩ //每按一下K2温度上调1 ﻩif(a==1){if(count〉125)count=125;}//当温度值大于125时不上调ﻩﻩ if(a==2){if(count>125)count=125;}ﻩﻩ} ﻩif(f!=0) ﻩﻩﻩ //若温度为负 ﻩ{ ﻩﻩ count++; ﻩ //每按一下K2温度下调1 ﻩﻩif(a==1){if(count>55)count=55;}//当温度值小于-55时不再下调 ﻩif(a==2){if(count〉55)count=55;}ﻩ }ﻩ }ﻩ while(key2==0); ﻩ //K2松开按键时消抖ﻩﻩkeyscan_delay(10); ﻩ} if(key3==0) { if(v2==0)beer=0; ﻩkeyscan_delay(10); ﻩif(key3==0) ﻩ ﻩ//K3按按键时消抖 {ﻩ beer=1;ﻩﻩ count——; ﻩﻩ//每按一下K3温度为正时下调1,为负时上调1 if(a==1){if(count<0)count=0;}//当温度值达到0时不再调ﻩ if(a==2){if(count<0)count=0;}ﻩ ﻩ}ﻩﻩwhile(key3==0); ﻩkeyscan_delay(10);ﻩ //K3松开按键时消抖ﻩ } returncount;}/******************************************************//* ﻩ ﻩﻩ ﻩ读键盘函数ﻩ ﻩ ﻩﻩﻩ//*****************************************************/voidkeyscan(){ if(key1==0) {ﻩif(v2==0)beer=0;ﻩﻩkeyscan_delay(10);ﻩ if(key1==0)ﻩﻩﻩﻩ //K1按按键时消抖 {ﻩﻩbeer=1;ﻩ TR1=1; ﻩﻩ //开定时器1,通过s标志位的变化,实现在上下限温度调整时温度显示时闪烁的功能 ﻩﻩk4=1;ﻩﻩﻩ ﻩ//在上下温度调节功能模式下选择K4的调整上下限温度正负的功能 v=1;ﻩ ﻩ //在上下温度调节功能模式下选择K2、K3的温度加减功能 i++;ﻩ ﻩ //K1按一下i加1,i=‘0’进入正常模式,i=‘1'进入调上限模式,i=‘2’进入调下限模式ﻩﻩif(i>2) ﻩ //K1按下三次后退出调节模式 { i=0;ﻩﻩﻩﻩﻩ//进入正常模式 ﻩ TR1=0; //关定时器1ﻩ k4=0; ﻩ //在正常模式下选择K4的消按键音功能 v=0;ﻩ ﻩﻩ//在正常模式下选择K2、K3的查看上下限报警温度功能 ﻩﻩstore_t(); ﻩ //存储调整后的上下限报警温度 ﻩ} ﻩ ﻩswitch(i) //显示选择 ﻩ{ﻩﻩcase0:a=0;break;ﻩ//a=0选择显示测得的温度ﻩ case1:a=1;break;//a=1选择显示上限温度ﻩﻩﻩcase2:a=2;break;//a=2选择显示下限温度ﻩ default:break; ﻩ}ﻩ ﻩ } while(key1==0); ﻩﻩ //K1松按键时消抖ﻩ keyscan_delay(10); ﻩﻩ} if(a==1&&v==1) //a=1选择显示上限温度且v=1时选择上下限温度加功能ﻩ{led=0;max=temp_change(max,f_max);}//显示上限温度 elseif(a==2&&v==1)ﻩﻩﻩ //a=2选择显示下限温度且v=1时选择上下限温度减功能ﻩ{led=1;min=temp_change(min,f_min);} else; if(k4==1) ﻩ ﻩ //k4=1时K4按键选择正负温度设定功能ﻩ{ ﻩif(key4==0)ﻩﻩ{ﻩﻩif(v2==0)beer=0; ﻩﻩkeyscan_delay(5);ﻩ if(key4==0) { beer=1; ﻩﻩif(a==1)ﻩﻩﻩ{if(max〉55)f_max=0;elsef_max=~f_max;}//当温度大于55度时,只能设定为正温度ﻩ ﻩif(a==2) ﻩ{if(min>55)f_max=0;elsef_min=~f_min;}//当温度大于55度时,只能设定为正温度 ﻩﻩ ﻩ ﻩ} while(key4==0); keyscan_delay(10);ﻩﻩ}ﻩ}ﻩﻩif(v==0) ﻩ //v=0时选择上下限查看功能 { ﻩif(key2==0)ﻩ { if(v2==0)beer=0; ﻩkeyscan_delay(10); ﻩif(key2==0)ﻩﻩﻩ{ beer=1; ﻩa=1;ﻩ ﻩﻩ//选择上限显示 ﻩ TR1=1;ﻩﻩ ﻩ//开定时器1开始定时一分钟左右 ﻩs1=1;ﻩ ﻩ//上限显示不闪烁,显示一分钟左右自动退出ﻩﻩ } ﻩﻩwhile(key2==0);ﻩ ﻩkeyscan_delay(10); ﻩﻩﻩ }ﻩ if(key3==0) { if(v2==0)beer=0; ﻩkeyscan_delay(10); if(key3==0)ﻩ { ﻩ beer=1;ﻩ ﻩa=2;ﻩ ﻩ ﻩ//选择下限显示 ﻩTR1=1; ﻩ //开定时器1开始定时1sﻩ ﻩs1=1;ﻩ ﻩ //下限显示不闪烁,显示1s自动退出ﻩ ﻩ }ﻩﻩ while(key3==0); ﻩkeyscan_delay(10); ﻩﻩ }ﻩ if(v1==1)ﻩﻩ ﻩ//v1=1时定时1s时间到自动关闭报警上下限查看功能 ﻩ{a=0;v1=0;TR1=0;} ﻩ//a=0显示实测温度,v1清零,关定时器1 ﻩif(k4==0)ﻩ //k4=0时K4按键选择消按键音的功能ﻩﻩ{ﻩﻩﻩﻩ ﻩﻩﻩ if(key4==0) ﻩ { ﻩﻩif(v2==0)beer=0;ﻩ keyscan_delay(10); ﻩﻩﻩif(key4==0)ﻩ ﻩ{ ﻩﻩﻩbeer=1; ﻩ v2=~v2;ﻩﻩﻩ//为‘0’时开按键音,为‘1'时关按键音 ﻩ ﻩﻩ }ﻩﻩ ﻩwhile(key4==0); ﻩﻩ keyscan_delay(10);ﻩ }ﻩﻩﻩ } }}#endif/***********************************************************************程序名;ds18b20数码管动态显示头文件*功能:通过定时器0延时是数码管动态显示*编程者:彭明闯*编程时间:2014/5/30**********************************************************************/#ifndef__ds18b20_display_H__ ﻩ#define__ds18b20_display_H__#defineuintunsignedintﻩﻩ //变量类型宏定义,用uint表示无符号整形(16位)#defineucharunsignedchar //变量类型宏定义,用uchar表示无符号字符型(8位)sbitwei1=P2^4;ﻩ ﻩﻩﻩ //可位寻址变量定义,用wei1表示P2.4口sbitwei2=P2^5; ﻩ ﻩ //用wei2表示P2.5口sbitwei3=P2^6;ﻩ ﻩﻩ//用wei3表示P2.6口sbitwei4=P2^7; ﻩﻩﻩ//用wei4表示P2.7口ucharnum=0;ﻩ ﻩ ﻩ//定义num为全局无符号字符型变量,赋初值为‘0’ucharcodetemperature1[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};ﻩ//定义显示码表0~9ucharcodetemperature2[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef};ﻩ//带小数点的0~9.ucharcodetemperature3[]={0x00,0x80,0x40,0x76,0x38}; //依次是‘不显示'‘.’‘-’‘H’‘L'/******************************************************//*ﻩﻩ ﻩﻩﻩ ﻩ 延时子函数ﻩ ﻩ ﻩﻩ ﻩ//*****************************************************/voiddisplay_delay(uintt) ﻩ//延时1ms左右{ uinti,j; for(i=t;i>0;i--)ﻩfor(j=120;j>0;j——);}/******************************************************//*ﻩﻩ ﻩ ﻩﻩ 定时器1初始化函数ﻩ ﻩﻩ //*****************************************************/voidtimer1_init(bitt){TMOD=0x10; ﻩ TH0=0x3c; ﻩ ﻩTL0=0xb0; ﻩﻩEA=1;ﻩﻩ ﻩ ﻩﻩET1=1; ﻩﻩ TR1=t;ﻩﻩﻩﻩﻩ //局部变量t为1启动定时器1,为0关闭定时器1}/******************************************************//* ﻩ ﻩ ﻩﻩﻩ定时器1中断函数ﻩﻩﻩﻩ //*****************************************************/voidtimer1()interrupt3{TH0=0x3c;ﻩ ﻩﻩ //重新赋初值,定时50msTL0=0xb0; num++; ﻩ ﻩﻩ //每进入一次定时器中断num加1(每50ms加1一次)if(num〈5)ﻩ{s=1;if(w==1){beer=1;led=1;}else{beer=1;led=1;}} ﻩﻩﻩ ﻩelse ﻩ ﻩﻩ//进入4次中断,定时200ms时若报警标志位w为‘1'则启动报警,不为‘1'不启动 ﻩﻩﻩ ﻩﻩ ﻩ //实现间歇性报警功能 {s=0;if(w==1){beer=0;led=0;}else{beer=1;led=1;}} if(num〉20) ﻩﻩ //进入20次中断,定时1s{ﻩnum=0; ﻩ ﻩ//num归0,重新定开始定时1sﻩs1=0;ﻩ ﻩ ﻩ //定时1s时间到时自动关闭报警上下限显示功能ﻩv1=1;ﻩ ﻩﻩ//定时1s时间到时自动关闭报警上下限查看功能} }/******************************************************//*ﻩ ﻩ ﻩ 调整报警上下限选择函数 ﻩﻩﻩﻩ//*****************************************************/voidselsct_1(ucharf,uchark)ﻩ//消除百位的0显示,及正负温度的显示选择{if(f==0)ﻩ ﻩﻩﻩﻩ ﻩﻩ//若为正温度,百位为0则不显示百位,不为0则显示ﻩ{ﻩ if(k/100==0)P0=temperature3[0]; ﻩelseP0=temperature1[k/100]; } if(f==1) ﻩﻩ//若为负温度,若十位为0,百位不显示,否则百位显示‘-' {ﻩif(k%100/10==0)P0=temperature3[0];ﻩﻩelseP0=temperature3[2];ﻩ}}voidselsct_2(bitf,uchark) ﻩ//消除十位的0显示,及正负温度的显示选择{if(f==0)ﻩﻩﻩ ﻩﻩ //若为正温度,百位十位均为0则不显示十位,否则显示十位 { ﻩif((k/100==0)&&(k%100/10==0)) P0=temperature3[0];ﻩﻩelseP0=temperature1[k%100/10]; } if(f==1) ﻩﻩ ﻩ ﻩﻩ//若为负温度,若十位为0,十位不显示,否则十位显示‘-’ﻩ{ﻩif(k%100/10==0)P0=temperature3[2];ﻩ elseP0=temperature1[k%100/10]; } }/******************************************************//*ﻩ ﻩﻩ ﻩﻩ ﻩ主函数显示ﻩ ﻩﻩ ﻩﻩﻩ //*****************************************************/voiddisplay(uchart,uchart_d)ﻩ//用于实测温度、上限温度的显示{uchari;for(i=0;i〈4;i++)ﻩﻩ //依次从左至右选通数码管显示,实现动态显示{ﻩ switch(i) { case0:ﻩﻩ //选通第一个数码管ﻩ wei2=1; //关第二个数码管ﻩﻩwei3=1; ﻩﻩﻩ//关第三个数码管 wei4=1;ﻩ ﻩﻩ//关第四个数码管 wei1=0;ﻩﻩﻩﻩ//开第一个数码管 ﻩﻩ if(a==0){selsct_1(f,t);}//若a=0则在第一个数码管上显示测量温度的百位或‘-’ ﻩif(a==1)ﻩﻩ{ ﻩP0=temperature3[3];//若a=1则在第一个数码管上显示‘H’ ﻩ}ﻩﻩif(a==2)ﻩ { ﻩ P0=temperature3[4];//若a=2则在第一个数码管上显示‘L’ﻩﻩ}ﻩﻩﻩ ﻩ break; case1: ﻩﻩ //选通第二个数码管 ﻩwei1=1; ﻩ ﻩwei3=1;ﻩﻩwei4=1;ﻩﻩﻩwei2=0;ﻩﻩﻩﻩif(a==0){selsct_2(f,t);}//若a=0则在第二个数码管上显示测量温度的十位或‘-' if(a==1)ﻩﻩﻩ ﻩﻩ //若a=1则在第二个数码管上显示上限报警温度的百位或‘—’ ﻩ{ﻩﻩif(s==0)selsct_1(f_max,max);//若s=0则显示第二个数码管,否则不显示ﻩﻩelseP0=temperature3[0];ﻩﻩ//通过s标志位的变化实现调节上下限报警温度时数码管的闪烁ﻩﻩif(s1==1)selsct_1(f_max,max);//若s1=1则显示第二个数码管(s1标志位用于上下限查看时的显示)ﻩ } ﻩif(a==2) ﻩ ﻩﻩﻩ //若a=2则在第二个数码管上显示下限报警温度的百位或‘-’ﻩ { if(s==0)selsct_1(f_min,min);ﻩﻩelseP0=temperature3[0]; if(s1==1)selsct_1(f_min,min); } ﻩ ﻩﻩ ﻩﻩﻩbreak; case2:ﻩﻩﻩﻩﻩ ﻩﻩﻩ//选通第三个数码管 ﻩwei1=1;ﻩﻩwei2=1; ﻩﻩwei4=1; ﻩ wei3=0; ﻩ if(a==0){P0=temperature2[t%10];}//若a=0则在第三个数码管上显示测量温度的个位ﻩﻩif(a==1)ﻩﻩ ﻩﻩﻩﻩ ﻩ//若a=1则在第三个数码管上显示上限报警温度的十位或‘-’ﻩ {ﻩ if(s==0)selsct_2(f_max,max);//若s=0则显示第三个数码管,否则不显示ﻩ elseP0=temperature3[0];ﻩ ﻩif(s1==1)selsct_2(f_max,max);//若s1=1则显示第三个数码管 ﻩ} if(a==2)ﻩ ﻩﻩ ﻩ ﻩﻩ //若a=2则在第三个数码管上显示下限报警温度的十位或‘-’ﻩ {ﻩ if(s==0)selsct_2(f_min,min);ﻩ ﻩelseP0=temperature3[0]; ﻩ if(s1==1)selsct_2(f_min,min); } ﻩﻩ ﻩﻩﻩﻩﻩ ﻩbreak;ﻩcase3: ﻩﻩ //选通第四个数码管ﻩ wei1=1; ﻩﻩwei2=1; ﻩ wei3=1; ﻩwei4=0; ﻩ ﻩif(a==0){P0=temperature1[t_d];}//若a=0则在第四个数码管上显示测量温度的小数位 ﻩif(a==1)ﻩ ﻩﻩﻩ ﻩ//若a=1则在第四个数码管上显示上限报警温度的个位ﻩﻩ{ﻩﻩif(s==0)P0=temperature1[max%10];//若s=0则显示第四个数码管,否则不显示 ﻩelseP0=temperature3[0]; ﻩif(s1==1)P0=temperature1[max%10];//若s1=1则显示第四个数码管 }ﻩ if(a==2)ﻩ ﻩﻩ ﻩﻩ ﻩ//若a=2则在第四个数码管上显示下限报警温度的个位 ﻩ{ﻩ if(s==0)P0=temperature1[min%10];ﻩ ﻩelseP0=temperature3[0];ﻩ ﻩif(s1==1)P0=temperature1[min%10];ﻩ } ﻩ ﻩﻩﻩﻩ ﻩﻩ ﻩﻩbreak; ﻩﻩ}ﻩdisplay_delay(10);ﻩ ﻩ//每个数码管显示3ms左右 }ﻩ}/******************************************************//* ﻩ ﻩﻩﻩ 开机显示函数ﻩﻩﻩ ﻩ ﻩﻩﻩﻩ//*****************************************************/voiddisplay1(uintz)ﻩﻩ //用于开机动画的显示{uchari,j;bitf=0;for(i=0;i〈z;i++) ﻩ//‘z’是显示遍数的设定{ ﻩ for(j=0;j<4;j++)ﻩﻩ//依次从左至右显示‘-’ﻩ{ switch(j) {ﻩﻩ case0: wei2=1; ﻩwei3=1; ﻩ wei4=1;ﻩ wei1=0;break;ﻩﻩ ﻩP0=temperature3[2];//第一个数码管显示ﻩﻩﻩcase1:ﻩ wei1=1; ﻩ ﻩﻩwei3=1; ﻩﻩwei4=1;ﻩﻩ ﻩwei2=0;break; ﻩﻩ P0=temperature3[2];//第二个数码管显示ﻩﻩﻩcase2:ﻩ wei1=1; ﻩ wei2=1; ﻩﻩwei4=1; ﻩ wei3=0;break; ﻩﻩ P0=temperature3[2];//第三个数码管显示ﻩ ﻩcase3:ﻩﻩ wei1=1; ﻩ wei2=1; ﻩﻩ wei3=1; wei4=0;break;ﻩ ﻩ ﻩP0=temperature3[2];//第四个数码管显示 ﻩ}ﻩ display_delay(400);ﻩ//每个数码管显示200ms左右 }ﻩﻩ }}#endif六、参考文献(1).郭天祥.51单片机c语言教程.电子工业出版社。2009.12(2).李群芳.单片微型计算机与接口技术。电子工业出版社。2012。12摘要近年来,随着科技的飞速发展,单片机的应用正在不断深入,同时带动传统控制检测技术日益更新.在实时检测和自动控制的单片机应用系统中,单片机往往作为一个核心部件来使用,正在不断的应用到实际生活中,并且根据具体硬件结构软硬件结合,加以完善。十字路口车辆穿梭,行人熙攘,车行车道,人行人道,有条不紊.那么靠什么来实现这井然秩序呢?靠的就是交通信号灯的自动指挥系统。交通信号灯控制方式很多。本系统采用MCS-51系列单片机STC89C51为中心器件来设计交通灯控制器,实现了通过信号灯对路面状况的智能控制。从一定程度上解决了交通路口堵塞、车辆停车等待时间不合理、急车强通等问题。系统具有结构简单、可靠性高、成本低、实时性好、安装维护方便等优点,有广泛的应用前景。关键词:交通灯单片机数码管一.总体设计思路1.1设计目的及思路设计目的了解交通灯管理的基本工作原理,熟练掌握STC89C51的工作原理和应用编程,熟悉STC89C51单片机并行接口的各种工作方式和应用,并了解计数器/定时器的工作方式和应用编程外部中断的方法,掌握多位LED显示问题的解决。设计思路(1)分析目前交通路口的基本控制技术,提出自己的交通控制的初步方案.(2)确定系统交通控制的总体设计,增加了倒计时显示提示。(3)进行显示电路.(4)进行软件系统的设计。1.2实际交通灯显示时序及状态转换的理论分析图1所示为红绿灯转换的状态图。S2S1S2S1S4S3S4S3图1红绿灯状态转换图状态S1S2S3S4时间30s5s30s5s东西道红灯亮红灯亮绿灯亮黄灯亮南北道绿灯亮黄灯亮红灯亮红灯亮表1十字路口指示灯燃亮方案说明:(1)当东西方向为红灯,此道车辆禁止通行,东西道行人可通过;南北道为绿灯,此道车辆通过,行人禁止通行。时间为60秒。(2)黄灯闪烁5秒,警示车辆和行人红、绿灯的状态即将切换.(3)当东西方向为绿灯,此道车辆通行;南北方向为红灯,南北道车辆禁止通过,行人通行。时间为80秒.东西方向车流大通行时间长。(4)这样如上表的时间和红、绿、黄出现的顺序依次出现这样行人和车辆就能安全畅通的通行。(5)此表可根据车流量动态设定红绿灯初始值。共四种状态,分别设定为S1、S2、S3、S4,交通灯以这四种状态为一个周期,循环执行如下图所示:图2交通灯状态循环图图2交通灯状态循环图程序就是在上述四种状态下循环转化的。一个周期四个状态,在正常模式下共花费1分10秒。二.具体设计方案2.1方案要求:本设计要求与交通信号实际控制一致,采用LED模拟信号灯,信号灯分东西、南北二组,分别有红、黄、绿三色。其工作状态由程序控制,启动、停止按钮分别控制信号灯的启动与停止。白天/黑夜转换开关可对信号进行控制转换。并且要求能用两位数码管(或者一位数码管)来显示红灯或者绿灯等待的时间,在黄灯的时候数码管不显示。信号灯的控制要求如下:⑴假设东西方向交通繁忙为主干道,车流量为南北交通的两倍.因此东西方向的绿灯通行时间为是南北方向上的两倍。⑵开始时东西方向绿灯先亮,南北为红灯。⑶按下启动按钮开始工作,,按下停止按钮,停止工作.白天/黑夜转换开关闭合时为黑夜工作状态,这时只有黄灯来回闪烁,断开为白天工作状态。白天工作状态要求:东西方向绿灯亮40s,然后黄灯闪三下(1下/秒,共5秒),然后红灯亮20s,而南北方向为红灯亮40s然后绿灯亮20s,然后黄灯也闪三下;如此周期循环下去。示意图2。2方案分析根据十字路口交通灯的要求,可将本系统分为三个模块,第一模块是控制模块,主要负责整个系统的控制和运算,从而使各模块正常工作,第二个模块式显示模块包括LED灯和数码管;第三是电源模块,给各模块提供电源,让各模块工作。其系统设计结构如图:图3.系统设计结构图图3.系统设计结构图2。389C51单片机引脚功能说明89C51外部引脚图:(可以直接拷入ASM程序文件中,作注释使用,十分方便)
┏━┓┏━┓
P1.0
┫1┗┛40┣
Vccﻫ
P1.1
┫2
39┣
P0.0
P1.2
┫3
38┣
P0.1
ﻫ
P1。3
┫4
37┣
P0。2
P1.4
┫5
36┣
P0.3
P1.5
┫6
35┣
P0.4
P1.6
┫7
34┣
P0.5
ﻫ
P1。7
┫8
33┣
P0。6
ﻫ
RST/Vpd
┫9
32┣
P0.7
ﻫ
RXDP3.0
┫10
31┣
—EA/Vpp(内1/外0程序地址选择)ﻫ
TXDP3.1
┫11
30┣
ALE/—P(地址锁存输出)ﻫ-INT0P3.2
┫12
29┣
-PSEN
(外部程序读选通输出)
-INT1P3。3
┫13
28┣
P2。7
ﻫ
T0
P3.4
┫14
27┣
P2。6
T1
P3.5
┫15
26┣
P2.5
—WRP3。6
┫16
25┣
P2。4
ﻫ
-RDP3.7
┫17
24┣
P2。3
ﻫ
X2
┫18
23┣
P2。2
ﻫ
X1
┫19
22┣
P2.1
GND
┫20
21┣
P2.0
ﻫ
┗━━━━┛引脚说明:ﻫ
①电源引脚ﻫ
Vcc(40脚):典型值+5V.
Vss(20脚):接低电平.ﻫ
②外部晶振ﻫ
X1、X2分别与晶体两端相连接。当采用外部时钟信号时,X2接振荡信号,X1接地
③输入输出口引脚:
P0口:I/O双向口。作输入口时,应先软件置“1”。
P1口:I/O双向口。作输入口时,应先软件置“1”。ﻫ
P2口:I/O双向口。作输入口时,应先软件置“1"。
P3口:I/O双向口.作输入口时,应先软件置“1”。
④控制引脚:ﻫ
RST/Vpd、ALE/—PROG、—PSEN、-EA/Vpp组成了MSC-51的控制总线。
RST/Vpd(9脚):复位信号输入端(高电平有效).
第二功能:加+5V备用电源,可以实现掉电保护RAM信息不丢失。ﻫ
ALE/-PROG(30脚):地址锁存信号输出端。
第二功能:编程脉冲输入.ﻫ
—PSEN(29脚):外部程序存储器读选通信号.ﻫ
—EA/Vpp(31脚):外部程序存储器使能端。ﻫ
第二功能:编程电压输入端(+21V).图6.单片机8051的内部结构图6.单片机8051的内部结构2.4单片机最小系统时钟电路图7.时钟电路XTAL1是片内振荡器的反相放大器输入端,XTAL2则是输出端,使用外部振荡器时,外部振荡信号应直接加到XTAL1,而XTAL2悬空.内部方式时,时钟发生器对振荡脉冲二分频,如晶振为12MHz,时钟频率就为6MHz.晶振的频率可以在1MHz-24MHz内选择。电容取30PF左右.系统的时钟电路设计是采用的内部方式,即利用芯片内部的振荡电路。AT89单片机内部有一个用于构成振荡器的高增益反相放大器。引脚XTAL1和XTAL2分别是此放大器的输入端和输出端。这个放大器与作为反馈元件的片外晶体谐振器一起构成一个自激振荡器。外接晶体谐振器以及电容C1和C2构成并联谐振电路,接在放大器的反馈回路中.对外接电容的值虽然没有严格的要求,但电容的大小会影响震荡器频率的高低、震荡器的稳定性、起振的快速性和温度的稳定性。因此,此系统电路的晶体振荡器的值为12MHz,电容应尽可能的选择陶瓷电容,电容值约为22μF.在焊接刷电路板时,晶体振荡器和电容应尽可能安装得与单片机芯片靠近,以减少寄生电容,更好地保证震荡器稳定和可靠地工作。复位电路在振荡器运行时,有两个机器周期(24个振荡周期)以上的高电平出现在此引腿时,将使单片机复位,只要这个脚保持高电平,51芯片便循环复位.复位后P0-P3口均置1引脚表现为高电平,程序计数器和特殊功能寄存器SFR全部清零.当复位脚由高电平变为低电平时,芯片为ROM的00H处开始运行程序.复位是由外部的复位电路来实现的。片内复位电路是复位引脚RST通过一个斯密特触发器与复位电路相连,斯密特触发器用来抑制噪声,它的输出在每个机器周期的S5P2,由复位电路采样一次。复位电路通常采用上电自动复位和按钮复位两种方式,此电路系统采用的是上电与按钮复位电路。当时钟频率选用6MHz时,C取22μF,Rs约为200Ω,Rk约为1K。复位操作不会对内部RAM有所影响.常用的复位电路如下图所示:图8.复位电路图显示电路显示器普遍地用于直观地显示数字系统的运行状态和工作数据,按照材料及产品工艺,单片机应用系统中常用的显示器有:发光二极管LED显示器、液晶LCD显示器、CRT显示器等。LED数码管是现在最常用的显示器之一。发光二极管(LED)由特殊的半导体材料砷化镓、磷砷化镓等制成,可以单独使用,也可以组装成分段式或点阵式LED显示器件(半导体显示器)。分段式显示器(LED数码管)由7条线段围成8字型,每一段包含一个发光二极管。外加正向电压时二极管导通,发出清晰的光。只要按规律控制各发光段亮、灭,就可以显示各种字形或号。LED数码管有共阳、共阴之分。本系统采用的是两位共阴极数码管三.电路图和程序图10.交通灯电路图具体程序:#include<REG51.H>#defineucharunsignedchar#defineuintunsignedintuintnum,shi,ge;sbitred=P1^0;sbityel=P1^1;sbitgre=P1^2;ﻩ voiddelay(){uinta;for(a=500;a〉0;a-—);ﻩ }ucharcodearry_duan[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};voidinitial(){EA=1;ET0=1;TMOD=0x01;TH0=0x4c;TL0=0xd0;}voiddisplay(intY){shi=Y/10;ge=Y%10;TR0=1;while(shi|ge!=0){P2=0xfe;P3=arry_duan[shi];delay();P2=0xfd;P3=ﻩarry_duan[ge];delay();}TR0=0;}voidtimer0()interrupt1{TH0=0x4c;TL0=0xd0;num++;if(num==20){num=0;ge-—;if(ge==-1){ge=9;shi—-;}}}main(){initial();while(1){red=0;yel=0;gre=1;display(40);red=0;yel=1;gre=0;display(3);red=1;yel=0;gre=0;display(20);red=0;yel=1;gre=0;display(3);}}程序编译和。hex文件创建截图仿真截图四.实验心得体会通过本次试验我复习了单片机程序的编写,电路的连接以及程序的调试仿真,更加深刻的感受到了单片机的强大功能,通过实验也加强了动手操作的能力,和同学一起更加懂得了相互合作的重要性,以后我会更加努力的把本专业知识学好学精,争取为国家做到属于自己应做的奉献。五.课程设计参考资料1.《电子系统综合设计》郭勇北京大学出版社2.《数字电子技术基础》阎石高教出版社3.《模拟电子技术基础》童诗白高教出版社4.《单片机原理及应用》张毅刚高等教育出版社单片机原理及系统课程设计评语:考勤10分守纪10分过程30分设计报告30分答辩20分总成绩(100)专业:自动化班级:姓名:学号:指导教师:兰州交通大学自动化与电气工程学院2015年12月30日基于单片机的16键电子琴一、电子琴设计的目的、要求与设计方法1.1设计目的现代乐器中,电子琴是高新科技在音乐领域的一个代表,体现了人类电子技术和艺术的完美结合。电子琴自动伴奏的稳定性、准确性,以及鲜明的强弱规律、随人设置的速度要求,都更便于人们由易到难、深入浅出的准确掌握歌曲节奏和乐曲风格,对其节奏的稳定性和准确性训练能起到非常大的作用.1.2设计要求本设计主要是用AT89C52单片机为核心控制元件,设计一个微缩版的电子琴。单片机与按键构成主控制模块,在主控制模块上设置有9个按键,分别达成不同目标。本系统主要为了完成电子琴的三大功能:电子琴弹奏和音乐播放及录音。1。3电子琴设计方法1.3。1设计工具表1软件简介软件名称设计作用KeiluVision4编写程序与编译PROTEUS绘制硬件电路图、数字仿真MicrosoftVisio绘制程序流图与框图1。3.2设计思路(1)功能按键触发外部中断,以完成不同曲目的的切换。(2)设置定时器产生不同频率的方波,I/O口输出,经功放后扬声器发声.(3)采用4×4矩阵键盘弹奏16个音(低XI到高DO).电子琴的设计方案及原理2.1设计总体方案本系统采用AT89C52为主控芯片.输入电路有16个琴键按键,通过按键随意按下所要表达的音符,作为电平送给主体电路,中央处理器通过识别,解码输出音符,在扬声器中发出有效的声音。1个音乐按键用于播放音乐和切换歌曲,通过按键触发中断,重置定时器初值,于另一个扬声器中发出有效音响.总设计框图如下图1所示.单单片机时钟复位电路时钟复位电路数码管显示电路数码管显示电路琴键控制电路琴键控制电路音频播放电路音频播放电路音乐切换电路音乐切换电路图1基于单片机的电子琴电路原理框图2。2发声原理利用AT89C52的内部定时器使其工作计数器模式(MODE1)下,改变计数值TH0及TL0以产生不同频率的方法产生不同音阶,例如,频率为523Hz,其周期T=1/523=1912μs,因此只要令计数器计时956μs/1μs=956,每计数956次时将I/O反相,就可得到中音DO
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025-2026学年热能教学设计
- 2026湖北华中师范大学国家数字化学习工程技术研究中心合同聘用制人员招聘5人笔试题库(能力提升)附答案详解
- 关于2026年前半年产品交付的催办函8篇范本
- 暴雨紧急防洪社区生活预案
- 2026浙江台州市海核新能源发展有限公司第一批招聘1人参考题库(A卷)附答案详解
- 广东省月考试卷及答案
- 观刈麦中考考题及答案
- 关于三视图的考题及答案
- 2026新疆农垦科学院第二批引进高层次人才15人模拟试卷含答案详解(培优)
- 2026年山东省济宁市鱼台县五下数学期末预测试题含答案含解析
- 输电线路大开挖基础施工方案
- 截肢手术配合
- 2024继电保护作业指导书
- 2023年中国国家话剧院招聘事业单位考试真题
- 劳务派遣投标方案(技术方案)
- 多孔功能陶瓷制备与应用
- 5G工程师理论练习测试卷
- 产品责任保险保单
- (完整word版)北京市住院医师规范化培训线上课程答案全科医学题库
- 浮法玻璃退火工艺演示文稿
- 宠物美容培训课件
评论
0/150
提交评论