版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
51單片機仿真100實例51單片機仿真100實例51單片機仿真100實例.?單片機C語言程序設計實訓100例—鑒于8051+Proteus仿真?事例第01篇基礎程序設計閃耀的LED/*名稱:閃耀的LED說明:LED按設定的時間間隔閃耀*/#include<reg51.h>#defineucharunsignedchar#defineuintunsignedintsbitLED=P1^0;延時voidDelayMS(uintx){uchari;while(x--){for(i=0;i<120;i++);}}主程序voidmain(){while(1){LED=~LED;DelayMS(150);}}從左到右的流水燈/*名稱:從左到右的流水燈說明:接在P0口的8個LED從左到右循環(huán)挨次點亮,產生走馬燈見效*/#include<reg51.h>#include<intrins.h>#defineucharunsignedchar#defineuintunsignedint延時1/76.voidDelayMS(uintx){uchari;while(x--){for(i=0;i<120;i++);}}主程序voidmain(){P0=0xfe;while(1){P0=_crol_(P0,1);//P0的值向左循環(huán)挪動DelayMS(150);}}8只LED左右往返點亮/*名稱:8只LED左右往返點亮說明:程序利用循環(huán)移位函數(shù)_crol_和_cror_形成來展轉動的見效*/#include<reg51.h>#include<intrins.h>#defineucharunsignedchar#defineuintunsignedint延時voidDelayMS(uintx){uchari;while(x--){for(i=0;i<120;i++);}}主程序voidmain(){uchari;P2=0x01;while(1){for(i=0;i<7;i++){2/76.P2=_crol_(P2,1);//P2的值向左循環(huán)挪動DelayMS(150);}for(i=0;i<7;i++){P2=_cror_(P2,1);//P2的值向右循環(huán)挪動DelayMS(150);}}}花招流水燈/*名稱:花招流水燈說明:16只LED分兩組按預設的多種花招變換顯示*/#include<reg51.h>#defineucharunsignedchar#defineuintunsignedintucharcodePattern_P0[]={0xfc,0xf9,0xf3,0xe7,0xcf,0x9f,0x3f,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xe7,0xdb,0xbd,0x7e,0xbd,0xdb,0xe7,0xff,0xe7,0xc3,0x81,0x00,0x81,0xc3,0xe7,0xff,0xaa,0x55,0x18,0xff,0xf0,0x0f,0x00,0xff,0xf8,0xf1,0xe3,0xc7,0x8f,0x1f,0x3f,0x7f,0x7f,0x3f,0x1f,0x8f,0xc7,0xe3,0xf1,0xf8,0xff,0x00,0x00,0xff,0xff,0x0f,0xf0,0xff,0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe,0xfe,0xfc,0xf8,0xf0,0xe0,0xc0,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xc0,0xe0,0xf0,0xf8,0xfc,0xfe,0x00,0xff,0x00,0xff,0x00,0xff,0x00,0xff};ucharcodePattern_P2[]={0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0xfc,0xf9,0xf3,0xe7,0xcf,0x9f,0x3f,0xff,0xe7,0xdb,0xbd,0x7e,0xbd,0xdb,0xe7,0xff,0xe7,0xc3,0x81,0x00,0x81,0xc3,0xe7,0xff,0xaa,0x55,0x18,0xff,0xf0,0x0f,0x00,0xff,0xf8,0xf1,0xe3,0xc7,0x8f,0x1f,0x3f,0x7f,0x7f,0x3f,0x1f,0x8f,0xc7,0xe3,0xf1,0xf8,0xff,0x00,0x00,0xff,0xff,0x0f,0xf0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f,0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0xfc,0xf8,0xf0,0xe0,0xc0,0x80,0x00,0x00,0x80,0xc0,0xe0,0xf0,0xf8,0xfc,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0xff,0x00,0xff,0x00,0xff,0x00,0xff};延時3/76.voidDelayMS(uintx){uchari;while(x--){for(i=0;i<120;i++);}}//主程序voidmain(){uchari;while(1){
//從數(shù)組中讀取數(shù)據(jù)送至for(i=0;i<136;i++){
P0和P2口顯示P0=Pattern_P0[i];P2=Pattern_P2[i];DelayMS(100);}}}LED模擬交通燈/*名稱:LED模擬交通燈說明:東西向綠燈亮假定干秒,黃燈閃耀5次后紅燈亮,紅燈亮后,南北向由紅燈變?yōu)榫G燈,假定干秒后南北向黃燈閃耀5今后變紅燈,東西向變綠燈,這樣重復。*/#include<reg51.h>#defineucharunsignedchar#defineuintunsignedintsbitRED_A=P0^0;//東西向燈sbitYELLOW_A=P0^1;sbitGREEN_A=P0^2;sbitRED_B=P0^3;//南北向燈sbitYELLOW_B=P0^4;sbitGREEN_B=P0^5;ucharFlash_Count=0,Operation_Type=1;//閃耀次數(shù),操作種類變量延時voidDelayMS(uintx){uchari;4/76.while(x--)for(i=0;i<120;i++);}交通燈切換voidTraffic_Light(){switch(Operation_Type){case1://東西向綠燈與南北向紅燈亮RED_A=1;YELLOW_A=1;GREEN_A=0;RED_B=0;YELLOW_B=1;GREEN_B=1;DelayMS(2000);Operation_Type=2;break;case2://東西向黃燈閃耀,綠燈封閉DelayMS(300);YELLOW_A=~YELLOW_A;GREEN_A=1;if(++Flash_Count!=10)return;//閃耀5次Flash_Count=0;Operation_Type=3;break;case3://東西向紅燈,南北向綠燈亮RED_A=0;YELLOW_A=1;GREEN_A=1;RED_B=1;YELLOW_B=1;GREEN_B=0;DelayMS(2000);Operation_Type=4;break;case4://南北向黃燈閃耀5次DelayMS(300);YELLOW_B=~YELLOW_B;GREEN_B=1;if(++Flash_Count!=10)return;Flash_Count=0;Operation_Type=1;}}主程序voidmain(){while(1)Traffic_Light();}06單只數(shù)碼管循環(huán)顯示0~9/*名稱:單只數(shù)碼管循環(huán)顯示0~9說明:主程序中的循環(huán)語句頻頻將0~9的段碼送至P0口,使數(shù)字0~9循環(huán)顯示*/#include<reg51.h>5/76.#include<intrins.h>#defineucharunsignedchar#defineuintunsignedintucharcodeDSY_CODE[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff};延時voidDelayMS(uintx){uchart;while(x--)for(t=0;t<120;t++);}//主程序voidmain(){uchari=0;P0=0x00;while(1){/*for(;i<11;i++){P0=~DSY_CODE[i];DelayMS(300);}//注:另一方案*/P0=~DSY_CODE[i];i=(i+1)%10;DelayMS(300);}}8只數(shù)碼管轉動顯示單個數(shù)字/*名稱:8只數(shù)碼管轉動顯示單個數(shù)字說明:數(shù)碼管從左到右挨次轉動顯示0~7,程序經過每次僅循環(huán)選通一只數(shù)碼管*/#include<reg51.h>#include<intrins.h>#defineucharunsignedchar#defineuintunsignedintucharcodeDSY_CODE[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};延時voidDelayMS(uintx){uchart;while(x--)for(t=0;t<120;t++);}主程序voidmain(){6/76.uchari,wei=0x80;while(1){for(i=0;i<8;i++){P2=0xff;//封閉顯示wei=_crol_(wei,1);P0=DSY_CODE[i];//發(fā)送數(shù)字段碼P2=wei;//發(fā)送位碼DelayMS(300);}}}8只數(shù)碼管動向顯示多個不一樣樣字符電路如上圖/*名稱:8只數(shù)碼管動向顯示多個不一樣樣字符說明:數(shù)碼管動向掃描顯示0~7。*/#include<reg51.h>#include<intrins.h>#defineucharunsignedchar#defineuintunsignedintucharcodeDSY_CODE[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};延時voidDelayMS(uintx){uchart;while(x--)for(t=0;t<120;t++);}主程序voidmain(){uchari,wei=0x80;while(1){for(i=0;i<8;i++){P2=0xff;P0=DSY_CODE[i];//發(fā)送段碼wei=_crol_(wei,1);P2=wei;//發(fā)送位碼DelayMS(2);}}}7/76.8只數(shù)碼管閃耀顯示數(shù)字串電路如上圖/*
名稱:8只數(shù)碼管閃耀顯示數(shù)字串說明:數(shù)碼管閃耀顯示由0~7組成的一串數(shù)字本例用動向刷新法顯示一串數(shù)字,在停止刷新時全部數(shù)字顯示消逝。*/#include<reg51.h>#defineucharunsignedchar#defineuintunsignedint段碼表ucharcodeDSY_CODE[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};位碼表ucharcodeDSY_IDX[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};延時voidDelayMS(uintx){uchart;while(x--)for(t=0;t<120;t++);}主程序voidmain(){uchari,j;while(1){for(i=0;i<30;i++){for(j=0;j<8;j++){P0=0xff;P0=DSY_CODE[j];//發(fā)送段碼P2=DSY_IDX[j];//發(fā)送位碼DelayMS(2);}}P2=0x00;//封閉全部數(shù)碼管并延時DelayMS(1000);}}8只數(shù)碼管轉動顯示數(shù)字串電路如上圖/*名稱:8只數(shù)碼管轉動顯示數(shù)字串說明:數(shù)碼管向左轉動顯示3個字符組成的數(shù)字串*/8/76.#include<reg51.h>#include<intrins.h>#defineucharunsignedchar#defineuintunsignedint段碼表ucharcodeDSY_CODE[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff};//下邊數(shù)組看作環(huán)形行列,顯示從某個數(shù)開始的8個數(shù)〔10表示黑屏〕ucharNum[]={10,10,10,10,10,10,10,10,2,9,8};//延時voidDelayMS(uintx){uchart;while(x--)for(t=0;t<120;t++);}//主程序voidmain(){uchari,j,k=0,m=0x80;while(1){//刷新假定干次,保持一段時間的堅固顯示for(i=0;i<15;i++){for(j=0;j<8;j++){//發(fā)送段碼,采納環(huán)形取法,從第k個開始取第j個P0=0xff;P0=DSY_CODE[Num[(k+j)%11]];m=_crol_(m,1);P2=m;//發(fā)送位碼DelayMS(2);}}k=(k+1)%11;//環(huán)形行列首支針k遞加,Num下標范圍0~10,故對11取余}}11K1-K4控制LED移位/*名稱:K1-K4控制LED移位說明:按下K1時,P0口LED按下K2時,P0口LED按下K3時,P2口LED按下K4時,P2口LED
上移一位;下移一位;上移一位;下移一位;9/76.*/#include<reg51.h>#include<intrins.h>#defineucharunsignedchar#defineuintunsignedint延時voidDelayMS(uintx){uchari;while(x--)for(i=0;i<120;i++);}依據(jù)P1口的按鍵挪動LEDvoidMove_LED(){if((P1&0x10)==0)P0=_cror_(P0,1);//K1elseif((P1&0x20)==0)P0=_crol_(P0,1);//K2elseif((P1&0x40)==0)P2=_cror_(P2,1);//K3elseif((P1&0x80)==0)P2=_crol_(P2,1);//K4}//主程序voidmain(){ucharRecent_Key;//近來按鍵P0=0xfe;P2=0xfe;P1=0xff;Recent_Key=0xff;while(1){if(Recent_Key!=P1){Recent_Key=P1;//保留近來按鍵Move_LED();DelayMS(10);}}}K1-K4按鍵狀態(tài)顯示/*名稱:K1-K4按鍵狀態(tài)顯示說明:K1、K2按下時LED點亮,松開時熄滅,K3、K4按下并開釋時LED點亮,再次按下并開釋時熄滅;10/76.*/#include<reg51.h>#defineucharunsignedchar#defineuintunsignedintsbitLED1=P0^0;sbitLED2=P0^1;sbitLED3=P0^2;sbitLED4=P0^3;sbitK1=P1^0;sbitK2=P1^1;sbitK3=P1^2;sbitK4=P1^3;延時voidDelayMS(uintx){uchari;while(x--)for(i=0;i<120;i++);}主程序voidmain(){P0=0xff;P1=0xff;while(1){LED1=K1;LED2=K2;if(K3==0){while(K3==0);LED3=~LED3;}if(K4==0){while(K4==0);LED4=~LED4;}DelayMS(10);}}13K1-K4
分組控制
LED/*
名稱:K1-K4分組控制LED說明:每次按下K1時遞加點亮一只LED,全亮時再次按下那么再次循環(huán)開始,K2按下后點亮上邊4只LED,K3按下后點亮下邊4只LED,K4按下后封閉全部
LED11/76.*/#include<reg51.h>#defineucharunsignedchar#defineuintunsignedint延時voidDelayMS(uintx){uchari;while(x--)for(i=0;i<120;i++);}主程序voidmain(){uchark,t,Key_State;P0=0xff;P1=0xff;while(1){t=P1;if(t!=0xff){DelayMS(10);if(t!=P1)continue;//獲得4位按鍵值,由模式XXXX1111(X中有一位為0,其余均為1)變?yōu)槟J?000XXXX(X中有一位為1,其余均為0)Key_State=~t>>4;k=0;//檢查1所在地點,累加獲得按鍵號kwhile(Key_State!=0){k++;Key_State>>=1;}依據(jù)按鍵號k進行4種辦理switch(k){case1:if(P0==0x00)P0=0xff;P0<<=1;DelayMS(200);break;case2:P0=0xf0;break;case3:P0=0x0f;break;case4:P0=0xff;}}}12/76.}K1-K4控制數(shù)碼管移位顯示/*名稱:K1-K4控制數(shù)碼管移位顯示說明:按下K1時加1計數(shù)并增添顯示位,按下K2時減1計數(shù)并減少顯示位,按下K3時清零。*/#include<reg51.h>#defineucharunsignedchar#defineuintunsignedint段碼ucharcodeDSY_CODE[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff};位碼ucharcodeDSY_Index[]={0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01};//待顯示到各數(shù)碼管的數(shù)字緩沖〔開始僅在0位顯示0,其余黑屏〕ucharDisplay_Buffer[]={0,10,10,10,10,10,10,10};延時voidDelayMS(uintx){uchari;while(x--)for(i=0;i<120;i++);}voidShow_Count_ON_DSY(){uchari;for(i=0;i<8;i++){P0=0xff;P0=DSY_CODE[Display_Buffer[i]];P2=DSY_Index[i];DelayMS(2);}}主程序voidmain(){uchari,Key_NO,Key_Counts=0;P0=0xff;P1=0xff;P2=0x00;while(1){Show_Count_ON_DSY();13/76.P1=0xff;Key_NO=P1;//P1口按鍵狀態(tài)分別為K1-0xfe,K2-0xfd,K3-0xfbswitch(Key_NO){case0xfe:Key_Counts++;if(Key_Counts>8)Key_Counts=8;Display_Buffer[Key_Counts-1]=Key_Counts;break;case0xfd:if(Key_Counts>0)Display_Buffer[--Key_Counts]=10;break;case0xfb:Display_Buffer[0]=0;for(i=1;i<8;i++)Display_Buffer[i]=10;Key_Counts=0;}//假定鍵未開釋那么僅刷新顯示,不進行鍵掃描while(P1!=0xff)Show_Count_ON_DSY();}}K1-K4控制數(shù)碼管加減演示/*名稱:K1-K4控制數(shù)碼管加減演示說明:按下K1后加1計數(shù),按下K2后減1計數(shù),按下K3后清零。*/#include<reg51.h>#include<intrins.h>#defineucharunsignedchar#defineuintunsignedint段碼ucharcodeDSY_CODE[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff};待顯示的3位緩沖ucharNum_Buffer[]={0,0,0};按鍵代碼,按鍵計數(shù)ucharKey_Code,Key_Counts=0;延時voidDelayMS(uintx){uchari;while(x--)for(i=0;i<120;i++);}顯示函數(shù)voidShow_Counts_ON_DSY(){uchari,j=0x01;14/76.Num_Buffer[2]=Key_Counts/100;Num_Buffer[1]=Key_Counts/10%10;Num_Buffer[0]=Key_Counts%10;for(i=0;i<3;i++){j=_cror_(j,1);P0=0xff;P0=DSY_CODE[Num_Buffer[i]];P2=j;DelayMS(1);}}主程序voidmain(){uchari;P0=0xff;P1=0xff;P2=0x00;Key_Code=0xff;while(1){Show_Counts_ON_DSY();P1=0xff;Key_Code=P1;//有鍵按下時,數(shù)碼管刷新顯示30次,該行代碼同時起到延時作用if(Key_Code!=0xff)for(i=0;i<30;i++)Show_Counts_ON_DSY();switch(Key_Code){case0xfe:case0xfd:case0xfb:
if(Key_Counts<255)Key_Counts++;break;if(Key_Counts>0)Key_Counts--;break;Key_Counts=0;}Key_Code=0xff;}}4X4矩陣鍵盤控制條形LED顯示/*名稱:4X4矩陣鍵盤控制條形LED顯示說明:運轉本例時,按15/76.下的按鍵值越大點亮的LED越多。*/#include<reg51.h>#include<intrins.h>#defineucharunsignedchar#defineuintunsignedint矩陣鍵盤按鍵特點碼表ucharcodeKeyCodeTable[]={0x11,0x12,0x14,0x18,0x21,0x22,0x24,0x28,0x41,0x42,0x44,0x48,0x81,0x82,0x84,0x88};延時voidDelayMS(uintx){uchari;while(x--)for(i=0;i<120;i++);}鍵盤掃描ucharKeys_Scan(){ucharsCode,kCode,i,k;低4地點0,放入4行P1=0xf0;假定高4位出現(xiàn)0,那么有鍵按下if((P1&0xf0)!=0xf0){DelayMS(2);if((P1&0xf0)!=0xf0){sCode=0xfe;//行掃描碼初值for(k=0;k<4;k++)//對4行分別進行掃描{P1=sCode;if((P1&0xf0)!=0xf0){kCode=~P1;for(i=0;i<16;i++)//查表獲得按鍵序號并返回if(kCode==KeyCodeTable[i])return(i);}elsesCode=_crol_(sCode,1);}}}return(-1);}主程序16/76.voidmain(){uchari,P2_LED,P3_LED;ucharKeyNo=-1;//按鍵序號,-1表示無按鍵while(1){KeyNo=Keys_Scan();//掃描鍵盤獲得按鍵序號KeyNoif(KeyNo!=-1){P2_LED=0xff;P3_LED=0xff;for(i=0;i<=KeyNo;i++)//鍵值越大,點亮的LED越多{if(i<8)P3_LED>>=1;elseP2_LED>>=1;}P3=P3_LED;//點亮條形LEDP2=P2_LED;}}}數(shù)碼管顯示4X4矩陣鍵盤按鍵號/*名稱:數(shù)碼管顯示4X4矩陣鍵盤按鍵號說明:按下隨意鍵時,數(shù)碼管都會顯示其鍵的序號,掃描程序第一判斷按鍵發(fā)生在哪一列,此后依據(jù)所發(fā)生的行附帶不一樣樣的值,進而獲得按鍵的序號。*/#include<reg51.h>#defineucharunsignedchar#defineuintunsignedint段碼ucharcodeDSY_CODE[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0x00};sbitBEEP=P3^7;//前一次按鍵和目前按鍵的序號,該矩陣中序號范圍0~15,16表示無按鍵ucharPre_KeyNo=16,KeyNo=16;延時voidDelayMS(uintx)17/76.{uchari;while(x--)for(i=0;i<120;i++);}//矩陣鍵盤掃描voidKeys_Scan(){ucharTmp;P1=0x0f;//高4地點0,放入4行DelayMS(1);Tmp=P1^0x0f;//按鍵后0f變?yōu)?000XXXX
,X
中一個為
0,3個仍為
1,經過異或把
3個
1變?yōu)?/p>
0,唯一的
0變?yōu)?switch(Tmp){
//判斷按鍵發(fā)生于
0~3列的哪一列case1:KeyNo=0;break;case2:KeyNo=1;break;case4:KeyNo=2;break;case8:KeyNo=3;break;default:KeyNo=16;//無鍵按下}P1=0xf0;//低4地點0,放入4列DelayMS(1);Tmp=P1>>4^0x0f;//按鍵后f0變?yōu)閄XXX0000
,X
中有
1個為
0,三個仍為
1;高
4位轉移到低
4位并異或獲得改變的值switch(Tmp)
//對0~3
行分別附帶初步值
0,4,8,12{case1:case2:case4:case8:
KeyNo+=0;break;KeyNo+=4;break;KeyNo+=8;break;KeyNo+=12;}}//蜂鳴器voidBeep(){uchari;for(i=0;i<100;i++){DelayMS(1);BEEP=~BEEP;}BEEP=0;}主程序voidmain(){18/76.P0=0x00;BEEP=0;while(1){P1=0xf0;if(P1!=0xf0)Keys_Scan();//獲得鍵序號if(Pre_KeyNo!=KeyNo){P0=~DSY_CODE[KeyNo];Beep();Pre_KeyNo=KeyNo;}DelayMS(100);}}開關控制LED/*名稱:開關控制LED說明:開關S1和S2分別控制LED1和LED2。*/#include<reg51.h>sbitS1=P1^0;sbitS2=P1^1;sbitLED1=P0^0;sbitLED2=P0^1;主程序voidmain(){while(1){LED1=S1;LED2=S2;}}繼電器控制照明設施/*名稱:繼電器控制照明設施說明:按下K1燈點亮,再次按下時燈熄滅*/#include<reg51.h>#defineucharunsignedchar#defineuintunsignedint19/76.sbitK1=P1^0;sbitRELAY=P2^4;延時voidDelayMS(uintms){uchart;while(ms--)for(t=0;t<120;t++);}主程序voidmain(){P1=0xff;RELAY=1;while(1){if(K1==0){while(K1==0);RELAY=~RELAY;DelayMS(20);}}}數(shù)碼管顯示撥碼開關編碼/*名稱:數(shù)碼管顯示撥碼開關編碼說明:系統(tǒng)顯示撥碼開關所設置的編碼000~255*/#include<reg51.h>#include<intrins.h>#defineucharunsignedchar#defineuintunsignedint各數(shù)字的數(shù)碼管段碼〔共陰〕ucharcodeDSY_CODE[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};顯示緩沖ucharDSY_Buffer[3]={0,0,0};延時voidDelayMS(uintms){uchart;while(ms--)for(t=0;t<120;t++);}主程序voidmain(){20/76.uchari,m,Num;P0=0xff;P2=0xff;while(1){m=0xfe;Num=P1;//讀取撥碼開關的值DSY_Buffer[0]=Num/100;DSY_Buffer[1]=Num/10%10;DSY_Buffer[2]=Num%10;for(i=0;i<3;i++)//刷新顯示在數(shù)碼管上{m=_crol_(m,1);P2=m;P0=DSY_CODE[DSY_Buffer[i]];DelayMS(10);}}}開關控制報警器/*名稱:開關控制報警器說明:用K1開關控制報警器,程序控制P1.0輸出兩種不一樣樣頻次的聲音,模擬很傳神的報警見效*/#include<reg51.h>#defineucharunsignedchar#defineuintunsignedintsbitSPK=P1^0;sbitK1=P1^7;發(fā)聲函數(shù)voidAlarm(uchart){uchari,j;for(i=0;i<200;i++){SPK=~SPK;for(j=0;j<t;j++);//由參數(shù)t行成不一樣樣的頻次}}voidmain(){SPK=0;while(1){21/76.if(K1==1){Alarm(90);Alarm(120);}}}按鍵發(fā)音/*名稱:按鍵發(fā)音說明:按下不一樣樣的按鍵會是SOUNDER發(fā)出不一樣樣頻次的聲音。本例使用延時函數(shù)實現(xiàn)不一樣樣頻次的聲音輸出,今后也可使用準時器*/#include<reg51.h>#defineucharunsignedchar#defineuintunsignedintsbitBEEP=P3^7;sbitK1=P1^4;sbitK2=P1^5;sbitK3=P1^6;sbitK4=P1^7;延時voidDelayMS(uintx){uchart;while(x--)for(t=0;t<120;t++);}按周期t發(fā)音voidPlay(uchart){uchari;for(i=0;i<100;i++){BEEP=~BEEP;DelayMS(t);}BEEP=0;}voidmain(){P1=0xff;BEEP=0;while(1){if(K1==0)Play(1);22/76.if(K2==0)Play(2);if(K3==0)Play(3);if(K4==0)Play(4);}}播放音樂/*名稱:播放音樂說明:程序運轉時播放誕辰快樂歌,未使用準時器中止,全部頻次完滿用延時實現(xiàn)*/#include<reg51.h>#defineucharunsignedchar#defineuintunsignedintsbitBEEP=P3^7;誕辰快樂歌的音符頻次表,不一樣樣頻次由不一樣樣的延時來決定ucharcodeSONG_TONE[]={212,212,190,212,159,169,212,212,190,212,142,159,212,212,106,126,159,169,190,119,119,126,159,142,159,0};誕辰快樂歌節(jié)拍表,節(jié)拍決定每個音符的演奏長短ucharcodeSONG_LONG[]={9,3,12,12,12,24,9,3,12,12,12,24,9,3,12,12,12,12,12,9,3,12,12,12,24,0};延時voidDelayMS(uintx){uchart;while(x--)for(t=0;t<120;t++);}播放函數(shù)voidPlayMusic(){uinti=0,j,k;while(SONG_LONG[i]!=0||SONG_TONE[i]!=0){//播放各個音符,SONG_LONG為拍子長度for(j=0;j<SONG_LONG[i]*20;j++){BEEP=~BEEP;//SONG_TONE延時表決定了每個音符的頻次for(k=0;k<SONG_TONE[i]/3;k++);}DelayMS(10);i++;}}voidmain(){BEEP=0;23/76.while(1){PlayMusic();//播放誕辰快樂DelayMS(500);//播放完后暫停一段時間}}24INT0中止計數(shù)/*名稱:INT0中止計數(shù)說明:每次按下計數(shù)鍵時觸發(fā)INT0中止,中止程序累加計數(shù),計數(shù)值顯示在3只數(shù)碼管上,按下清零鍵時數(shù)碼管清零*/#include<reg51.h>#defineucharunsignedchar#defineuintunsignedint//0~9的段碼ucharcodeDSY_CODE[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00};計數(shù)值分解后各個待顯示的數(shù)位ucharDSY_Buffer[]={0,0,0};ucharCount=0;sbitClear_Key=P3^6;//數(shù)碼管上顯示計數(shù)值voidShow_Count_ON_DSY(){DSY_Buffer[2]=Count/100;//獲得DSY_Buffer[1]=Count%100/10;DSY_Buffer[0]=Count%10;if(DSY_Buffer[2]==0)//高位為{
3個數(shù)0時不顯示DSY_Buffer[2]=0x0a;if(DSY_Buffer[1]==0)
//高位為
0,假定第二位為
0相同不顯示DSY_Buffer[1]=0x0a;}P0=DSY_CODE[DSY_Buffer[0]];P1=DSY_CODE[DSY_Buffer[1]];P2=DSY_CODE[DSY_Buffer[2]];}主程序voidmain(){P0=0x00;P1=0x00;24/76.P2=0x00;IE=0x81;//贊成INT0中止IT0=1;//降落沿觸發(fā)while(1){if(Clear_Key==0)Count=0;//清0Show_Count_ON_DSY();}}//INT0中止函數(shù)voidEX_INT0()interrupt0{Count++;//計數(shù)值遞加}25外面INT0中止控制LED/*名稱:外面INT0中止控制LED說明:每次按鍵都會觸發(fā)INT0中斷,中止發(fā)生時將LED狀態(tài)取反,產生LED狀態(tài)由按鍵控制的見效*/#include<reg51.h>#defineucharunsignedchar#defineuintunsignedintsbitLED=P0^0;主程序voidmain(){LED=1;EA=1;EX0=1;IT0=1;while(1);}//INT0中止函數(shù)voidEX_INT0()interrupt0{LED=~LED;//控制LED亮滅}26INT0及INT1中止計數(shù)/*名稱:INT0及INT1中止計數(shù)說明:每次按下第1個計數(shù)鍵時,第1組計數(shù)值累加并顯示在右側3只數(shù)25/76.碼管上,
每次按下第
2個計數(shù)鍵時,第
2組計數(shù)值累加并顯示在左側
3只數(shù)碼管上,后兩個按鍵分別清零。*/#include<reg51.h>#defineucharunsignedchar#defineuintunsignedintsbitK3=P3^4;//2個清零鍵sbitK4=P3^5;數(shù)碼管段碼與位碼ucharcodeDSY_CODE[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff};ucharcodeDSY_Scan_Bits[]={0x20,0x10,0x08,0x04,0x02,0x01};//2組計數(shù)的顯示緩沖,前3位一組,后3位一組uchardataBuffer_Counts[]={0,0,0,0,0,0};uintCount_A,Count_B=0;延時voidDelayMS(uintx){uchart;while(x--)for(t=0;t<120;t++);}數(shù)據(jù)顯示voidShow_Counts(){uchari;Buffer_Counts[2]=Count_A/100;Buffer_Counts[1]=Count_A%100/10;Buffer_Counts[0]=Count_A%10;if(Buffer_Counts[2]==0){Buffer_Counts[2]=0x0a;if(Buffer_Counts[1]==0)Buffer_Counts[1]=0x0a;}Buffer_Counts[5]=Count_B/100;Buffer_Counts[4]=Count_B%100/10;Buffer_Counts[3]=Count_B%10;if(Buffer_Counts[5]==0){Buffer_Counts[5]=0x0a;if(Buffer_Counts[4]==0)Buffer_Counts[4]=0x0a;}for(i=0;i<6;i++){P2=DSY_Scan_Bits[i];P1=DSY_CODE[Buffer_Counts[i]];26/76.DelayMS(1);}}主程序voidmain(){IE=0x85;PX0=1;//中止優(yōu)先IT0=1;IT1=1;while(1){if(K3==0)Count_A=0;if(K4==0)Count_B=0;Show_Counts();}}//INT0中止函數(shù)voidEX_INT0()interrupt0{Count_A++;}//INT1中止函數(shù)voidEX_INT1()interrupt2{Count_B++;}27準時器控制單只LED/*名稱:準時器控制單只LED說明:LED在準時器的中止例程控制下不停閃耀。*/#include<reg51.h>#defineucharunsignedchar#defineuintunsignedintsbitLED=P0^0;ucharT_Count=0;主程序voidmain(){TMOD=0x00;TH0=(8192-5000)/32;
//準時器0工作方式//5ms準時
0TL0=(8192-5000)%32;IE=0x82;
//贊成
T0中止TR0=1;27/76.while(1);}//T0中止函數(shù)voidLED_Flash()interrupt1{TH0=(8192-5000)/32;//恢復初值TL0=(8192-5000)%32;if(++T_Count==100)//0.5s開關一次LED{LED=~LED;T_Count=0;}}28TIMER0控制流水燈/*名稱:TIMER0控制流水燈說明:準時器控制P0、P2口的LED轉動顯示,本例未使用中止函數(shù)。*/#include<reg51.h>#include<intrins.h>#defineucharunsignedchar#defineuintunsignedint//主程序voidmain(){ucharT_Count=0;P0=0xfe;P2=0xfe;TMOD=0x01;TH0=(65536-40000)/256;
//準時器0工作方式//40ms準時
1TL0=(65536-40000)%256;TR0=1;
//啟動準時器while(1){if(TF0==1){TF0=0;TH0=(65536-40000)/256;//恢復初值TL0=(65536-40000)%256;if(++T_Count==5){P0=_crol_(P0,1);P2=_crol_(P2,1);28/76.T_Count=0;}}}}準時器控制4個LED轉動閃耀/*
名稱:準時器控制說明:4只LED
4個LED轉動閃耀在準時器控制下轉動閃耀。*/#include<reg51.h>#defineucharunsignedchar#defineuintunsignedintsbitB1=P0^0;sbitG1=P0^1;sbitR1=P0^2;sbitY1=P0^3;uinti,j,k;//主程序voidmain(){i=j=k=0;P0=0xff;TMOD=0x02;TH0=256-200;
//準時器0工作方式//200us準時
2TL0=256-200;IE=0x82;TR0=1;
//啟動準時器while(1);}//T0中止函數(shù)voidLED_Flash_and_Scroll()interrupt1{if(++k<35)
return;
//準時中止假定干次后履行閃耀k=0;switch(i){case0:B1=~B1;break;case1:G1=~G1;break;case2:R1=~R1;break;case3:Y1=~Y1;break;default:i=0;}if(++j<300)return;//每次閃耀連續(xù)一段時間j=0;29/76.P0=0xff;//封閉顯示i++;//切換到下一個LED}T0控制LED實現(xiàn)二進制計數(shù)/*名稱:T0控制LED實現(xiàn)二進制計數(shù)說明:本例對按鍵的計數(shù)沒有使用查詢法,沒有使用外面中止函數(shù),沒有使用準時或計數(shù)中止函數(shù)。而是啟用了計數(shù)器,連結在T0引腳的按鍵每次按下時,會使計數(shù)寄存器的值遞加,其值經過LED以二進制形式顯示*/#include<reg51.h>//主程序voidmain(){TMOD=0x05;//準時器
0為計數(shù)器,工作方式
1,最大計數(shù)值
65535TH0=0;//初值為
0TL0=0;TR0=1;
//啟動準時器while(1){P1=TH0;P2=TL0;}}31TIMER0
與
TIMER1
控制條形
LED/*
名稱:TIMER0與TIMER1控制條形說明:準時器T0準時控制上一組條形準時器T1準時控制下一組條形
LEDLED,轉動速度較快LED,轉動速度較慢*/#include<reg51.h>#include<intrins.h>#defineucharunsignedchar#defineuintunsignedintuchartc0=0,tc1=0;主程序voidmain(){P0=0xfe;P2=0xfe;TMOD=0x11;//準時器0、準時器30/76.1均工作于方式
1TH0=(65536-15000)/256;
//準時器
0:15msTL0=(65536-15000)%256;TH1=(65536-50000)/256;
//準時器
1:50msTL1=(65536-50000)%256;IE=0x8a;TR0=1;//啟動準時器TR1=1;while(1);}//T0中止函數(shù)voidTime0()interrupt1{TH0=(65536-15000)/256;
//恢復準時器
0初值TL0=(65536-15000)%256;if(++tc0==10)
//150ms
變換狀態(tài){tc0=0;P0=_crol_(P0,1);}}//T1中止函數(shù)voidTime1()interrupt3{TH0=(65536-50000)/256;
//恢復準時器
1初值TL0=(65536-50000)%256;if(++tc1==10)
//500ms
變換狀態(tài){tc1=0;P2=_crol_(P2,1);}}3210s的秒表/*名稱:10s的秒表說明:初次按鍵計時開始,再次按鍵暫停,第三次按鍵清零。*/#include<reg51.h>#defineucharunsignedchar#defineuintunsignedintsbitK1=P3^7;uchari,Second_Counts,Key_Flag_Idx;bitKey_State;uchar31/76.DSY_CODE[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};延時voidDelayMS(uintms){uchart;while(ms--)for(t=0;t<120;t++);}辦理按鍵事件voidKey_Event_Handle(){if(Key_State==0){Key_Flag_Idx=(Key_Flag_Idx+1)%3;switch(Key_Flag_Idx){case1:EA=1;ET0=1;TR0=1;break;case2:EA=0;ET0=0;TR0=0;break;case0:P0=0x3f;P2=0x3f;i=0;Second_Counts=0;}}}//主程序voidmain(){P0=0x3f;
//顯示
00P2=0x3f;i=0;Second_Counts=0;Key_Flag_Idx=0;
//按鍵次數(shù)〔取值
0,1,2,3〕Key_State=1;TMOD=0x01;TH0=(65536-50000)/256;
//按鍵狀態(tài)//準時器0方式1//準時器0:15msTL0=(65536-50000)%256;while(1){if(Key_State!=K1){DelayMS(10);Key_State=K1;Key_Event_Handle();}}}//T0中止函數(shù)voidDSY_Refresh()interrupt1{32/76.TH0=(65536-50000)/256;
//恢復準時器
0初值TL0=(65536-50000)%256;if(++i==2)
變換狀態(tài){i=0;Second_Counts++;P0=DSY_CODE[Second_Counts/10];P2=DSY_CODE[Second_Counts%10];if(Second_Counts==100)Second_Counts=0;
//滿
100〔10s〕后顯示
00}}用計數(shù)器中止實現(xiàn)100之內的按鍵計數(shù)/*
名稱:用計數(shù)器中止實現(xiàn)100之內的按鍵計數(shù)說明:本例用T0計數(shù)器中止實現(xiàn)按鍵技術,因為計數(shù)寄存器初值為P3.4引腳的每次負跳變都會觸發(fā)T0中止,實現(xiàn)計數(shù)值累加。計數(shù)器的清零用外面中止0控制。
1,所以*/#include<reg51.h>#defineucharunsignedchar#defineuintunsignedint//段碼uchar
codeDSY_CODE[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00};ucharCount=0;主程序voidmain(){P0=0x00;P2=0x00;TMOD=0x06;TH0=TL0=256-1;ET0=1;EX0=1;EA=1;IP=0x02;IT0=1;
//計數(shù)器T0方式2//計數(shù)值為1//贊成T0中止//贊成INT0中止//贊成CPU中止//設置優(yōu)先級,T0高于INT0//INT0中止觸發(fā)方式為降落沿觸發(fā)33/76.TR0=1;//啟動T0while(1){P0=DSY_CODE[Count/10];P2=DSY_CODE[Count%10];}}//T0計數(shù)器中止函數(shù)voidKey_Counter()interrupt1{Count=(Count+1)%100;//因為只有兩位數(shù)碼管,計數(shù)控制在100之內〔00~99〕}//INT0中止函數(shù)voidClear_Counter()interrupt0{Count=0;}34100000s之內的計時程序/*名稱:100000s之內的計時程序說明:在6只數(shù)碼管上達成。*/#include<reg51.h>#include<intrins.h>#defineucharunsignedchar#defineuintunsignedint段碼ucharcodeDSY_CODE[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//6只數(shù)碼管上顯示的數(shù)字ucharDigits_of_6DSY[]={0,0,0,0,0,0};ucharCount;sbitDot=P0^7;延時voidDelayMS(uintms){uchart;while(ms--)for(t=0;t<120;t++);}主程序voidmain(){34/76.uchari,j;P0=0x00;P3=0xff;Count=0;TMOD=0x01;//計數(shù)器T0方式1TH0=(65536-50000)/256;//50ms準時TL0=(65536-50000)%256;IE=0x82;TR0=1;//啟動T0while(1){j=0x7f;//顯示Digits_of_6DSY[5]~Digits_of_6DSY[0]的內容//前面高位,后邊低位,循環(huán)中i!=-1亦可寫成i!=0xfffor(i=5;i!=-1;i--){j=_crol_(j,1);P3=j;P0=DSY_CODE[Digits_of_6DSY[i]];if(i==1)Dot=1;//加小數(shù)點DelayMS(2);}}}//T0中止函數(shù)voidTimer0()interrupt1{uchari;TH0=(65536-50000)/256;//恢復初值TL0=(65536-50000)%256;if(++Count!=2)return;Count=0;Digits_of_6DSY[0]++;//0.1s位累加for(i=0;i<=5;i++)//進位辦理{if(Digits_of_6DSY[i]==10){Digits_of_6DSY[i]=0;if(i!=5)Digits_of_6DSY[i+1]++;//假如0~4位那么分別向高一位進位}elsebreak;//假定某低位沒有進位,怎循環(huán)提早結束}35/76.}準時器控制數(shù)碼管動向顯示/*名稱:準時器控制數(shù)碼管動向顯示說明:8個數(shù)碼管上分兩組動態(tài)顯示年代日與時分秒,本例的位顯示延時用準時器實現(xiàn)。*/#include<reg51.h>#include<intrins.h>#defineucharunsignedchar#defineuintunsignedint段碼,最后一位是“-〞的段碼ucharcodeDSY_CODE[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf};//待顯示的數(shù)據(jù):09-12-25與23-59-58〔分兩組顯示〕ucharcodeTable_of_Digits[][8]={{0,9,10,1,2,10,2,5},{2,3,10,5,9,10,5,8}};uchari,j=0;uintt=0;//主程序voidmain(){P3=0x80;//位碼初值TMOD=0x00;//計數(shù)器T0方式0TH0=(8192-4000)/32;//4ms準時TL0=(8192-4000)%32;IE=0x82;TR0=1;//啟動T0while(1);}//T0中止函數(shù)控制數(shù)碼管刷新顯示voidDSY_Show()interrupt1{TH0=(8192-4000)/32;//恢復初值TL0=(8192-4000)%32;P0=0xff;//輸出位碼和段碼P0=DSY_CODE[Table_of_Digits[i][j]];P3=_crol_(P3,1);j=(j+1)%8;//數(shù)組第i行的下一字節(jié)索引if(++t!=350)return;//保持刷新一段時間t=0;i=(i+1)%2;//數(shù)組行i=0時顯示年代日,i=1時顯示時分秒36/76.}368X8LED點陣顯示數(shù)字/*名稱:8X8LED點陣顯示數(shù)字說明:8X8LED點陣屏循環(huán)顯示數(shù)字0~9,刷新過程由準時器中斷達成。*/#include<reg51.h>#include<intrins.h>#defineucharunsignedchar#defineuintunsignedintucharcodeTable_of_Digits[]={0x00,0x3e,0x41,0x41,0x41,0x3e,0x00,0x00,//00x00,0x00,0x00,0x21,0x7f,0x01,0x00,0x00,//10x00,0x27,0x45,0x45,0x45,0x39,0x00,0x00,//20x00,0x22,0x49,0x49,0x49,0x36,0x00,0x00,//30x00,0x0c,0x14,0x24,0x7f,0x04,0x00,0x00,//40x00,0x72,0x51,0x51,0x51,0x4e,0x00,0x00,//50x00,0x3e,0x49,0x49,0x49,0x26,0x00,0x00,//60x00,0x40,0x40,0x40,0x4f,0x70,0x00,0x00,//70x00,0x36,0x49,0x49,0x49,0x36,0x00,0x00,//80x00,0x32,0x49,0x49,0x49,0x3e,0x00,0x00//9};uchari=0,t=0,Num_Index;//主程序voidmain(){P3=0x80;Num_Index=0;
//從
0開始顯示TMOD=0x00;TH0=(8192-2000)/32;
//T0方式0//2ms準時TL0=(8192-2000)%32;IE=0x82;TR0=1;
//啟動
T0while(1);}//T0中止函數(shù)voidLED_Screen_Display()interrupt1{TH0=(8192-2000)/32;//恢復初值TL0=(8192-2000)%32;P0=0xff;//輸出位碼和段碼37/76.P0=~Table_of_Digits[Num_Index*8+i];P3=_crol_(P3,1);if(++i==8)i=0;//每屏一個數(shù)字由8個字節(jié)組成if(++t==250)//每個數(shù)字刷新顯示一段時間{t=0;if(++Num_Index==10)Num_Index=0;//顯示下一個數(shù)字}}按鍵控制8X8LED點陣屏顯示圖形/*名稱:按鍵控制8X8LED點陣屏顯示圖形說明:每次按下K1時,會使8X8LED點陣屏循環(huán)顯示不一樣樣圖形。本例同時使用外面中止和定時中止。*/#include<reg51.h>#include<intrins.h>#defineucharunsignedchar#defineuintunsignedint//待顯示圖形編碼ucharcodeM[][8]={{0x00,0x7e,0x7e,0x7e,0x7e,0x7e,0x7e,0x00},{0x00,0x38,0x44,0x54,0x44,0x38,0x00,0x00},{0x00,0x20,0x30,0x38,0x3c,0x3e,0x00,0x00}
//圖1//圖2//圖3};uchari,j;//主程序voidmain(){P0=0xff;P1=0xff;TMOD=0x01;//T0方式1TH0=(65536-2000)/256;//2ms準時TL0=(65536-2000)%256;IT0=1;//降落沿觸發(fā)IE=0x83;//贊成準時器0、外面0中止i=0xff;//i的初值設為0xff,加1后將從while(1);
0開始}//T0中止控制點陣屏顯示voidShow_Dot_Matrix()interrupt138/76.{TH0=(65536-2000)/256;//恢復初值TL0=(65536-2000)%256;P0=0xff;//輸出位碼和段碼P0=~M[i][j];P1=_crol_(P1,1);j=(j+1)%8;}//INT0中止〔準時器由鍵盤中止啟動〕voidKey_Down()interrupt0{P0=0xff;P1=0x80;j=0;i=(i+1)%3;
//i
在
0,1,2中取值,因為只需
3個圖形TR0=1;}用準時器設計的門鈴/*名稱:用準時器設計的門鈴說明:按下按鍵時蜂鳴器發(fā)出叮咚的門鈴聲。*/#include<reg51.h>#defineucharunsignedchar#defineuintunsignedintsbitKey=P1^7;sbitDoorBell=P3^0;uintp=0;//主程序voidmain(){DoorBell=0;TMOD=0x00;TH0=(8192-700)/32;
//T0方式0//700us準時TL0=(8192-700)%32;IE=0x82;while(1){if(Key==0)
//按下按鍵啟動準時器{TR0=1;while(Key==0);}}}39/76.//T0中止控制點陣屏顯示voidTimer0()interrupt1{DoorBell=~DoorBell;p++;if(p<400)//假定需要拖長聲音,能夠調整400和800{TH0=(8192-700)/32;
//700us
準時TL0=(8192-700)%32;}elseif(p<800){TH0=(8192-1000)/32;
//1ms
準時TL0=(8192-1000)%32;}else{TR0=0;p=0;}}演奏音階/*名稱:演奏音階說明:本例使用準時器演奏一段音階,播放由K1控制。*/#include<reg51.h>#defineucharunsignedchar#defineuintunsignedintsbitK1=P1^0;sbitSPK=P3^4;uinti=0;//音符索引//14個音符放在方式2下的準時寄存器TH0,TL0〕ucharcodeHI_LIST[]={0,226,229,232,233,236,238,240,241,242,244,245,246,247,248};ucharcodeLO_LIST[]={0,4,13,10,20,3,8,6,2,23,5,26,1,4,3};準時器0中止函數(shù)voidT0_INT()interrupt1{TL0=LO_LIST[i];TH0=HI_LIST[i];SPK=~SPK;}延時40/76.voidDelayMS(uintms){uchart;while(ms--)for(t=0;t<120;t++);}//主程序voidmain(){TMOD=0x00;
//T0
方式
0IE=0x82;SPK=0;while(1){while(K1==1);while(K1==0);for(i=1;i<15;i++){
//未按鍵等候//等候開釋TR0=1;DelayMS(500);
//播放一個音符//播放延時TR0=0;DelayMS(50);}}}按鍵控擬準時器選播多段音樂/*名稱:按鍵控擬準時器選播多段音樂說明:本例內置3段音樂,K1可啟動停止音樂播放,K2用于選擇音樂段。*/#include<reg51.h>#include<intrins.h>#defineucharunsignedchar#defineuintunsignedintsbitK1=P1^0;sbitSPK=P3^7;
//播放和停止鍵//蜂鳴器ucharSong_Index=0,Tone_Index=0;//目前音樂段索引,音符索引數(shù)碼管段碼表ucharcodeDSY_CODE[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};標準音符頻次對應的延時表ucharcodeHI_LIST[]={0,226,229,232,233,236,238,240,241,242,244,245,246,247,248};ucharcodeLO_LIST[]={0,4,13,10,20,3,8,6,2,23,5,26,1,4,3};三段音樂的音符ucharcodeSong[][50]={41/76.{1,2,3,1,1,2,3,1,3,4,5,3,4,5,5,6,5,3,5,6,5,3,5,3,2,1,2,1,-1},{3,3,3,4,5,5,5,5,6,5,3,5,3,2,1,5,6,53,3,2,1,1,-1},{3,2,1,3,2,1,1,2,3,1,1,2,3,1,3,4,5,3,4,5,5,6,5,3,5,3,2,1,3,2,1,1,-1}};三段音樂的節(jié)拍ucharcodeLen[][50]={{1,1,1,1,1,1,1,1,1,1,2,1,1,2,1,1,1,1,1,1,1,1,1,1,1,2,1,2,-1},{1,1,1,1,1,1,2,1,1,1,1,1,1,1,2,1,1,1,1,1,1,2,2,-1},{1,1,2,1,1,2,1,1,1,1,1,1,1,1,1,1,2,1,1,2,1,1,1,1,1,1,1,2,1,1,2,2,-1}};外面中止0voidEX0_INT()interrupt0{TR0=0;//播放結束或許播放半途切換歌曲時停止播放Song_Index=(Song_Index+1)%3;//跳到下一首的開頭Tone_Index=0;P2=DSY_CODE[Song_Index];//數(shù)碼管顯示目前音樂段號}準時器0中止函數(shù)voidT0_INT()interrupt1{TL0=LO_LIST[Song[Song_Index][Tone_Index]];TH0=HI_LIST[Song[Song_Index][Tone_Index]];SPK=~SPK;}延時voidDelayMS(uintms){uchart;while(ms--)for(t=0;t<120;t++);}//主程序voidmain(){P2=0xc0;SPK=0;TMOD=0x00;
//T0
方式
0IE=0x83;IT0=1;IP=0x02;while(1){while(K1==1);while(K1==0);TR0=1;
//未按鍵等候//等候開釋//開始播放42/76.Tone_Index=0;//從第0個音符開始//播放過程中按下K1可提早停止播放〔K1=0〕。//假定切換音樂段會觸發(fā)外面中止,致使TR0=0,播放也會停止while(Song[Song_Index][Tone_Index]!=-1&&K1==1&&TR0==1){DelayMS(300*Len[Song_Index][Tone_Index]);//播放延時〔節(jié)拍〕Tone_Index++;//目前音樂段的下一音符索引}TR0=0;//停止播放while(K1==0);//假定提早停止播放,按鍵未開釋時等候}}41準時器控制交通指示燈/*
名稱:準時器控制交通指示燈說明:東西向綠燈亮5s后,黃燈閃耀,閃耀5次亮紅燈,紅燈亮后,南北向由紅燈變?yōu)榫G燈,5s后南北向黃燈閃耀,閃耀5次后亮紅燈,東西向綠燈亮,這樣來往。*/#include<reg51.h>#defineucharunsignedchar#defineuintunsignedintsbitRED_A=P0^0;//東西向指示燈sbitYELLOW_A=P0^1;sbitGREEN_A=P0^2;sbitRED_B=P0^3;//南北向指示燈sbitYELLOW_B=P0^4;sbitGREEN_B=P0^5;延時倍數(shù),閃耀次數(shù),操作種類變量ucharTime_Count=0,Flash_Count=0,Operation_Type=1;準時器0中止函數(shù)vo
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024股權質押借款合同范本2
- 信用貸款合同模板
- 2024年國際買賣合同中英文
- 2024年建筑外墻節(jié)能保溫技術服務合同
- 2024規(guī)范的電子配件購銷合同模板
- 三輪摩托購車合同范本2024年
- 教育機構合作契約
- 2024停車場場地協(xié)議書范文
- 網絡證券交易平臺服務協(xié)議
- 經營托管合同范本
- 中國介入醫(yī)學白皮書(2021 版)
- 2024中華人民共和國農村集體經濟組織法詳細解讀課件
- 代運營合作服務協(xié)議
- 婚內財產協(xié)議書(2024版)
- 有限空間作業(yè)應急管理制度
- 2024全國普法知識考試題庫及答案
- 化工企業(yè)中試階段及試生產期間的產品能否對外銷售
- 籃球智慧樹知到期末考試答案章節(jié)答案2024年浙江大學
- 國開作業(yè)《公共關系學》實訓項目1:公關三要素分析(六選一)參考552
- 碳排放核算與報告要求 第XX部分:鉛冶煉企業(yè)
- 物業(yè)及物業(yè)管理:提升旅游景區(qū)品質
評論
0/150
提交評論