还剩24页未读,继续阅读
本资源只提供10页预览,全部文档请下载后查看!喜欢就下载吧,查找使用更方便
文本内容:
题目名称模拟路灯控制系统题)(I方案论证与比较
1.灯驱动的比较与选择LED18A三极管作为LED的驱动,这是因为3DA18A管耗小,功率为1W符合驱动三极管的条件传感器的比较与选择用光敏电阻组成光敏探测器光敏电阻的阻值可以跟随周围环境光线的变化而变化当光线照射到物体上时,光线反射,反射光一般好弱,考虑到试题的要求,因此光敏电阻在晚上对行人的检测将不再起大作用,因此我们考虑其他的方案用RPR220型光电对管RPR220是一种一体化反射型光电探测器,其发射器是一个碎化像红外发光二极管,而接收器是一个高灵敏度,硅平面光电三极管采用RPR220完全可以有效的降低干扰,而且方便可行,能够准确的实施检测RPR220采用DIP4封装,其具有如下特点塑料透镜可以提高灵敏度内置可见光过滤器能减小离散光的影响体积小,结构紧凑且当发光二极管发出的光反射回来时,三极管导通输出低电平显示模块的比较与选择本模拟路灯控制系统中,要求显示时钟和路灯出故障时显示相应的路灯,此时的显示可以用液晶模块1602来显示,或者采用其他的LCD模块来显示,也可以采用数码管来显示,对于这个系统,采用LED作为显示,数码管显示亮度高,由于显示模块只是用来显示一些简单数字,且根据要求所显示数字为清晰可见这就为使用数码管的变成了可能用数码管作为显示模块也能体现性价比,所以我们选择了一个四位一体共阳的数码管作为显示模块测量方法比较和选择传感器的传感距离在可行的范围之内越近越好,我们可以选择接触式测量和非接触式测量,对于该系统,我们选择了非接触是的测量比较接近实际而又符合生活中实际路灯对晚上行人的感触而测量路灯运行的正常状况,我们可以加高电压或者电流让LED灯烧坏,此时CPU发出报警和显示相应烧坏的路灯序号,而一般情况下我们不采取这种做法,在可行的情况的下,我们可以选择截断LED灯一根电源供应线,此时电路的相当于烧坏LED的作用,测量的效果亦可以起到烧坏LED灯的作用,所以我们选择了后者作为LED灯运行状况的测量,硬件设计2return iend+uintl60xFFFF-istart+1;/^9^vY1^I*
1.1^^9^K¥^I*/•、•[、・卜・卜,卜•卜•[•一]、■]、,卜,卜・卜—[、,,、”[、,卜,卜■卜■卜—、|[、・卜,卜―卜,J——[、,卜,卜,卜•卜•卜,.-,[、,卜,卜■卜―卜•、•[、・[、・卜,卜・卜•[、•]、,卜,卜,卜―卜―卜,.、■[、1^1^sl^sl^vl^^1*^J*rj*y***函数名称led_output**输入预显示数据数组首地址**输出无**功能描述led数据准备(数据固定为4个字符)*1*^1#sl^^lx1^S£sl^1^1^*1*g^g^g*K.fK.t^Kl^1**£^KL*K,IKI*1*vlKL*vf^^1*vlKL^K,L*KL^Kl^1*KL*V.I^i*Vl^K1*Kl*A**1*KJ^Kl*1^1*vlKTKl^^i*Vl^KlKI^/q、〃、q、〃、j、〃、rl^*7*^T*〃、[、〃、〃、^T%«、〃、〃、〃、[、〃、*1^*7^^T*〃、〃、〃、力、«、〃、q、〃、/void led_outputuint8*pdat uint8i;for i=0;i4;i++|if pdat[i]=9||pdat[i]==_LED_KC_BLANK leds[i]=pdat[i];〃将需要显示的数据拷贝到显示缓冲区elseleds[i]=_LED_KC_BLANK;/*ifnum==0for i=0;i4;i++if pdat[i]=9||pdat[i]==_LED_KC_BLANK leds[i]=pdat[i];//将需要显示的数据拷贝到显示缓冲区elseleds[i]=_LED_KC_BLANK;elseswitchflag_lcase1:lcds
[0]=pdat
[0];lcds[l]=10;lcds
[2]=10;leds
[3]=10;break;⑵case2:leds
[0]=10;leds[l]=pdat[l];leds=10;leds
[3]=10;break;case3:leds
[0]=pdat
[0];leds[l]=pdat[l];leds
[2]=10;leds
[3]=10;break;/K|■[1*1**.£*、上1**I**I**,1**1*“■1•♦[,7”7“、,””,”,、]”777,•♦],y”7,
7.7*K*.],/rT*rT*7**T*rT^rT^T^TrTrT^^T^TTrTrT^rT^rTT^TwrT^^T^TrT^TTrTrT^rjrT#T^TwrT^rj、*tt£F\!*vtt\.1KT\£K1K1^■1^KI*1*■卜■卜・卜才、-[、•卜.卜•卜・卜.卜,.、.[、•卜.卜.卜―卜.、
1.[、.卜■卜.卜■]、■卜.卜•卜,卜.卜,.、,[、•卜.卜•卜力•■、
1.]、.卜■卜.卜才、.[、・卜・卜•卜.卜.
1、,.、-[、,卜.卜**函数名称led_display**输入无**输出无**功能描述led数据打印(数据固定为4个字符)【即led输出驱动o o]K.fK.t^Kl^1**£^KL*K,IKI*1*vlKL*vf^^1*vlKL^K,L*KL^Kl^1*KL*V.I K1*Kl*A**1*KJ^Kl*1^1*vlKTKl^KlKI^/q、〃、q、〃、j、〃、rl^*7*^T*〃、[、〃、〃、^T%«、〃、〃、〃、[、〃、*1^*7^^T*〃、〃、〃、力、«、〃、q、〃、/void led_displayvoid〃在这里把leds[]里的数据分别显示到4个led上//leds[0]为分钟的十位;leds[l]为分钟的个位//leds[2]为秒的十位;leds[3]为秒的个位//leds[]里的数为0—9时,显示为对应的数字,为_LED_KC_BLANK默认为10时、对应的那一位led段码管不亮uint8i=0;static uint8iled=0;iled=iled+1%4;P0=OxFF;switchiledcase3:Pl_3=0;Pl_2=l;Pl_l=l;Pl0=1;break;case0:Pl_3=l;Pl_2=l;Pl_l=l;Pl_0=0;break;case1:Pl3=1;Pl_2=l;Pl_l=0;Pl_0=l;break;case2:Pl_3=l;Pl_2=0;Pl_l=l;Pl0=1;break;//for i=0;i250;i++;[[]]if iled==1P0=led_zimo ledsiled0x7F;[[]]else P0=led_zimo ledsiled;/*1**1**1**1\£/rT*rT^TrTrT TwrTrj,TTrT«■rTwrT^7Tw^TrT^rj,TTrT q,*t.®*L*IK®**1^*1*KT1^1^*1^K1KY%tf.1**函数名称kb_init**输入无**输出无**功能描述按键初始化■卜・卜,卜•[、•]、.卜•卜•卜•卜,卜,.、■[、,卜•卜•卜•卜•、•[、•[、.卜•卜・卜•[、•]、,卜•卜•卜•卜,卜,,、•[、,卜•卜•卜•卜•[、•]、.[、.卜.卜•卜•[、•[、•卜•卜•卜•[、•卜,,、■[、•卜•卜«X KIK1*1*K1#KV^X KT.t K!K1^£#K1#■卜,;、,[、.卜•卜•卜•卜•[、•
1、・卜・卜•卜,卜•[、•.、.[、,卜•卜,卜•卜■[、•[、•卜・卜•卜•卜•[、•:、,卜.卜•卜,卜•
1、•.、•[、,卜•卜,卜―卜■;、,[、.卜・卜•卜•卜•[、•:、■卜,卜•卜•卜•
1、•,、■
1、sl^sl^^£sl^sl^sl^sl^/,卜,卜■[、q、,;、■[、,]、,卜,]、,j、q、,[、,卜,卜,卜,卜,[、,j、,[、,卜,卜,[、彳、,;、,卜,[、,卜■]、,]、彳、,]、,卜,卜■卜■[、彳、,[、,]、,卜,卜,
1、q、,;、,卜,[、,卜■]、,]、q、,卜,卜,卜/void kb_initvoiduint8i;for i=0;i4;i++[]t_kb i.io_s=0;[]t_kb i.io_n=0;[]t_kb i.kb_s=0;[]t_kb i.kb_chg=0;/1*A*vl**A*^]1*、,[、q.q、,卜.J、q、1^si**1^*1J*、,卜q、^L、«〃、〃
1、*q.*1^1**!«•*4^i*^1*^*L r«wv〃t*、*J rj^、1*q^、£*^^7^L*q、vl«,*£[*K、!q*、1*,*A[*、q.K1*K!sl*1*^1*q、,^L q«、q、*1*^£**£**1*1K!*A*KL**X*K!*1*1*1*A**A**1*1**A*KL**1KJ*1*A*KL**1*1**A**I*1^T**7**7^*j**T***函数名称kb_updata**输入切斑确认键的当前状态,加键当前状态,减键当前状态,模式键当前状态**输出无;**功能描述键盘扫描状态更新按键未按下时为0按键按下时为lo【注意参数顺序别错了,否则相当于按键被交换了】K91*1♦£K|KT£«f\£■£«、£f£#**1♦£KI■£♦£1\£■£■£«t■£■£、£K|K|V|•K|K!K|K|V1K|■£■£q£■£«.t■£■£«•^7rT«•«、[•T[•[••7rT[•7T«•«、[•rT[、[••7rT[•7T«•«、«•[•rT[、rTsl^«£/•卜•卜rj.彳、..、■[、•卜•[、彳、..、■[、•卜•[、J、rj.彳、•;、•卜.卜•卜rj.彳、..、■[、•卜•卜彳、..、■[、•卜•[、J、rj.
4、■;、•卜・卜•卜rj.彳、..、■[、•卜•卜rj.•]、•卜•[、/void kb_updatauint8iok,uint8iadd,uint8isub,uint8imodeuint8i,k,n;n=iok==_KBS_PRESSiadd=_KBS_PRESS«1isub=_KBS_PRESS«2imode=_KBS_PRESS«3for i=0;i4;i++k=nl«i!=0;//获得键盘扫描状态if t_kb[i].io_s!=k〃两次间状态不同,重置累计数据t_kb[i].io_n=1;}else t_kb[i].io_n++;t_kb[i].io_s=k;〃更新当前状态到状态缓存,用于下一次判定时使用ift_kb[i].io_n=_KB_DITHERT〃去抖动ok后,进行实质性判断,否则,保持现状ift_kb[i].io_s=二_KBS_PRESS〃键按下状态ift_kb[i].io_n==_KB_DITHERT〃按键去抖后产生的“按下”动作t_kb[i].kb_s=_KBS_DOWN;t_kb[i].kb_chg=1;else〃键弹起状态,复位状态t_kb[i].kb_s=_KBS_FREE;t_kb[i].io_n=_KB_DITHERT;/Kt/.卜.卜•卜・卜•卜•卜.卜・卜.卜•卜7,•卜•卜rj.q...、■[、•卜•[、q.
4、..、■[、•卜•[、J、rj.q.•;、•卜.卜•卜rj.q...、■[、•卜•卜
4、..、■[、•卜•[、J、rj.
4、■;、•卜・卜•卜rj.彳、..、■[、•卜•卜rj.•]、•卜•[、函数名称kb_getstatus输入无输出当前按键状态功能描述获得按键状态,按键状态按键码放置si*1^^1*uint8kb_getstatusvoiduint8i,r;r=0;for i=0;i4;i++[]〃将按下的按r|=t_kb i.kb_chg==1«i;键状态输出[]t_kb i.kb_chg=0;return r;/—X*-X**1**1*Kt1*Kt*Kt*K£Kt*Kt*KtKt*■!,/rj*rT*rT^rT^T*TrT*T*rT^rT^TTrT*T*TrT^7*T*TrT^rT*^TTrT*Tq.1*K!1^**1**L*KI*f KTK*1K!111K£K£^1^KTK!*f KF**t*•卜,卜•卜•、•、・卜,卜•卜•卜•】、,.、•[、,卜•卜•卜•卜,:、,[、,卜・卜•卜•卜•[、•、,卜・卜•卜•卜,
1、•.、•[、,卜•卜•卜・卜•、•[、,卜・卜•卜•卜•[、•、・卜・卜•卜•卜•
1、•.、■[、•卜•卜tmr_updata函数名称无输入无输出功能描述led数据准备数据固定为4个字符KL**1**.1*KL**t KL*KL*Kt**A*K1**1*KL*K|*1KL*KL**T*K!],■]**1KI*K!K|K!K!*1KI*K|K!*1KL*KI*K|K1K!*1KL**t**.!KJK!*1KI*KL*^Tw rT^rT^*T**T*rT^rj*rT**T*^T*^T**T**T*K|K!\£K£\!K|•■£K|KtK1•1K|K1■£K£\£K|*■£K|xtvfKJtvt11■£K|f*■£、£vt/•卜・卜•卜•]-«•・[、•卜rjglq.,[、・卜■,、[•・卜・卜•卜«•・[、•卜rj,]、q.,[、・卜■]、[••卜・卜•卜«••[、・卜•卜,―/void tmr_updatavoidtmr ms+=TMR TICKTIME;tmr ms2+=TMR TICKTIME;if tmr_ms2=1000〃累计计时超过1秒,进行秒计时器的操作tmr_sec+=_TMR_CHG;//秒计数器更新if tmr_sec=6000tmr_sec=0;〃计时超过100分钟的限制后,强制为0o倒计时时表现为计时的0后停止变化tmr_ms2-=1000;〃毫秒计时器数字更新/\.£7”7,!.£■£Q£K|f vtK|Q£.£Q!*1*\!■!.!*
1、£Ktvt•*
1.£.!1**1\£■£.£«tK|■£/^TrTrx^«、«••«•TT[•[,•7^TrT TT«•[、[•T[•[••7^TrT[•TT«•«、[•T[•[••[•TX**1*L**1^*1*K1K9^•卜•卜rj.彳、..、■[、•卜•[、彳、..、■[、•卜•[、J、rj.彳、•;、•卜.卜•卜rj.彳、..、■[、•卜•卜彳、..、■[、•卜•[、J、rj.
4、■;、•卜・卜•卜rj.彳、..、■[、•卜•卜rj.•]、•卜•[、**函数名称:tmr_isr**输入:无**输出:无**功能描述:定时器中断服务程序执行内容定时器为5ms循环定时按要求给定键盘输入参数把本程序放到5ms的定时器中断服务程序中,^fsl^^9^K1^vl sl^xl^^1K!^9sl^^9^sl^sf vl^^1^^9^^9^sl^xl^xlK1^^g*J^J^^|^|rj^*J*J^^|*j*.|^7,*.!KJvl*KI7,KJ*1^*KIK|KI7,*1^K|V|KL*.|^、],*.tKJvl*KI、[,KIKJKIKIKI^K|V|KJ.],7,KJKX^1*KI^KJ*5^1KIKI/^T**7^^T*T**T»〃、〃、*T^^7«、〃、«、〃、*T*〃、〃、*T^«、〃、«、〃、〃、〃、/void tmr_isrvoid〃计时更新tmr_updata;〃按键状态更新按要求给定键盘输入参数kb_updataP2_l==0,P2_2=0,P2_3=O,P2_4=O;/^1*vlKL^K,tKJKl^1*KI^KL*K|KIKI KL*VI^*..1^KLK,L*KJKl^1*^1*KIKL*K,IKI*1*vlKL**.!^1*vfKL^K,L*Kl^Kl^1*KL*K£/〃、〃、〃、〃、«、〃、〃、〃、〃、q、〃、Y、〃、
1、〃、rj^〃、[、〃、〃、^1%«、〃、〃、〃、*T^^1W7,*;!**1^K1K|KJ K!K!V!KIK|*1K!*1*1*1*X**1*1*1*1*4*1KIK|KJ*1*1*1*4*1*T**TV**函数名称scr_normal**输入按键状态,是否初始化页面[1-初始化]无**输出正常显示模式的页面程序**功能描述*1^*1^Kl^^LKlKl^KI^^1*^1*KL*KL«KIKI^*1*^L*^1KIKI^KlKl^Kl^^1*^1*KL*KK*KIKI^*1*^1*^L*KL*^L*KIKL^*1^^1#,[、,J.[、rj^、〃、[、*7^*1*Y、〃、〃、[、〃、,[、,J、[、rj^^1%、〃、—、*7^*1*
1、〃、〃、[、,[、rj、[、rr^^1*«、、[、—、void scr_normaluint8ikb,uint8bfresh{__、static uintl6scr_auto_tmr=0;〃自动循环显示的计时器,用于页面的定时切换一static uint8iscr=0;〃时间和“1234”显示选择0—显示时间不换屏;1-显示时间换屏;2-显示“1234”换屏uint8i,k;[]uint8tmp4;if bfresh{〃屏幕切换进来时初始化内容scr_auto_tmr二tmr_ms;〃自动页面切换计时器更新iscr=0;〃进入页面时默认显示时间//ifflag_l!=0ifiscr==0iscr=l;if alml||alm2flag_10||alml||alm2flag_7==1iscr==0iscr=1;if!alml||alm2flag_10||alml||alm2flag_7==1iscr=0;if iscr==2//num=1;〃显示“1234”P20=1;tmp
[0]=tmp[l]=tmp
[2]=tmp
[3]=OxOA;switchflag_10case l:tmp
[0]=1;break;case2:tmp
[0]=2;break;ifflag_7==lif almltmp
[0]=1;if alm2if almltmp[l]=2;else tmp
[0]=2;led_outputtmp;//led_outputuint8*leds_gd;//num=lelse//num=0;P2_0=0;〃显示时间,如i=tmr_sec/60;〃分k=tmr_sec%60;//秒tmp
[0]=i/10%10;〃分-十位tmp[l]=i%10;〃分-个位tmp
[2]=k/10;〃秒-十位tmp
[3]=k%10;〃秒-个位led_outputtmp;〃显示当前时间分十秒12:1”显示为1201if iscr!=0{〃自动换屏if expend16uscr_auto_tmr,tmr_ms=_SCR_AUTOTIME{〃自动换屏时间到,切换页面if iscr==1iscr=2;else iscr=1;scr_auto_tmr=tmr_ms;〃自动页面切换计时器更新//ifikb-Oflag!=O ikb=8;//下面为当前页面下,对按键状态的处理switch ikbcase EKB_OK:〃切换键一切换页面到“时间设置”case EKB_ADD://加键一切换页面到“时间设置”case EKB_SUB://减键一切换页面到“时间设置”scr_cur=1;break;case EKB_MODE:〃显示模式切换键-时间”和1234切换〃显示模式切换if iscr!=0iscr=0;else iscr=1;〃模式切换后,自动页面切换计时器更新scr autotmr=tmr ms;break;/7,7,7,7,7,7,7,KL*7,7,7,7,7,7,7,7,*t*K!K!K!K*KI*K!K!*£**L**.1*KL*K!KL*K!*1K|K!K!K*KI*K|*.f*7*7*^Tw*T***函数名称scr_setting按键状态,是否初始化页面[1-初始化]**输入无**输出时间设置模式显示模式的页面程序**功能描述*1**1\£*、!*K1*1**1**1■上K1tvi v,t*1**.1*KL*\£K|7*7,*1*■〜*.t7—7,■£**1**TrTrT^rTw rTT^TTTrTwTw rTrT*rTwT^rT^T^TTTrTwTw*TTrTrT^T^^TrT^T^TTTV9KL»■£K£■£vtKI■£♦£K|KI*♦£q£KTV9KIq£■£q£«1K1KI■£♦£KJvlK£KI*■£■£K¥f\£%t«1«^1*vl«/•卜rjrj*rj*r
1、«、rj、rj rj、,卜”卜g«、,卜rjrj r
1、«、rj、,
1、rj、,卜”卜g«、rj、rjrj*rj*rj*r
1、«、rj、,«•,卜/void scr_settinguint8ikb,uint8bfresh{_static uintl6scr_flash_tmr=0;〃闪烁显示计时器用于焦点闪烁计时一static uint8scr_flash_status=0;〃闪烁状态【0-显示焦点;1-不显示焦点】一static uint8scr_focus=0;〃操作的焦点[-3—表示第一个到第四个led段码管]static uintl6tmr_backup;〃修改的时间参数临口寸缓存区uint8tmp
[4],tmp2
[4];//int8n;if bfresh〃屏幕切换进来时初始化内容//初始化闪烁计时器及闪烁状态scr_flash_tmr=tmr_ms1000_SCR_FLASH_HIDETIME-100;scr_flash_status=0;//操作的焦点初始化scr_focus=0;//修改值初值取当前时间值tmr_backup=tmr_sec;位tmp2
[0]=tmr_backup/60;秒位tmp2[l]=tmr_backup%60;〃位tmp
[0]=tmp2
[0]/10%10;〃分分〃秒个tmp[l]=tmp2
[0]%10;〃十十tmp
[2]=tmp2[l]/10;〃个分tmp
[3]=tmp2[l]%10;〃秒位tmp2
[0]=tmp
[0];//tmp2在数字修改时用tmp2[l]=tmp[l];tmp2
[2]=tmp
[2];tmp2
[3]=tmp
[3];〃确保焦点在有效范围内0—3ifscr_focus=4scr_focus=0;〃将闪标时处于“隐底”状态的数去掉if scr_flash_status==1//“隐藏”对应的数位----Ztmp[scr_focus]=_LED_KC_BLANK;led_outputtmp;〃由新闪烁状态值if scr_flash_status==1//当前闪烁状态为隐藏if expend16uscr_flash_tmr,tmr_ms=_SCR_FLASH_HIDETIME//“隐藏”时间到,切换成“显示”scr_flash_status=0;scr flashtmr=tmr ms;〃更新闪烁计时器为显示〃当前闪烁状态if expend16uscr_flash_tmr,tmr_ms〉=1000-_SCR_FLASH_HIDETIME//“隐藏”时间到,切换成“显示”scr_flash_status=1;scr flashtmr=tmr ms;//更新闪烁计时器//下面为当前页面下,对按键状态的处理switch ikbcase EKB_OK:〃切换/确认键一从数字高位逐个移动修改的焦点,然房保存修改值后退出页面,返回“时间”页面〃移动焦点从分钟的十位到秒的个位scr_focus++;if scr_focus=4{〃所有数位都修改后,退出该页面,切换到“时间”页面tmr_sec=tmr_backup;//保存修改后的时间值scr_cur=0;〃切换到“时间”页面break;case EKB_ADD://加键一将焦点数位加1caseEKB_SUB://减键一将焦点数位减1if ikb==EKB_ADDif scr_focus==2{//scr_focus==2,修改秒的十位,进制为6tmp2[scr_focus]=tmp2[scr_focus]+1%6;else{〃分的十位、个位及秒的个位,进制为10tmp2[scr_focus]=tmp2[scr_focus]+1%;10总体设计模拟路灯控制控制系统有五大板块组成,划分为电源模块,单片机控制模块,传感模块,LED灯驱动模块,报警模块,各个模块并不是相互独立的,而是彼此工作,一旦有一板块停止工作,都会影响其他的模块电源模块输入的220V的交流电,经变压器两降压和相关元件整流,滤波,稳压后输出5V的直流电源输送给各个模块,控制模块是整个电路的核心,它收集来自各个模块的信号,并对信号进行处理发出相应的控制指令,传感模块对环境和路灯下是否有行人进行信号的发射和收集,当传感器检测到环境是晚上,检测到是否有人路过,自动开启和关闭路灯,并对路灯的好坏情况反映给控制模块,让CPU作出相应的处理光电传感光敏电阻感单片机控制器模块应模块电源模块驱动LED模块模拟路灯控制系统总体框架图反射式光电传感器模块设计依题意,“可移动物体M(在物体前端标出定位点,由定位点确定物体位置)由左至右到达S点时(见图2),灯1亮“,可见,要感应物体M的移动,可用红外传感器来感应物体的到来和离去,把物体的移动信息及时的传送至CPU,让CPU作出相应的处理,我们选择了RPR220传感器,因为它具有发射和接收功能,而且管耗小,较灵敏,其工作电压为为5V,光电传感模块原理图如下所不光敏电阻感应模块设计本系统使用的光敏电阻是龙信达科技公司生产的型号为LXD95系列的09的光敏电阻,if scr_focus==2//scr_focus==2,修改秒的十位,进制为6if tmp2[scr_focus]==0tmp2[scr_focus]=5;else tmp2[scr_focus]—;else〃分的十位、个位及秒的个位,进制为1if tmp2[scr_focus]==0tmp2[scr_focus]=9;else tmp2[scr_focus]—;〃将修改后的各个数位组合成新的修改值tmr_backup=uintl6tmp2
[0]*10+tmp2[l]*⑵60+uintl6tmp2*10+tmp2
[3];break;caseEKB_M0DE:〃显示模式切换键-直接切换到“时间”页面scr_cur=0;break;/six/■[、—R-[、..、■卜•卜•[、—门•门―卜q、q、-[、—R-[、J、:、..、-R•卜•[、q、.,、•一,卜q、-[、—R-[、*J、q、才、..、-R•卜•[、q、vl*^1**1*1*^£*^1*vl**X**1**1KL»*1*^£**£**1**A*vl*vt**4^*1*^1**1*^£**£*vL*.[、元、、力、〃、、,卜,卜
一、、,[、〃、[、、〃、、—、〃、[、[、、〃、〃、[、、、rj、、^7^,卜,卜函数名称main输入无输出无功能描述主程序入口KJ^££K£#^97,7,*1^K|KJ7,7,^1K1K|7,7,*J^1*K|K|4!7,K|7,7,^1*K|K1K|7,7,*1*^1*K1K1K|7,*1*7,*-1^K1K|7,/*7^^7^^T%^7^*T*/uint8kb_getstatus2voiduint8i,r;r=0;for i=0;i4;i++r|=t_kb[i].kb_s==1«i;〃将按下的按键状态输出return r;int mainvoid〃添加按键的硬件端口部分初始化程序如果需要的话//添加led段码管相关硬件的初始化程序如果需要的话//注意:需要完成led_display函数,将leds[]数组的数输出到led灯上〃添加定时器初始化程序必须要一个5ms的循环定时器,在定时器的中断服务程序中调用tmr_isr ooo〃注意tmr_isr函数里的“kb_updataO,0,0,0;”处传递的参数用实际的按键状态填充,否则,按键无效〃按键初始化uint8ikb,flag_5=0,flag_0=0;tO_int;kbjnit;P20=0;for;;alml=flag_8;alm2=flag_9;ifnum=100flag_6=0;num=0;TR1=O;ikb=kb_getstatus;//ifflag_l!=0scr_cur=0;if scr_cur==1{//时间设置页面if scr_cur!=scr_curcscr_curc二scr_cur;〃更新页面序号记录scr_settingikb,1;〃页面切换后进入elsescr_curc=scr_cur;〃更新页面序号记录scr_settingikb,0;〃页面未切换if scr_cur!=scr_curc〃正常显示页面scr cure=scr cur;〃更新页面序号记录scr_normalikb,1;〃页面切换后进入scr_curc=scr_cur;〃更新页面序号记录scr_normalikb,0;〃页面未切换//led_display;//led数据输出ifvalue!=tmr_sec iftmr_sec==0flag_2++;ifflag_2==4flag_2=0;ifflag_2%2==0flag_7=0;P30=0;P3_l=0;flag_10=0;flag_0=0;ifflag_2%2==lflag_7=l;P30=1;P3_l=l;flag_0=l;valuc=tmr_scc;ifflag_0==lcontinue;elseifhjJc==0delaymslO;ifhjJc==O P30=0;P3_l=0;//P2_0=0;ifhjjc==ldelaymslO;ifhj_jc=lifP2_5==1P2_6==1P2_7==1flag_6==0||flag_5!=0|P30=0;P3_l=0;}*/ifflag_6==0ifP2_5==0flag_5=l;P3_0=l;P3_l=0;ifflag_9flag_10=l;else flag_10=0;ifP2_7==0{flag_5=2;P3_0=0;;P3_l=lifflag_8flag_10=2;else flag_10=0;switchflag_5case1:ifP2_6==0flag_6=1;flag_5=0;P30=0;P3_l=l;ifflag_8flag_10=2;else flag_10=0;break;case2:ifP2_6==0flag_6=2;flag_5=0;P30=1;P31=0;ifflag_9flag_10=l;else flag_1=0;}break;switchflag_6case1:ifP2_7==0//flag_6=0;P3_0=0;P3」=0;flag_10=0;TR1=1;}break;case2:ifP2_5==0//flag_6=0;P3_0=0;P31=0;flag_10=0;TR1=1;}break;//if flag_8||flag^9flag_10^1||flag_8||flag_9flag_7==1P2_0=1;//else P20=0;return0;灯驱动电路模块设计:LED本设计使用的LED灯为1W的大功率发光二极管,不能使用普通的三极管来做驱动,这是因为普通的三极管功率小,发热量大,极易烧坏,所以必须使用中大功率的三极管来做驱动,我们选择了3DA18A三极管,它的额定功率为1W,最大电压为5V,最大电流为220MA,DIP金属封装,管耗小LED灯驱动电路模块的原理图如下电源模块的设计由于整个系统的正常工作电压是5V,所以我们打算用12V的变压器把220V的交流电降压到12V,然后再通过KBP307进行整流,经过7805稳压到5V,电源模块原理图如下.软件设计3我们选用了AT89S52单片机作为中央处理器,它内部具有4KB的程序存储空间,3个定时、计数器我们采用了C语言编程来控制单片机程序的大致流程图如下图所示程序流程图系统测试
4.测试通过按键的设置,可以任意设置时间,由于是采用四位一体数码管,所以只能显示分钟和秒的时间,虽然不能显小时的时间,但也总算是实现了部分时钟的功能控制整条支路按设好的时间开灯和关灯功能的测试首先我们先通过按键设置好多少时间以后就马上开灯或者关灯,数码管上显示的时间久开始倒计时,一旦达到所设置的时间就马上开灯或者关灯在实验中,我们分别设置了一分钟以后就开灯和关灯,结果从灯的亮灭情况来看确实是达到了要求,因此我们这一步的设计是成功的我们测试这个功能很简单,在白天的情况下,LED灯是处于熄灭的状态,当我们用物体把光敏电阻罩住,阻止光照射到光敏电阻,两个LED灯就马上亮起来,因此我们的这一步的设计是成功的我们用一个当物体经过第一个光电传感器时,灯1亮;当物体经过第二个光电传感器时,灯1灭,灯2亮;当物体经过第三个光电传感器时,灯2灭若物体以相反的次序经过光电传感器,那么灯亮次序与上相反由此我们也实现了这一功能由于灯出现故障,大多数情况是断路,由此我们只要在灯亮的情况下使灯不接入电路就可以人为制造故障了检测显示和报警的功能在具体操作时,我们把1号灯不接入,那么数码管显示数字1,蜂鸣器发出报警声;当我们把2号灯不接入,那么数码管娴熟数字2,蜂鸣器发出报警声总结测试表明,模拟路灯控制系统灯能够实现本次设计的基本要求通过各种方案的讨论及尝试,再经过多次的整体软硬件结合调试,不断地对系统进行优化,才终于把此次设计完成在这次电子竞赛设计中,我们也从中学到了一些有关电子方面的知识,比如大功率LED的驱动,非接触式传感器的工作原理等,同时我们在电路检测这一环节中,也学到了一些检测基本电路故障的方法,比如在光电传感器这一部分电路中,很多次都不能实现传感器的作用,电路不工作正常,单片机无法采样电平,于是我们就在面包板上一个一个元器件的替换,后来才知道每个元器件不同的数值会直接影响传感器的正常工作,通过不断的调试,终于找出了能让传感器正常工作的元器件数值虽然我们这次设计基本上达到了要求,但还有很多的不足,比如在制作PCB板中,没有很好布局与布线,在各个电路模块中,也没有很好考虑到整个控制系统的方便性,由于要用传感器采样,所以就必须要制作多个模块,于是决定采用导线把模块接到单片机并控制各个模块的工作情况,这样就增加了电路的复杂性,同时电路受到的不明干扰性也增大在部分模块电路的硬件测试中,刚开始做面包板试验时,电路连接是对了,但没有实现相应的功能,我们就一直在改电路,甚至想换掉整个模块,经过反复的思考,我们就怀疑芯片是坏的,于是我们就单独检测了芯片的功能,终于发现原来芯片是坏的,由此我们就得到一点经验,那就是在做面包板试验时,要仔细认真检测每个元器件的好坏,哪怕是刚买回来的元器件也可能是坏的还有一个要注意的问题,那就是在调试各个模块的时候要记得仔细检查各个焊点是否短路和虚焊,如果不确定的地方,最好是用万用表检测一下另外,在软件调试时,我们采用先编好一个模块的程序,并实现功能,接着继续编其他模块的程序,一个一个模块功能实现的方式,最后才把各个程序串联起来,经过不断的调试与修改,最后终于能使整个程序正常运行起来,并可以实现各个模块的功能,总体上达到了设计的基本要求由于时间的原因,我们没有把发挥部分做出来,这也是很大的遗憾,因为我们在前阶段元器件的选择和调试中浪费了很多的时间,以至于到最后都没有时间去做发挥的部分,不管怎样,我们还是感到比较欣慰,毕竟是已经很努力去做了参考文献
1.《模拟电子线路基础》,吴运昌著,广州华南理工大学出版社,2004年;
2.《数字电子技术基础》,阎石著,北京高等教育出版社,1997年;
3.《单片机原理及应用》,李建忠著,西安西安电子科技大学,2002年;附录附电路原理图1附源程序2:typedef unsignedchar uint8;/*无符号8位整型变量*/typedef signedchar int8;/*有符号8位整型变量*/typedef unsignedshort uintl6;/*无符号16位整型变量*/typedef signedshort intl6;/*有符号16位整型变量*/sbitPl_0=P1AO;sbitPl1=Pl”sbitPl2=P1八2;sbitPl_3=P1八3;sbitPl_4=P1A4;sbitPl_5=Pl八5;sbitPl_6=P1八6;sbitPl7=P1A7;sbit P2_0=P2A0;sbit P2_l=P2A1;sbit P2_2=P2A2;sbit P23=P2八3;sbit P2_4=P2A4;sbit P2_5=P2八5;sbit P2_6=P2A6;sbit P2_7=P2A7;sbit P30=P3八0;sbit P3_l=P3A1;sbit hj」c=P3A2;sbit P3_3=P3八3;sbit flag_8=P3A4;sbit flag_9=P3A5;//“1234”一固定显示的数,可根据具体情况更改(可改为0—)10const uint8leds_gd
[4]={1,2,10,10;//led显示时用的显示数据缓冲区led段码管上的显示内容就是数组里的内容uint8leds
[4]={0,,0,0};uint8led_zimo[l1]={0xC0,0xF9,Ox A4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,OxFF};按键为4个,定义及键码分别为(不可改,否则按键处理时对不上号)切换/确认键EKB_OK=1,用来切换设置状态和显示状态加键EKB_ADD=2,焦点数字加减健EKB_SUB=4,焦点数字减显示模式切换键EKB,MODE=8“1234”显示#define EKB_OK#define EKB_ADD1#define EKB_SUB1#define EKB_MODE,手动切换时间显示和〃按键信息结构typedef structuint8io_s;1一次状态,更新后为当前状态】2uint8io_n;4ticks个数记录8uint8kb_s;按下;1-按下】uint8kb_chg;0,读清零,1时不产生新的状态仄等待程序处理】〃按键状态【更新前为上}T_KB;〃按键状态宏定义-按键按下〃按键状态连续持续#define_KBS_PRESS〃按键动作宏定义〃当前键盘状态[0-未#define_KBS_FREE〃键盘状态变位标识【11#define_KBS_DOWN(〃按键去抖时间_KB_DITHERT X5ms=去抖时间,可根据实际情况修改数字越大,按键证不戾敏)#define_KB_DITHERT1〃按键状态易存T_KB t_kb
[4];0〃按键未按(//当前页面序号0-正常页面,时间和“1234”切换;1-时间设置页面)uint8scr_cur=0;〃当前页说序号备份(上一次的值,用于判断页面切换)uint8scr_curc=1;//自动换屏的定时常数定义(单位毫秒)一可根据实际情况修改,如需要5秒自动换屏,则改为5000#define_SCR_AUTOTIME3000//闪烁时焦山熄灭的时间定义(单位毫秒;显示时间则为1000-_SCR_FLASH_HIDETIME)#define_SCR_FLASH_HIDETIME300//闪烁时led不显示任何庙(即熄灭)的值的宏定义(在码表里该值表示led灯全灭)【该值可改,但建议别改】#define_LED_KC_BLANK10〃秒计时器(作为当前时间)uintl6value=0,tmr_sec=0;//毫秒计时器(累彳计时,一直累加)uint!6tmr_ms=0;〃毫秒计时7器(进位计时,用于分钟的累计)uintl6tmr_ms2=0;//时间变化:值宏定义(1-时间增加,正计时;-1-时间减小,倒计时,单位秒如果要正计时的话,改成1)uint8flag=0,flag_2=0,alml,alm2,flag_10=0,flag_7=0,flag_6=0,num=0;#define_TMR_CHG-1//定时器超前定时山(固定为5ms,所以需要一个5ms的定时器若你的定时器为10ms的循环定时器,则将其改为10)#define_TMR_TICKTIME5()void tmr_isr void;()void led_display void;()void delaymsuint8valueuint8i=0,j=0;forj=0;jvalue;j++fori=0;i100;i++;void tO_intTMOD=Oxll;TH0=65536-5000»8;TL0=65536-5000;THl=65536-50000»8;TLl=65536-50000;ET1=1;ETO=1;EA=1;TRO=1;void timeOinterrupt1TH0=65536-5000»8;TL0=65536-5000;TFO=O;tmr_isr;led_display;void time1interrupt3THl=65536-50000»8;TL1=65536-50000;TF1=O;num++;/**1*K|K!KIK|■£■£■£1#1*1♦£K1K£■£V9KIKI■£■£KI♦£KJvl\£KTV9KIKI■£«1K17,/^T^TeT^«••TT^rj、«•«••rjT«、«、rTw«•77^«―#T rTrT^rwrj,•TrT«•[•^7TTrT^T r7T、[•T•,.、•;•*A**1*£**1*vl*1*KT*^L«K1KL*K!1^^L«函数名称expend16u输入输起始值,结束值出差值功能描述计算两个数据的线性差值uintl6:用计算•卜・卜q、JJ、..、•[、■卜•[、*J、—J、..、•[、•卜•[、q、JJ、才、,[、•[、•[、-J、,J、,J、..、•[、■卜•[、*J、—J、..、•[、•卜•[、q、JJ、q、■[、•
1、•卜・J、,J、JJ、..、•[、■卜•[、*J、—J、..、•[、•卜■]、值的备份值计算,不会因为值的随即变化而影响计算结果7,7,7,7,7,7,*i*1*K|■!7,7,7,K|KJ7,7,7,*iKJK17,7,*i K|K|7,7,4KI7,7,K1KI7,/*y**7*^T*^T*^T**1^/uintl6expend16uuint16istart,uintl6iendif iend=istartreturn iend-istart;else。
个人认证
优秀文档
获得点赞 0