版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
第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"http://前十個是(不帶小數點)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
提交評論