版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第7章综合训练题7-1.设计彩灯控制器。用单片机控制8个LED按照指定的工作模式流转,并应用数码管显示工作模式和流转的时间间隔。显示格式定义表题7-1所示。表题7-1数码显示格式-1-400流转模式熄灭流转间隔(ms)具体功能要求描述如下:工作模式彩灯控制器按模式1~模式4的顺序依次循环运行。(1)模式1:LED按照L1~L8的顺序,从左向右单循环依次点亮。(2)模式2:LED按照L8~L1的顺序,从右向左单循环依次点亮。(3)模式3:LED按照L1L8、L2L7、L3L6和L4L5的顺序循环点亮。(4)模式4:LED按照L4L5、L3L6、L2L7和L1L8的顺序循环点亮。2.按键功能定义(1)定义按键S5为“启动/停止”键。按下S5后启动或者停止流转。(2)定义按键S4为“设置”键。按下S4可切换选择工作模式和流转间隔时间两个单元,当前被选中的单元以0.8s为间隔闪烁。设置完成后保存参数并退出设置界面。(3)定义S7为“加”按键。在设置页面下,按下S7后,若选择的是工作模式则加1,若选择的是流转间隔则加100ms。注意工作模式的调整范围为1~4,流转间隔的调整范围为400~1200ms。(4)定义S6为“减”按键。在设置页面下,按下S6后,若选择的是工作模式则减1,若选择的是流转间隔则减100ms。注意工作模式的调整范围为1~4,流转间隔的调整范围为400~1200ms。陕西科技大学信工233班张慧墨同学解答include<STC15F2K60S2.h>#include"user.c"#defineSQ0p8s400sbitS7=P3^0;sbitS6=P3^1;sbitS5=P3^2;sbitS4=P3^3;unsignedcharS7buf=0xff,S6buf=0xff,S5buf=0xff,S4buf=0xff;unsignedcharSMGbuf[8]={27,27,27,27,27,27,27,27};unsignedintADC_num;bitstop_flag=1;bitsz_flag=0;bitSQ_wave;unsignedintLED_cnt;unsignedintADC_times;unsignedintSMG_times;unsignedcharmode=1;charnum=1;unsignedcharLED_change_time[5]={1,20,20,20,20};unsignedcharPWM,PWM_level=5;unsignedLEDno=0xff;unsignedcharL_mode=1;unsignedcharLED_times=0;voidLED();voidTimer1_init(){ TMOD&=0x0f; TH1=(65535-2000)/256; TL1=(65536-2000)%256; ET1=1; EA=1; TR1=1;}voidTimer1_isr()interrupt3{ staticunsignedcharSMGno=0xff; staticunsignedintSQ_cnt=0; SMGno++; SMGno&=0x07; if(mode==2&&SQ_wave&&SMGno==1)SMG_drv(SMGno,27); elseif(mode==3&&SQ_wave&&(SMGno==5||SMGno==6||SMGno==7||SMGno==4))SMG_drv(SMGno,27); elseSMG_drv(SMGno,SMGbuf[SMGno]); S7buf=(S7buf<<1)|S7; S6buf=(S6buf<<1)|S6; S5buf=(S5buf<<1)|S5; S4buf=(S4buf<<1)|S4; SQ_cnt++; if(SQ_cnt>=SQ0p8s) { SQ_cnt=0; SQ_wave=~SQ_wave; } if(!stop_flag)LED(); LED_cnt++; SMG_times++; LED_times++;}voidLED_Disp(unsignedchark,bitenable){ staticunsignedchartemp=0x00; staticunsignedchartemp_old=0xff; if(enable) { temp|=0x01<<k; }elsetemp&=~(0x01<<k); if(temp!=temp_old) { P0=~temp; LED_en; ALL_off; temp_old=temp; }}voidsz_show(){ SMGbuf[0]=26; SMGbuf[1]=num; SMGbuf[2]=26; SMGbuf[3]=27; if(LED_change_time[num]*20>999)SMGbuf[4]=LED_change_time[num]*20/1000; elseSMGbuf[4]=27; SMGbuf[5]=LED_change_time[num]*20/100%10; SMGbuf[6]=LED_change_time[num]*20/10%10; SMGbuf[7]=LED_change_time[num]*20%10;}voidSMG_show(){ if(SMG_times<200)return; SMG_times=0; if(sz_flag)sz_show(); else{ SMGbuf[0]=27; SMGbuf[1]=27; SMGbuf[2]=27; SMGbuf[3]=27; SMGbuf[4]=27; SMGbuf[5]=27; SMGbuf[6]=27; SMGbuf[7]=27; }}voidLED_qm(){ unsignedchari; for(i=0;i<8;i++)LED_Disp(i,0);}voidKey_scan(){ if(S5buf==0x00) { stop_flag=~stop_flag; while(S5buf!=0xff); } if(S4buf==0x00) { sz_flag=1; switch(mode) { case1:mode=2;break; case2:mode=3;break; case3:mode=1;sz_flag=0;break; default:break; } while(S4buf!=0xff); } if(S7buf==0x00&&sz_flag) { if(mode==2){num++;if(num==5)num=1;} elseif(LED_change_time[num]*20<1200)LED_change_time[num]+=5; while(S7buf!=0xff); } if(S6buf==0x00&&sz_flag) { if(mode==2){num--;if(num==0)num=4;} elseif(LED_change_time[num]*20>400)LED_change_time[num]-=5; while(S6buf!=0xff); } }voidLED(){ if(LED_times<100)return; LED_times=0; if(num==1) { if(L_mode!=1){L_mode=1;LED_cnt=0;LEDno=0xff;LED_qm();} if(LED_cnt>=LED_change_time[num]*20) { LED_cnt=0; LED_Disp(LEDno,0); LEDno++; LEDno=(LEDno+8)%8; LED_Disp(LEDno,1); } }elseif(num==2) { if(L_mode!=2){L_mode=2;LED_cnt=0;LEDno=0;LED_qm();} if(LED_cnt>=LED_change_time[num]*20) { LED_cnt=0; LED_Disp(LEDno,0); LEDno--; LEDno=(LEDno+8)%8; LED_Disp(LEDno,1); } }elseif(num==3) { if(L_mode!=3){L_mode=3;LED_cnt=0;LEDno=0xff;LED_qm();} if(LED_cnt>=LED_change_time[num]*20) { LED_cnt=0; LED_Disp(7-LEDno,0); LED_Disp(LEDno,0); LEDno++; LEDno=(LEDno+4)%4; LED_Disp(LEDno,1); LED_Disp(7-LEDno,1); } }elseif(num==4) { if(L_mode!=4){L_mode=4;LED_cnt=0;LEDno=4;LED_qm();} if(LED_cnt>=LED_change_time[num]*20) { LED_cnt=0; LED_Disp(7-LEDno,0); LED_Disp(LEDno,0); LEDno--; LEDno=(LEDno+4)%4; LED_Disp(LEDno,1); LED_Disp(7-LEDno,1); } }elseLED_qm();}voidmain(){ BEEP_off(); RELAY_off(); LED_qm(); Timer1_init(); while(1) { Key_scan(); SMG_show(); }}其中“user.c”文件内容为#include"user.h"//前十个是(不带小数点)1~9,随后十个是(带小数点)1~9,其余后面是A~F//0xbf代表“—”26//0xff代表该数码管熄灭//0xc7-28-P;//0x8c-29-L;//0xab-30-n;//0xc1-31-U;//0x89-32-H;unsignedcharcodeSMGcode[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10,0x88,0x80,0xc6,0xc0,0x86,0x8e,0xbf,0xff,0x8c,0xc7,0xab,0xc1,0x89};//*=============初始化外部设备(蜂鸣器,继电器)============*//voidBEEP_on(void){ P0|=0x40; BEEP_en; ALL_off;}voidBEEP_off(void){ P0&=0xBF; BEEP_en; ALL_off;}voidRELAY_on(void){ P0|=0x10; RELAY_en; ALL_off;}voidRELAY_off(void){ P0&=0xEF; RELAY_en; ALL_off;}//*=============1ms延时============*//voidDelay1ms(unsignedintnum){ unsignedintj; while(num--) for(j=0;j<628;j++);}//*=============单个数码管驱动============*//voidSMG_drv(unsignedchark,unsignedcharDIG){ P0=0x01<<k;SMGbit_en; ALL_off; P0=SMGcode[DIG]; SMGseg_en; ALL_off;}//*=============单个LED驱动============*//voidLED_drv(unsignedcharx){ P0=x; LED_en; ALL_off;}而“user.h”文件内容为#defineLED_enP2=P2&0x1F|0x80#defineSMGbit_enP2=P2&0x1F|0xC0#defineSMGseg_enP2=P2&0x1F|0xE0#defineBEEP_enP2=P2&0x1F|0xA0#defineRELAY_enP2=P2&0x1F|0xA0#defineALL_offP2=P2&0x1F#defineucharunsignedchar#defineuintunsignedintucharcodeSMGseg_tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0xbf,0xff};ucharcodeSMGbit_tab[8]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};第9章综合训练题9-2.设计电子钟。具体功能要求如下:初始化过程关闭蜂鸣器,断开继电器,熄灭LED。预设电子钟的初始时间为23时29分50秒。时间显示格式如表题9-1所示。表题9-1电子钟时间显示格式23-59-50时分隔符分分隔符秒按键功能定义(1)定义按键S5为“时间设置”键。按下S5可循环切换选择时、分、秒和返回时间显示。当前被选中的时间单元以1s为周期闪烁,可应用按键S7和S6设置显示时间。设置完成后再按S5返回时间显示。(2)定义按键S4为“闹铃设置”键。按下S4可循环切换选择时、分、秒和返回时间显示。当前被选中的时间单元以1s为周期闪烁,可应用按键S7和S6设置闹铃时间。设置完成后再按S4返回时间显示。预设的闹铃时间初值为0时0分0秒。(3)在时间设置或者闹铃设置状态下,短按S7时加1,长按S7时加10。注意时间单元的边界值。(4)在时间设置或者闹铃设置状态下,短按S6时减1,长按S6时减10。注意时间单元的边界值。3.闹铃提示功能(1)闹铃时间到时,驱动蜂鸣器“响0.5s、停0.5s”提示,持续时间为5s,同时发光二极管L1~L8同步闪烁。(2)在闹铃状态下,按下任意键关闭蜂鸣器并熄灭发光二极管。陕西科技大学信工233班张慧墨同学解答#include<STC15F2K60S2.H>#include"user.c"#definePRESSTIME2000#defineSQ1p0s2000#defineSQ0p5s1000sbitS7=P3^0;sbitS6=P3^1;sbitS5=P3^2;sbitS4=P3^3;unsignedcharS7buf=0xff,S6buf=0xff,S5buf=0xff,S4buf=0xff;unsignedcharSMGbuf[8]={25,27,27,27,27,27,27,27};unsignedintS7_presstime=0,S6_presstime=0;unsignedinttime_hour=23,time_min=59,time_s=50;unsignedintclock_hour=0,clock_min=0,clock_s=0;unsignedintSMG_SQmode=SQ1p0s;unsignedintLED_SQmode=SQ0p5s;bitf_time_hour,f_time_min,f_time_s,f_clock_hour,f_clock_min,f_clock_s;bitflat,S_flat;unsignedcharS5mode=1,S4mode=4;voidTimer1_Init(){ TMOD&=0x0f; TH1=(65536-500)/256; TL1=(65536-500)%256; TR1=1; EA=1; ET1=1;}voidSMG_time(){ SMGbuf[0]=time_hour/10; SMGbuf[1]=time_hour%10; SMGbuf[2]=26; SMGbuf[3]=time_min/10; SMGbuf[4]=time_min%10; SMGbuf[5]=26; SMGbuf[6]=time_s/10; SMGbuf[7]=time_s%10;}voidTimer1_isr()interrupt3{ staticunsignedcharSMGno=0xff; staticunsignedintSMG_SQcnt=0,LED_SQcnt=0; staticunsignedinttime_cnt=0; staticunsignedintss_time=0; bitss=1,BEEP_flat,LED_SQwav,SMG_SQwav; SMG_SQcnt++; if(SMG_SQcnt>=SMG_SQmode)// { SMG_SQcnt=0; SMG_SQwav=~SMG_SQwav; } LED_SQcnt++; if(LED_SQcnt>=LED_SQmode)// { LED_SQcnt=0; LED_SQwav=~LED_SQwav; } if(BEEP_flat&&LED_SQwav) { LED_drv(0x00); } elseLED_drv(0xff); SMGno++; SMGno&=0x07; if(flat==1) { if(f_time_hour||f_clock_hour) { if(SMGno==0||SMGno==1) { if(SMG_SQwav)SMG_drv(SMGno,SMGbuf[SMGno]); }elseSMG_drv(SMGno,SMGbuf[SMGno]); } elseif(f_time_min||f_clock_min) { if(SMGno==3||SMGno==4) { if(SMG_SQwav)SMG_drv(SMGno,SMGbuf[SMGno]); }elseSMG_drv(SMGno,SMGbuf[SMGno]); } elseif(f_time_s||f_clock_s) { if(SMGno==6||SMGno==7) { if(SMG_SQwav)SMG_drv(SMGno,SMGbuf[SMGno]); }elseSMG_drv(SMGno,SMGbuf[SMGno]); } } elseSMG_drv(SMGno,SMGbuf[SMGno]); S7buf=(S7buf<<1)|S7; S6buf=(S6buf<<1)|S6; S5buf=(S5buf<<1)|S5; S4buf=(S4buf<<1)|S4; if(S7buf==0x00)S7_presstime++; if(S6buf==0x00)S6_presstime++; time_cnt++; if(time_cnt==2000) { time_cnt=0; time_s++; if(time_s==60) { time_s=0; time_min++; if(time_min==60) { time_min=0; time_hour++; if(time_hour==24) { time_hour=0; } } } if(S_flat==0)SMG_time(); } if(time_hour==clock_hour&&time_min==clock_min&&time_s==clock_s)BEEP_flat=1; if(BEEP_flat) { ss_time++; if(ss_time%1000==0)ss=~ss; if(ss) { BEEP_on(); RELAY_off(); } else { BEEP_off(); RELAY_off(); } if(ss_time==10000)BEEP_flat=0; }}voidSMG_clock(){ SMGbuf[0]=clock_hour/10; SMGbuf[1]=clock_hour%10; SMGbuf[2]=26; SMGbuf[3]=clock_min/10; SMGbuf[4]=clock_min%10; SMGbuf[5]=26; SMGbuf[6]=clock_s/10; SMGbuf[7]=clock_s%10;}voidKey_scan(){ if(S5buf==0x00) { S_flat=0; SMG_time(); switch(S5mode) { case1:S5mode=2;f_time_hour=1;flat=1;break; case2:S5mode=3;f_time_min=1;f_time_hour=0;break; case3:S5mode=4;f_time_s=1;f_time_min=0;break; case4:S5mode=1;f_time_s=0;flat=0;break; default:break; } while(S5buf!=0xff); } if(S4buf==0x00) { S_flat=1; SMG_clock(); switch(S4mode) { case1:S4mode=2;f_clock_hour=1;flat=1;break; case2:S4mode=3;f_clock_min=1;f_clock_hour=0;break; case3:S4mode=4;f_clock_s=1;f_clock_min=0;break; case4:S4mode=1;f_clock_s=0;flat=0;break; default:break; } while(S4buf!=0xff); } if(S7buf==0xff&&S7_presstime!=0) { if(f_clock_hour==1) { if(S7_presstime>PRESSTIME) { clock_hour+=10; } else { clock_hour++; } clock_hour%=24; SMG_clock(); } else if(f_time_hour==1) { if(S7_presstime>PRESSTIME) { time_hour+=10; } else { time_hour++; } time_hour%=24; SMG_time(); } else if(f_time_min==1) { if(S7_presstime>PRESSTIME) { time_min+=10; } else { time_min++; } time_min%=60; SMG_time(); } else if(f_clock_min==1) { if(S7_presstime>PRESSTIME) { clock_min+=10; } else { clock_min++; } clock_min%=60; SMG_clock(); } else if(f_clock_s==1) { if(S7_presstime>PRESSTIME) { clock_s+=10; } else { clock_s++; } clock_s%=60; SMG_clock(); } else if(f_time_s==1) { if(S7_presstime>PRESSTIME) { time_s+=10; } else { time_s++; } time_s%=60; SMG_time(); } S7_presstime=0; while(S7buf!=0xff); } if(S6buf==0xff&&S6_presstime!=0) { if(f_clock_hour==1) { if(S6_presstime>PRESSTIME) { clock_hour-=10; } else { clock_hour--; } clock_hour=(clock_hour+24)%24; SMG_clock(); } else if(f_time_hour==1) { if(S6_presstime>PRESSTIME) { time_hour-=10; } else { time_hour--; } time_hour=(time_hour+24)%24; SMG_time(); } else if(f_time_min==1) { if(S6_presstime>PRESSTIME) { time_min-=10; } else { time_min--; } time_min=(time_min+60)%60; SMG_time(); } else if(f_clock_min==1) { if(S6_presstime>PRESSTIME) { clock_min-=10; } else { clock_min--; } clock_min=(clock_min+60)%60; SMG_clock(); } else if(f_clock_s==1) { if(S6_presstime>PRESSTIME) { clock_s-=10; } else { clock_s--; } clock_s=(clock_s+60)%60; SMG_clock(); } else if(f_time_s==1) { if(S6_presstime>PRESSTIME) { time_s-=10; } else { time_s--; } time_s=(time_s+60)%60; SMG_time(); } S6_presstime=0; while(S6buf!=0xff); }}voidmain(){ BEEP_off(); RELAY_off(); Timer1_Init(); SMG_time(); LED_drv(0xff); while(1) { Key_scan(); }}第10章综合训练题10-1.设计频率测量及超限报警系统,实时测量NE555多谐振荡器输出的脉冲信号频率。当测量的频率值高于设置的频率上限阈值或者低于设置的频率下限阈值时,驱动蜂鸣器报警,并且驱动LED闪烁提示超限类型。具体功能要求描述如下:数码管显示(1)系统加电后,实时测量NE555输出脉冲序列信号的频率,并用数码管显示频率值。具体显示格式如表题10-1所示,其中“F”为频率提示符,频率值用后5位数码管显示,单位为Hz。当频率值不足5位时,高位数码管熄灭。表题10-1频率测量显示页面F6512提示符熄灭频率:6512Hz(2)定义频率上限阈值参数设置页面如表题10-2所示,其中“P”为参数提示符、“H”为上限阈值参数提示符。上限阈值可以在1000~9900Hz范围内设置,步长为100Hz。题10-2上限阈值参数设置页面PH1200提示符类型熄灭上限阈值:1200Hz(3)定义频率下限阈值参数设置页面如表题10-3所示,其中“P”为参数提示符、“L”为下限阈值参数提示符。下限阈值可以在100~990Hz范围内设置,步长为10Hz。题10-3下限阈值参数设置页面PL230提示符类型熄灭下限阈值:200Hz按键功能描述(1)定义S7为“显示类型切换”键。按下S7,数码管在“频率显示页面”和“参数设置页面”之间切换。(2)在参数设置界面下,定义S6为“参数切换”键。按下S6,数码管在“上限阈值参数设置页面”和“下限阈值参数设置页面”之间切换。(3)定义S5为“加”按键。在上限阈值参数设置页面下,短按S5时上限阈值加100,长按S5时上限阈值加1000;在下限阈值参数设置页面下,短按S5时下限阈值加10,长按S5时下限阈值加100。(4)定义S4为“减”按键。在上限阈值参数设置页面下,短按S5时上限阈值减100,长按S5时上限阈值减1000;在下限阈值参数设置页面下,短按S5时下限阈值减10,长按S5时下限阈值减100。(5)阈值参数调整完成后,按S7返回频率显示页面。报警功能描述在频率显示页面下,用电位器Rb3调整NE555输出脉冲信号的频率值。当测量的频率值高于上限阈值参数时,打开蜂鸣器报警,同时驱动LED以0.2s为周期闪烁,直到测量的频率值小于上限阈值参数。当测量的频率值低于下限阈值参数时,打开蜂鸣器报警,同时驱动LED以2s为周期闪烁,直到测量的频率值小于下限阈值参数。4.性能要求(1)频率测量误差≤±10Hz;(2)按键响应时间≤0.2s;(3)LED响应时间≤0.1s。5.其他要求(1)按键应做好消抖处理,避免出现一次按键动作导致功能多次触发。(2)按键动作不影响数码管显示过程。陕西科技大学信工233班张慧墨同学解答//长按短按//频率计数#include<STC15F2K60S2.H>#include"user.c"#definePRESSTIME2000#defineSQ0p2400#defineSQ2p04000sbitS7=P3^0;sbitS6=P3^1;sbitS5=P3^2;sbitS4=P3^3;unsignedcharS7buf=0xff,S6buf=0xff,S5buf=0xff,S4buf=0xff;unsignedcharS7val=0;unsignedintfren_cnt=0xff,fren_val;unsignedcharSMGbuf[8]={25,27,27,27,27,27,27,27};unsignedinthigh=1200,low=200;unsignedintS5_presstime=0,S4_presstime=0;unsignedintSQ_val_h,SQ_val_l; bitmode=1,mode_hl;bitflat;voidTimer01_Init(){ TMOD=0x06; TH0=0xff; TL0=0xff; TH1=(65536-500)/256; TL1=(65536-500)%256; TR1=1;TR0=1; EA=1; ET1=1;ET0=1;}voidTimer0_isr()interrupt1{ fren_cnt++;}voidfren_val_show(){ SMGbuf[0]=25; SMGbuf[1]=27; SMGbuf[2]=27; if(fren_val>9999)SMGbuf[3]=fren_val/10000; elseSMGbuf[3]=27; if(fren_val>999)SMGbuf[4]=fren_val/1000%10; elseSMGbuf[4]=27; if(fren_val>99)SMGbuf[5]=fren_val/100%10; elseSMGbuf[5]=27; if(fren_val>9)SMGbuf[6]=fren_val/10%10; elseSMGbuf[6]=27; SMGbuf[7]=fren_val%10;}voidTimer1_isr()interrupt3{ staticunsignedcharSMGno=0xff; unsignedintSQcnt_h,SQcnt_l; staticunsignedintcnt=0; SMGno++; SMGno&=0x07; SMG_drv(SMGno,SMGbuf[SMGno]); S7buf=(S7buf<<1)|S7; S6buf=(S6buf<<1)|S6; S5buf=(S5buf<<1)|S5; S4buf=(S4buf<<1)|S4; if(S4buf==0x00)S4_presstime++; if(S5buf==0x00)S5_presstime++; SQcnt_h++; if(SQcnt_h>=SQ0p2) { SQ_val_h=~SQ_val_h; SQcnt_h=0; } SQcnt_l++; if(SQcnt_l>=SQ2p0) { SQ_val_l=~SQ_val_l; SQcnt_l=0; } if(flat) { if(fren_val>high) { BEEP_on(); RELAY_off(); if(SQ_val_h)LED_drv(0x00); elseLED_drv(0xff); } elseif(fren_val<low) { BEEP_on(); RELAY_off(); if(SQ_val_l)LED_drv(0x00); elseLED_drv(0xff); } else { BEEP_off(); RELAY_off(); LED_drv(0xff); } } cnt++; if(cnt==2000) { cnt=0; fren_val=fren_cnt; fren_cnt=0; if(mode==1) { fren_val_show(); flat=1; } }}voidInit(){ fren_val_show();}voidKey_scan(){ if(S7buf==0x00) { mode=~mode; if(mode==0) { if(mode_hl==0) { SMGbuf[0]=28; SMGbuf[1]=31; SMGbuf[2]=27; SMGbuf[3]=27; SMGbuf[4]=high/1000; SMGbuf[5]=high/100%10; SMGbuf[6]=high/10%10; SMGbuf[7]=high%10; } else { SMGbuf[0]=28; SMGbuf[1]=29; SMGbuf[2]=27; SMGbuf[3]=27; SMGbuf[4]=27; SMGbuf[5]=low/100; SMGbuf[6]=low/10%10; SMGbuf[7]=low%10; } }elseif(mode==1) { fren_val_show(); } while(S7buf!=0xff); } if(mode==0&&S6buf==0x00) { mode_hl=~mode_hl; SMGbuf[0]=28; if(!mode_hl) { SMGbuf[1]=31; SMGbuf[2]=27; SMGbuf[3]=27; SMGbuf[4]=high/1000; SMGbuf[5]=high/100%10; SMGbuf[6]=high/10%10; SMGbuf[7]=high%10; } else { SMGbuf[1]=29; SMGbuf[2]=27; SMGbuf[3]=27; SMGbuf[4]=27; SMGbuf[5]=low/100; SMGbuf[6]=low/10%10; SMGbuf[7]=low%10; } while(S6buf!=0xff); } if(mode_hl==0&&mode==0) { if(S5buf==0xff&&S5_presstime!=0) { if(S5_presstime>PRESSTIME) { if(high<=8900)high+=1000; } else { if(high<=9800)high+=100; } SMGbuf[1]=31; SMGbuf[2]=27; SMGbuf[3]=27; SMGbuf[4]=high/1000; SMGbuf[5]=high/100%10; SMGbuf[6]=high/10%10; SMGbuf[7]=high%10; S5_presstime=0; } if(S4buf==0xff&&S4_presstime!=0) { if(S4_presstime>PRESSTIME) { if(high>=2000)high-=1000; } else { if(high>=1100)high-=100; } SMGbuf[1]=31; SMGbuf[2]=27; SMGbuf[3]=27; SMGbuf[4]=high/1000; SMGbuf[5]=high/100%10; SMGbuf[6]=high/10%10; SMGbuf[7]=high%10; S4_presstime=0; } } elseif(mode_hl==1&&mode==0) { if(S5buf==0xff&&S5_presstime!=0) { if(S5_presstime>PRESSTIME) { if(low<=890)low+=100; } else { if(low<=980)low+=10; } SMGbuf[1]=29; SMGbuf[4]=27; SMGbuf[2]=27; SMGbuf[3]=27; SMGbuf[5]=low/100; SMGbuf[6]=low/10%10; SMGbuf[7]=low%10; S5_presstime=0; } if(S4buf==0xff&&S4_presstime!=0) { if(S4_presstime>PRESSTIME) { if(low>=200)low-=100; } else { if(low>=110)low-=10; } SMGbuf[1]=29; SMGbuf[2]=27; SMGbuf[3]=27; SMGbuf[4]=27; SMGbuf[5]=low/100; SMGbuf[6]=low/10%10; SMGbuf[7]=low%10; S4_presstime=0; } }}voidmain(){ BEEP_off(); RELAY_off(); LED_drv(0xff); Timer01_Init(); while(1) { Key_scan(); }}第11章综合训练题11-1.设计模拟风扇控制系统,用按键控制风扇的运行模式和设置定时时间。具体功能要求描述如下:1.运行模式风扇有“睡眠风”、“自然风”和“正常风”三种工作模式,分别用占空比为20%、30%和70%的PWM信号驱动。2.数码管显示数码管以表题11-1所示的格式显示当前的工作模式,并以倒计时方式显示当前剩余的工作时间。剩余工作时间为0时,停止PWM输出。表题11-1风扇控制系统显示格式-1-00-50工作模式分分隔符秒3.按键功能描述(1)定义S4为“工作模式切换”键。每次按下S4后,依次按“睡眠风”、“自然风”和“正常风”的顺序循环切换工作模式。(2)定义S5为“定时时间设置”键。每次按下S5后,定时时间在1、2和3分钟之间依次循环切换。(3)定义S7为“停止”键。按下S7后,将剩余工作时间清0,同时停止PWM输出,直到应用S5重新设置定时时间。4.LED指示驱动L5~L8指示PWM的占空比。同时,仅在“睡眠风”模式时点亮L1;仅在“自然风”模式时点亮L2;仅在“正常风”模式时点亮L3。陕西科技大学信工233班张慧墨同学解答#include<STC15F2K60S2.H>#include"user.c"sbitS4=P3^3;sbitS5=P3^2;sbitS7=P3^0;bitPWM;bitPWMflat=0;unsignedcharSMGbuf[]={26,1,26,0,0,26,0,0};unsignedcharDuty=4;unsignedcharS4buf=0xff,S5buf=0xff,S7buf=0xff;unsignedcharmode=1; unsignedchartime=0;unsignedinttime_m=0,time_s=0;voidTimer0Init(){ TMOD&=0xf0; TH0=(65536-500)/256; TL0=(65536-500)%256; ET0=1; EA=1; TR0=1;}voidTimer0isr()interrupt1{ staticunsignedcharPWMcnt=0; staticunsignedinttime_cnt=0; staticunsignedcharSMGno=0xff; SMGno++; SMGno&=0x07; SMG_drv(SMGno,SMGbuf[SMGno]); if(PWMflat) { PWMcnt++; if(PWMcnt>=20)PWMcnt=0; PWM=(PWMcnt<Duty)?1:0; if(PWM) { if(mode==1)LED_drv(0x0e); if(mode==2)LED_drv(0x0d); if(mode==3)LED_drv(0x0b); } elseLED_drv(0xff); time_cnt++; if(time_cnt==2000) { time_cnt=0; if(time_s>0) { time_s--; } elseif(time_m>0) { time_s=59; time_m--; } else { PWMflat=0; LED_drv(0xff); } SMGbuf[4]=time_m; SMGbuf[6]=time_s/10; SMGbuf[7]=time_s%10; } } S4buf=(S4buf<<1)|S4; S5buf=(S5buf<<1)|S5; S7buf=(S7buf<<1)|S7; }voidkey_chaek(){ if(S4buf==0x00) { switch(mode) { case1:mode=2;LED_drv(0xfd);Duty=6;break; case2:mode=3;LED_drv(0xfb);Duty=14;break; case3:mode=1;LED_drv(0xfe);Duty=4;break; default:mode=1;LED_drv(0xfe);Duty=4; } SMGbuf[1]=mode; while(S4buf!=0xff); } if(S5buf==0x00) { switch(time) { case0:time=1;break; case1:time=2;break; case2:time=3;break; case3:time=1;break; } time_m=time; time_s=0; SMGbuf[4]=time; SMGbuf[6]=0; SMGbuf[7]=0; PWMflat=1; while(S5buf!=0xff); } if(S7buf==0x00) { PWMflat=0; if(mode==1)LED_drv(0xfe); if(mode==2)LED_drv(0xfd); if(mode==3)LED_drv(0xfb); time_m=0; time_s=0; SMGbuf[4]=0; SMGbuf[6]=0; SMGbuf[7]=0; while(S7buf!=0xff); }}voidmain(){ BEEP_off(); RELAY_off(); Timer0Init(); LED_drv(0xfe); while(1) { key_chaek(); }}第12章综合训练题12-2.设计模拟风扇控制系统,通过编程工具STC-ISP中的串口助手发送指令控制风扇的运行模式和设置定时时间。具体的功能要求描述如下:1.运行模式风扇有“睡眠风”、“自然风”和“正常风”三种工作模式,分别用占空比为20%、30%和70%的PWM信号驱动。2.显示格式数码管以表题12-1所示的格式显示当前工作模式,并以倒计时方式显示当前剩余的工作时间。剩余工作时间为0时,停止PWM输出。表题12-1风扇控制系统数码管显示格式-1-0050工作模式熄灭剩余工作时间(分、秒)3.串口功能描述(1)串口助手发送字符串“S4”时切换工作模式。每发送一次“S4”,依次按“睡眠风”、“自然风”和“正常风”的顺序循环切换工作模式。(2)串口助手发送字符串“S5”时用于设置定时时间。每发送一次“S5”,定时时间在1、2和3分钟之间依次循环切换。剩余工作时间为0时,停止PWM输出。(3)串口助手发送字符串“S7”时将剩余工作时间清0,同时停止PWM输出,直到发送字符串“S5”重新设置定时时间。(4)串口助手发送字符“?”时单片机以字符串“SleepMode”、“NaturalMode”或者“NormalMode”反馈当前运行模式。(5)串口助手发送字符“#”时单片机以数字形式反馈当前的剩余时间,例如反馈“0050”表示目前剩余时间为0分50秒。4.LED指示驱动L4~L8指示PWM的占空比。另外,仅在“睡眠风”模式时点亮L1;仅在“自然风”模式时点亮L2;仅在“正常风”模式时点亮L3。陕西科技大学信工233班张慧墨同学解答#include<STC15F2K60S2.H>#include<string.h>#include"user.c"bitPWM;bitPWMflat=0;unsignedcharSMGbuf[]={26,1,26,0,0,26,0,0};unsignedcharDuty=4;unsignedcharS4buf=0xff,S5buf=0xff,S7buf=0xff;unsignedcharmode=1; unsignedchartime=0;unsignedinttime_m=0,time_s=0;unsignedchars_time[4]=0;voidTimer2Init(){ AUXR&=0xFB;//设置T2为定时器,时钟为12T //2ms定时,计算并赋初值 T2H=(65536-500)/256; T2L=(65536-500)%256; IE2|=0x04;//设置比特位ET2=1,允许T2中断 AUXR|=0x10;//设置比特位T2R=1,启动T2}voidUartS1Init(void)//9600bps@12.000MHz{ SCON=0x50;//8位数据,可变波特率 AUXR&=0xBF;//设置定时器T1时钟为12T AUXR&=0xFE;//串口1选择定时器1为波特率发生器 TMOD&=0x0F;//设定T1为16位自动重装方式 TL1=0xE6;//设定定时初值 TH1=0xFF;//设定定时初值 ET1=0;//禁止定时器1中断 TR1=1;//启动定时器1 ES=1;//允许串口中断 EA=1;//开放总中断}voidUART_SendByte(unsignedcharTxData){ SBUF=TxData; while(TI==0); TI=0;}voidUART_SendString(unsignedchar*str){ while(*str!='\0') { UART_SendByte(*str); str++; }} unsignedcharUART_ReceByte(){ RI=0; returnSBUF;}voidTimer2isr()interrupt12{ staticunsignedcharPWMcnt=0; staticunsignedinttime_cnt=0; staticunsignedcharSMGno=0xff; SMGno++; SMGno&=0x07; SMG_drv(SMGno,SMGbuf[SMGno]); if(PWMflat) { PWMcnt++; if(PWMcnt>=20)PWMcnt=0; PWM=(PWMcnt<Duty)?1:0; if(PWM) { if(mode==1)LED_drv(0x0e); if(mode==2)LED_drv(0x0d); if(mode==3)LED_drv(0x0b); } elseLED_drv(0xff); time_cnt++; if(time_cnt==2000) { time_cnt=0; if(time_s>0) { time_s--; } elseif(time_m>0) { time_s=59; time_m--; } else { PWMflat=0; LED_drv(0xff); } SMGbuf[4]=time_m; SMGbuf[6]=time_s/10; SMGbuf[7]=time_s%10; } } }voidUART_recvString(void)interrupt4{ unsignedchari=0; unsignedcharvalue[50]=0; while(RI==1) { value[i]=UART_ReceByte(); Delay_1ms(1); if(value[i]!='\r') { i++; } } if(strncmp(value,"S4",2)==0) { switch(mode) { case1:mode=2;LED_drv(0xfd);Duty=6;break; case2:mode=3;LED_drv(0xfb);Duty=14;break; case3:mode=1;LED_drv(0xfe);Duty=4;break; default:mode=1;LED_drv(0xfe);Duty=4; } SMGbuf[1]=mode; } if(strncmp(value,"S5",2)==0) { switch(time) { case0:time=1;break; case1:time=2;break; case2:time=3;break; case3:time=1;break; } time_m=time; time_s=0; SMGbuf[4]=time; SMGbuf[6]=0; SMGbuf[7]=0; PWMflat=1; } if(strncmp(value,"S7",2)==0) { PWMflat=0; time_m=0; time_s=0; SMGbuf[4]=0; SMGbuf[6]=0; SMGbuf[7]=0; while(strncmp(value,"5",1)==0); } if(strncmp(value,"?",1)==0)//输出不稳定,有时候没有响应 { switch(mode) { case1:UART_SendString("SleepMode\r\n");break; case2:UART_SendString("NaturalMode\r\n");break; case3:UART_SendString("NormalMode\r\n");break; default:UART_SendString("SleepMode\r\n"); } } if(strncmp(value,"#",1)==0) { UART_SendByte(0+'0'); UART_SendByte(SMGbuf[4]+'0'); UART_SendByte(SMGbuf[6]+'0'); UART_SendByte(SMGbuf[7]+'0'); UART_SendString("\r\n"); }}voidmain(){ BEEP_off(); RELAY_off(); Timer2Init(); UartS1Init(); LED_drv(0xfe); while(1) { }}第13章综合训练题13-2.设计距离测量及超限报警系统,应用超声波传感器实时测量障碍物的距离,用数码管完成题目要求的数据显示功能,并通过LED指示灯完成题目要求的输出指示功能。具体要求描述如下:数码管显示(1)系统加电后,应用超声波实时测量障碍物的距离,并用数码管显示距离值,显示格式如表题10-1所示。其中“L”为测距提示符,用3位数码管显示距离数据,单位为cm。测距结果不足3位,高位数码管熄灭。表题10-1启动测量后的显示页面L45提示符熄灭距离:45cm(2)参数设置页面格式如表题10-2所示,其中“P”为参数提示符,上、下限阈值参数分别用2位数码管显示,单位为cm。题10-2参数设置页面格式P5005提示符熄灭上限阈值熄灭下限阈值按键功能描述(1)定义S7为“切换”键。按下S7,数码管在“测距页面”和“参数设置”之间循环切换。(2)在参数设置界面下,定义S6为“参数选择”键。按下S6,循环选择“上限阈值”和“下限阈值”参数。选中的参数以1s为周期闪烁,等待调整。(3)定义S5为“加”按键。短按S5,当前选择的参数值加1;长按S5,当前选择的参数值加10。定义上限阈值参数的最大值为50,长短按阈值时间为1s。(4)定义S4为“减”按键。短按S4,当前选择的参数值减1;长按S4,当前选择的参数值加10。定义下限阈值的最小值为5,长短按阈值为1s。(5)参数调整完成后,按S7返回测距页面。3.报警功能描述当实时测量的障碍物距离大于上限阈值参数时,打开蜂鸣器报警,同时驱动LED以0.2s为周期闪烁,直到测量距离小于上限阈值参数。当实时测量的障碍物距离小于下限阈值参数时,打开蜂鸣器报警,同时驱动LED以2s为周期闪烁,直到测量距离大于下限阈值参数。4.性能要求(1)测距精度要求≤±3cm;(2)按键动作响应时间≤0.2s;(3)指示灯动作响应时间≤0.1s。5.其他要求(1)按键应做好消抖处理,避免出现一次按键动作导致功能多次触发。(2)按键动作不影响数码管显示和数据采集过程。陕西科技大学信工233班张慧墨同学解答/*考点:1.超声波测距的定时器和按键数码管定时器的协调 2.长按和短按 3.数码管闪烁 4.LED闪烁*/#include<STC15F2K60S2.H>#include<intrins.h>//含有需要的汇编指令#include<absacc.h>//含有需要的运算#include"user.c"sbitTX=P1^0;sbitRX=P1^1;sbitS7=P3^0;sbitS6=P3^1;sbitS5=P3^2;sbitS4=P3^3;#definePRESS_TIME500//1S视为长按#defineSQ0p2s100//0.2s周期闪烁#defineSQ0p5s250#defineSQ0p8s400#defineSQ1p0s500#defineSQ2p0s1000unsignedintSMG_SQmode=SQ1p0s;unsignedintLED_SQmode_h=SQ0p2s;unsignedintLED_SQmode_l=SQ2p0s;unsignedcharSMGbuf[8]={25,27,27,27,27,27,27,27};unsignedcharS7buf=0xff,S6buf=0xff,S5buf=0xff,S4buf=0xff;unsignedintdistance=45;unsignedcharpage=1;unsignedcharhl_select=2;bitLED_SQwav_h,SMG_SQwav,LED_SQwav_l;unsignedcharhigh=50,low=5;bitflat;voidDelay12us() { unsignedchari; _nop_(); _nop_(); i=33; while(--i);}voidSend(){ unsignedchari; for(i=0;i<8;i++) { TX=1; Delay12us(); TX=0; Delay12us(); }}voidTimer01_Init(){ TMOD=0x10; TH0=(65536-2000)/256; TL0=(65536-2000)%256; ET0=1; EA=1; TR0=1;}voidTimer0_isr()interrupt1{ staticunsignedintS5press_time=0,S4press_time=0; staticunsignedcharSMGno=0xff; staticunsignedintLED_SQcnt_h=0,LED_SQcnt_l=0,SMG_SQcnt=0; SMG_SQcnt++; if(SMG_SQcnt>=SMG_SQmode)//方波输出控制 { SMG_SQcnt=0; SMG_SQwav=~SMG_SQwav; } SMGno++; SMGno&=0x07; if(flat==1) { if(hl_select==1) { if(SMGno==3||SMGno==4) { if(SMG_SQwav)SMG_
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 滩涂贮灰场岩土工程勘测设计
- 供水泵站现场临时用电方案
- 高速铁路隧道工程监控量测实施方案
- 短视频剪辑实操技能考核手册
- 餐饮连锁运营管理制度
- 幼儿园的教师演讲稿
- 2027届伊春市新青区三上数学期末检测模拟试题含解析
- 2027届安徽省阜阳市太和县倪邱镇数学四年级第一学期期末教学质量检测试题含解析
- 出版重要融资协议
- 2026年上海国际集团公司组织架构和部门职能
- 师德师风考试题库及答案
- 2026天津石油职业技术学院招聘20人模拟试卷带答案详解(新)
- 云南电力技术有限责任公司招聘笔试题库2026
- 2026宁夏国运新能源股份有限公司招聘45人笔试备考试题及答案详解
- 2026江苏镇江市京口区健康路街道办事处编制外城管协管员招聘2人笔试参考题库及答案详解
- 河道综合治理项目建议书
- 2026年广东省公需课《人工智能赋能高质量发展》试题及答案
- GB/T 5973-2026起重机械钢丝绳绳端固接接头
- 列车运行-列车被迫停车后的处理与防护
- 四百字作文格子稿纸(可打印编辑)
- 沪科版八年级物理 (质量)质量与密度教师教学课件
评论
0/150
提交评论