




版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
PAGEPAGE151單片機(jī)程序設(shè)計(jì)實(shí)訓(xùn)100例第一篇:51單片機(jī)程序設(shè)計(jì)實(shí)訓(xùn)100例《單片機(jī)C語(yǔ)言程序設(shè)計(jì)實(shí)訓(xùn)100例基于8051和PROTEUS仿真》案例《單片機(jī)C語(yǔ)言程序設(shè)計(jì)實(shí)訓(xùn)100例—基于8051+Proteus仿真》案例第01篇基礎(chǔ)程序設(shè)計(jì)01閃爍的LED/*名稱(chēng):閃爍的LED*/#include#defineucharunsignedchar#defineuintunsignedintsbitLED=P1^0;//延時(shí)voidDelayMS(uintx){uchari;while(x--){說(shuō)明:LED按設(shè)定的時(shí)間間隔閃爍for(i=0;i<120XX++);}}//主程序voidmain(){}while(1){}LED=~LED;DelayMS(150);02從左到右的流水燈/*名稱(chēng):從左到右的流水燈說(shuō)明:接在P0口的8個(gè)LED從左到右循環(huán)依次點(diǎn)亮,產(chǎn)生走馬燈效果*/#include#include#defineucharunsignedchar#defineuintunsignedint上海師范大學(xué)信息與機(jī)電工程學(xué)院—倪繼鋒《單片機(jī)C語(yǔ)言程序設(shè)計(jì)實(shí)訓(xùn)100例基于8051和PROTEUS仿真》案例//延時(shí)voidDelayMS(uintx){uchari;while(x--){for(i=0;i<120XX++);}}//主程序voidmain(){P0=0xfe;}038只LED左右來(lái)回點(diǎn)亮/*名稱(chēng):8只LED左右來(lái)回點(diǎn)亮說(shuō)明:程序利用循環(huán)移位函數(shù)_crol_和_cror_形成來(lái)回滾動(dòng)的效果*/#include#include#defineucharunsignedchar#defineuintunsignedint//延時(shí)voidDelayMS(uintx){uchari;while(x--){}for(i=0;i<120XX++);while(1){P0=_crol_(P0,1);//P0的值向左循環(huán)移動(dòng)DelayMS(150);}}//主程序voidmain(){uchari;P2=0x01;while(1){上海師范大學(xué)信息與機(jī)電工程學(xué)院—倪繼鋒《單片機(jī)C語(yǔ)言程序設(shè)計(jì)實(shí)訓(xùn)100例基于8051和PROTEUS仿真》案例}}for(i=0;i<7;i++){P2=_crol_(P2,1);//P2的值向左循環(huán)移動(dòng)DelayMS(150);}for(i=0;i<7;i++){P2=_cror_(P2,1);//P2的值向右循環(huán)移動(dòng)}DelayMS(150);04花樣流水燈/*名稱(chēng):花樣流水燈說(shuō)明:16只LED分兩組按預(yù)設(shè)的多種花樣變換顯示*/#include#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,上海師范大學(xué)信息與機(jī)電工程學(xué)院—倪繼鋒《單片機(jī)C語(yǔ)言程序設(shè)計(jì)實(shí)訓(xùn)100例基于8051和PROTEUS仿真》案例0x00,0xff,0x00,0xff,0x00,0xff,0x00,0xff};//延時(shí)voidDelayMS(uintx){uchari;while(x--){}for(i=0;i<120XX++);}//主程序voidmain(){uchari;while(1){//從數(shù)組中讀取數(shù)據(jù)送至P0和P2口顯示}for(i=0;i<136;i++){}P0=Pattern_P0[i];P2=Pattern_P2[i];DelayMS(100);}05LED模擬交通燈/*名稱(chēng):LED模擬交通燈說(shuō)明:東西向綠燈亮若干秒,黃燈閃爍5次后紅燈亮,紅燈亮后,南北向由紅燈變?yōu)榫G燈,若干秒后南北向黃燈閃爍5此后變紅燈,東西向變綠燈,如此重復(fù)。*/#include#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ù),操作類(lèi)型變量上海師范大學(xué)信息與機(jī)電工程學(xué)院—倪繼鋒《單片機(jī)C語(yǔ)言程序設(shè)計(jì)實(shí)訓(xùn)100例基于8051和PROTEUS仿真》案例//延時(shí)voidDelayMS(uintx){uchari;while(x--)for(i=0;i<120XX++);}//交通燈切換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(20XX);Operation_Type=2;break;case2://東西向黃燈閃爍,綠燈關(guān)閉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(20XX);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上海師范大學(xué)信息與機(jī)電工程學(xué)院—倪繼鋒《單片機(jī)C語(yǔ)言程序設(shè)計(jì)實(shí)訓(xùn)100例基于8051和PROTEUS仿真》案例/*名稱(chēng):?jiǎn)沃粩?shù)碼管循環(huán)顯示0~9*/#include#include#defineucharunsignedchar#defineuintunsignedintucharcodeDSY_CODE[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff};//延時(shí)voidDelayMS(uintx){uchart;while(x--)for(t=0;t<120XX++);}//主程序voidmain(){}uchari=0;P0=0x00;while(1){}P0=~DSY_CODE[i];i=(i+1)%10;DelayMS(300);說(shuō)明:主程序中的循環(huán)語(yǔ)句反復(fù)將0~9的段碼送至P0口,使數(shù)字0~9循環(huán)顯示078只數(shù)碼管滾動(dòng)顯示單個(gè)數(shù)字/*名稱(chēng):8只數(shù)碼管滾動(dòng)顯示單個(gè)數(shù)字說(shuō)明:數(shù)碼管從左到右依次滾動(dòng)顯示0~7,程序通過(guò)每次僅循環(huán)選通一只數(shù)碼管*/#include#include#defineucharunsignedchar#defineuintunsignedintucharcodeDSY_CODE[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//延時(shí)voidDelayMS(uintx){uchart;while(x--)for(t=0;t<120XX++);上海師范大學(xué)信息與機(jī)電工程學(xué)院—倪繼鋒《單片機(jī)C語(yǔ)言程序設(shè)計(jì)實(shí)訓(xùn)100例基于8051和PROTEUS仿真》案例}//主程序voidmain(){uchari,wei=0x80;while(1){for(i=0;i<8;i++){P2=0xff;//關(guān)閉顯示wei=_crol_(wei,1);P0=DSY_CODE[i];//發(fā)送數(shù)字段碼P2=wei;//發(fā)送位碼DelayMS(300);}}}088只數(shù)碼管動(dòng)態(tài)顯示多個(gè)不同字符電路如上圖/*名稱(chēng):8只數(shù)碼管動(dòng)態(tài)顯示多個(gè)不同字符說(shuō)明:數(shù)碼管動(dòng)態(tài)掃描顯示0~7。*/#include#include#defineucharunsignedchar#defineuintunsignedintucharcodeDSY_CODE[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//延時(shí)voidDelayMS(uintx){uchart;while(x--)for(t=0;t<120XX++);}//主程序voidmain(){uchari,wei=0x80;while(1){for(i=0;i<8;i++){P0=0xff;P0=DSY_CODE[i];//發(fā)送段碼wei=_crol_(wei,1);上海師范大學(xué)信息與機(jī)電工程學(xué)院—倪繼鋒《單片機(jī)C語(yǔ)言程序設(shè)計(jì)實(shí)訓(xùn)100例基于8051和PROTEUS仿真》案例P2=wei;//發(fā)送位碼DelayMS(2);}}}098只數(shù)碼管閃爍顯示數(shù)字串電路如上圖/*名稱(chēng):8只數(shù)碼管閃爍顯示數(shù)字串說(shuō)明:數(shù)碼管閃爍顯示由0~7構(gòu)成的一串?dāng)?shù)字本例用動(dòng)態(tài)刷新法顯示一串?dāng)?shù)字,在停止刷新時(shí)所有數(shù)字顯示消失。*/#include#defineucharunsignedchar#defineuintunsignedint//段碼表ucharcodeDSY_CODE[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//位碼表ucharcodeDSY_IDX[]={0x01,0x02,0x04,0x08,0x10,0x20XXx40,0x80};//延時(shí)voidDelayMS(uintx){uchart;while(x--)for(t=0;t<120XX++);}//主程序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;//關(guān)閉所有數(shù)碼管并延時(shí)DelayMS(1000);}}上海師范大學(xué)信息與機(jī)電工程學(xué)院—倪繼鋒《單片機(jī)C語(yǔ)言程序設(shè)計(jì)實(shí)訓(xùn)100例基于8051和PROTEUS仿真》案例8只數(shù)碼管滾動(dòng)顯示數(shù)字串電路如上圖/*名稱(chēng):8只數(shù)碼管滾動(dòng)顯示數(shù)字串說(shuō)明:數(shù)碼管向左滾動(dòng)顯示3個(gè)字符構(gòu)成的數(shù)字串*/#include#include#defineucharunsignedchar#defineuintunsignedint//段碼表ucharcodeDSY_CODE[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff};//下面數(shù)組看作環(huán)形隊(duì)列,顯示從某個(gè)數(shù)開(kāi)始的8個(gè)數(shù)(10表示黑屏)ucharNum[]={10,10,10,10,10,10,10,10,2,9,8};//延時(shí)voidDelayMS(uintx){uchart;while(x--)for(t=0;t<120XX++);}//主程序voidmain(){uchari,j,k=0,m=0x80;while(1){//刷新若干次,保持一段時(shí)間的穩(wěn)定顯示for(i=0;i<15;i++){for(j=0;j<8;j++){//發(fā)送段碼,采用環(huán)形取法,從第k個(gè)開(kāi)始取第j個(gè)P0=0xff;P0=DSY_CODE[Num[(k+j)%11]];m=_crol_(m,1);P2=m;//發(fā)送位碼DelayMS(2);}}k=(k+1)%11;//環(huán)形隊(duì)列首支針k遞增,Num下標(biāo)范圍0~10,故對(duì)11取余}}K1-K4控制LED移位/*名稱(chēng):K1-K4控制LED移位說(shuō)明:按下K1時(shí),P0口LED上移一位;上海師范大學(xué)信息與機(jī)電工程學(xué)院—倪繼鋒《單片機(jī)C語(yǔ)言程序設(shè)計(jì)實(shí)訓(xùn)100例基于8051和PROTEUS仿真》案例*/按下K2時(shí),P0口LED下移一位;按下K3時(shí),P2口LED上移一位;按下K4時(shí),P2口LED下移一位;#include#include#defineucharunsignedchar#defineuintunsignedint//延時(shí)voidDelayMS(uintx){uchari;while(x--)for(i=0;i<120XX++);}//根據(jù)P1口的按鍵移動(dòng)LEDvoidMove_LED(){if((P1&0x10)==0)P0=_cror_(P0,1);//K1elseif((P1&0x20XX=0)P0=_crol_(P0,1);//K2elseif((P1&0x40)==0)P2=_cror_(P2,1);//K3//K4elseif((P1&0x80)==0)P2=_crol_(P2,1);}//主程序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)顯示上海師范大學(xué)信息與機(jī)電工程學(xué)院—倪繼鋒《單片機(jī)C語(yǔ)言程序設(shè)計(jì)實(shí)訓(xùn)100例基于8051和PROTEUS仿真》案例/*名稱(chēng):K1-K4按鍵狀態(tài)顯示說(shuō)明:K1、K2按下時(shí)LED點(diǎn)亮,松開(kāi)時(shí)熄滅,*/#include#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;//延時(shí)voidDelayMS(uintx){uchari;while(x--)for(i=0;i<120XX++);K3、K4按下并釋放時(shí)LED點(diǎn)亮,再次按下并釋放時(shí)熄滅;}//主程序voidmain(){}K1-K4分組控制LED上海師范大學(xué)信息與機(jī)電工程學(xué)院—倪繼鋒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);《單片機(jī)C語(yǔ)言程序設(shè)計(jì)實(shí)訓(xùn)100例基于8051和PROTEUS仿真》案例/*名稱(chēng):K1-K4分組控制LED說(shuō)明:每次按下K1時(shí)遞增點(diǎn)亮一只LED,全亮?xí)r再次按下則再次循環(huán)開(kāi)始,K2按下后點(diǎn)亮上面4只LED,K3按下后點(diǎn)亮下面4只LED,K4按下后關(guān)閉所有LED*/#include#defineucharunsignedchar#defineuintunsignedint//延時(shí)voidDelayMS(uintx){uchari;while(x--)for(i=0;i<120XX++);}//主程序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所在位置,累加獲取按鍵號(hào)kwhile(Key_State!=0){k++;Key_State>>=1;}//根據(jù)按鍵號(hào)k進(jìn)行4種處理switch(k){case1:if(P0==0x00)P0=0xff;P0<<=1;DelayMS(20XX;break;P0=0xf0;break;case2:上海師范大學(xué)信息與機(jī)電工程學(xué)院—倪繼鋒《單片機(jī)C語(yǔ)言程序設(shè)計(jì)實(shí)訓(xùn)100例基于8051和PROTEUS仿真》案例}}}}case3:case4:P0=0x0f;break;P0=0xff;14K1-K4控制數(shù)碼管移位顯示/*名稱(chēng):K1-K4控制數(shù)碼管移位顯示說(shuō)明:按下K1時(shí)加1計(jì)數(shù)并增加顯示位,按下K2時(shí)減1計(jì)數(shù)并減少顯示位,按下K3時(shí)清零。*/#include#defineucharunsignedchar#defineuintunsignedint//段碼ucharcodeDSY_CODE[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff};//位碼ucharcodeDSY_Index[]={0x80,0x40,0x20XXx10,0x08,0x04,0x02,0x01};//待顯示到各數(shù)碼管的數(shù)字緩沖(開(kāi)始僅在0位顯示0,其他黑屏)ucharDisplay_Buffer[]={0,10,10,10,10,10,10,10};//延時(shí)voidDelayMS(uintx){uchari;while(x--)for(i=0;i<120XX++);}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;上海師范大學(xué)信息與機(jī)電工程學(xué)院—倪繼鋒《單片機(jī)C語(yǔ)言程序設(shè)計(jì)實(shí)訓(xùn)100例基于8051和PROTEUS仿真》案例P0=0xff;P1=0xff;P2=0x00;while(1){}Show_Count_ON_DSY();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;if(Key_Counts>0)Display_Buffer[--Key_Counts]=10;break;Display_Buffer[0]=0;for(i=1;i<8;i++)Display_Buffer[i]=10;Key_Counts=0;case0xfd:case0xfb:}//若鍵未釋放則僅刷新顯示,不進(jìn)行鍵掃描while(P1!=0xff)Show_Count_ON_DSY();}K1-K4控制數(shù)碼管加減演示/*名稱(chēng):K1-K4控制數(shù)碼管加減演示說(shuō)明:按下K1后加1計(jì)數(shù),按下K2后減1計(jì)數(shù),按下K3后清零。*/#include#include#defineucharunsignedchar#defineuintunsignedint//段碼ucharcodeDSY_CODE[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff};//待顯示的3位緩沖ucharNum_Buffer[]={0,0,0};//按鍵代碼,按鍵計(jì)數(shù)ucharKey_Code,Key_Counts=0;//延時(shí)voidDelayMS(uintx){上海師范大學(xué)信息與機(jī)電工程學(xué)院—倪繼鋒《單片機(jī)C語(yǔ)言程序設(shè)計(jì)實(shí)訓(xùn)100例基于8051和PROTEUS仿真》案例uchari;while(x--)for(i=0;i<120XX++);}//顯示函數(shù)voidShow_Counts_ON_DSY(){uchari,j=0x01;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í),數(shù)碼管刷新顯示30次,該行代碼同時(shí)起到延時(shí)作用if(Key_Code!=0xff)for(i=0;i<30;i++)Show_Counts_ON_DSY();switch(Key_Code){case0xfe:if(Key_Counts<255)Key_Counts++;break;case0xfd:if(Key_Counts>0)Key_Counts--;break;case0xfb:Key_Counts=0;}Key_Code=0xff;}上海師范大學(xué)信息與機(jī)電工程學(xué)院—倪繼鋒《單片機(jī)C語(yǔ)言程序設(shè)計(jì)實(shí)訓(xùn)100例基于8051和PROTEUS仿真》案例}4X4矩陣鍵盤(pán)控制條形LED顯示/*名稱(chēng):4X4矩陣鍵盤(pán)控制條形LED顯示說(shuō)明:運(yùn)行本例時(shí),按下的按鍵值越大點(diǎn)亮的LED越多。*/#include#include#defineucharunsignedchar#defineuintunsignedint//矩陣鍵盤(pán)按鍵特征碼表ucharcodeKeyCodeTable[]={0x11,0x12,0x14,0x18,0x21,0x22,0x24,0x28,0x41,0x42,0x44,0x48,0x81,0x82,0x84,0x88};//延時(shí)voidDelayMS(uintx){uchari;while(x--)for(i=0;i<120XX++);}//鍵盤(pán)掃描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++)//對(duì)4行分別進(jìn)行掃描P1=sCode;if((P1&0xf0)!=0xf0){kCode=~P1;for(i=0;i<16;i++)//查表得到按鍵序號(hào)并返回if(kCode==KeyCodeTable[i])上海師范大學(xué)信息與機(jī)電工程學(xué)院—倪繼鋒《單片機(jī)C語(yǔ)言程序設(shè)計(jì)實(shí)訓(xùn)100例基于8051和PROTEUS仿真》案例}}return(i);elsesCode=_crol_(sCode,1);}}return(-1);}//主程序voidmain(){uchari,P2_LED,P3_LED;ucharKeyNo=-1;//按鍵序號(hào),-1表示無(wú)按鍵}while(1){KeyNo=Keys_Scan();//掃描鍵盤(pán)獲取按鍵序號(hào)KeyNoif(KeyNo!=-1){}}P2_LED=0xff;P3_LED=0xff;for(i=0;i<=KeyNo;i++)//鍵值越大,點(diǎn)亮的LED越多{if(i<8)P3_LED>>=1;elseP2_LED>>=1;}P3=P3_LED;//點(diǎn)亮條形LEDP2=P2_LED;數(shù)碼管顯示4X4矩陣鍵盤(pán)按鍵號(hào)/*名稱(chēng):數(shù)碼管顯示4X4矩陣鍵盤(pán)按鍵號(hào)說(shuō)明:按下任意鍵時(shí),數(shù)碼管都會(huì)顯示其鍵的序號(hào),掃描程序首先判斷按鍵發(fā)生在哪一列,然后根據(jù)所發(fā)生的行附加不同的值,從而得到按鍵的序號(hào)。*/上海師范大學(xué)信息與機(jī)電工程學(xué)院—倪繼鋒《單片機(jī)C語(yǔ)言程序設(shè)計(jì)實(shí)訓(xùn)100例基于8051和PROTEUS仿真》案例#include#defineucharunsignedchar#defineuintunsignedint//段碼ucharcodeDSY_CODE[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0x00};sbitBEEP=P3^7;//上次按鍵和當(dāng)前按鍵的序號(hào),該矩陣中序號(hào)范圍0~15,16表示無(wú)按鍵ucharPre_KeyNo=16,KeyNo=16;//延時(shí)voidDelayMS(uintx){uchari;while(x--)for(i=0;i<120XX++);}//矩陣鍵盤(pán)掃描voidKeys_Scan(){ucharTmp;P1=0x0f;//高4位置0,放入4行DelayMS(1);Tmp=P1^0x0f;//按鍵后0f變成0000XXXX,X中一個(gè)為0,3個(gè)仍為1,通過(guò)異或把3個(gè)1變?yōu)?,唯一的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;//無(wú)鍵按下}P1=0xf0;//低4位置0,放入4列DelayMS(1);Tmp=P1>>4^0x0f;//按鍵后f0變成XXXX0000,X中有1個(gè)為0,三個(gè)仍為1;高4位轉(zhuǎn)移到低4位并異或得到改變的值switch(Tmp)//對(duì)0~3行分別附加起始值0,4,8,12{}case1:case2:case4:case8:KeyNo+=0;break;KeyNo+=4;break;KeyNo+=8;break;KeyNo+=12;}//蜂鳴器voidBeep()上海師范大學(xué)信息與機(jī)電工程學(xué)院—倪繼鋒《單片機(jī)C語(yǔ)言程序設(shè)計(jì)實(shí)訓(xùn)100例基于8051和PROTEUS仿真》案例{uchari;for(i=0;i<100;i++){}DelayMS(1);BEEP=~BEEP;BEEP=0;}//主程序voidmain(){P0=0x00;}BEEP=0;while(1){}P1=0xf0;if(P1!=0xf0)Keys_Scan();//獲取鍵序號(hào)if(Pre_KeyNo!=KeyNo){}P0=~DSY_CODE[KeyNo];Beep();Pre_KeyNo=KeyNo;DelayMS(100);18開(kāi)關(guān)控制LED/*名稱(chēng):開(kāi)關(guān)控制LED說(shuō)明:開(kāi)關(guān)S1和S2分別控制LED1和LED2。*/#includesbitS1=P1^0;sbitS2=P1^1;sbitLED1=P0^0;sbitLED2=P0^1;//主程序voidmain(){while(1){LED1=S1;上海師范大學(xué)信息與機(jī)電工程學(xué)院—倪繼鋒《單片機(jī)C語(yǔ)言程序設(shè)計(jì)實(shí)訓(xùn)100例基于8051和PROTEUS仿真》案例}}LED2=S2;19繼電器控制照明設(shè)備/*名稱(chēng):繼電器控制照明設(shè)備說(shuō)明:按下K1燈點(diǎn)亮,再次按下時(shí)燈熄滅*/#include#defineucharunsignedchar#defineuintunsignedintsbitK1=P1^0;sbitRELAY=P2^4;//延時(shí)voidDelayMS(uintms){uchart;while(ms--)for(t=0;t<120XX++);}//主程序voidmain(){}數(shù)碼管顯示撥碼開(kāi)關(guān)編碼/*名稱(chēng):數(shù)碼管顯示撥碼開(kāi)關(guān)編碼*/#include#include#defineucharunsignedchar上海師范大學(xué)信息與機(jī)電工程學(xué)院—倪繼鋒P1=0xff;RELAY=1;while(1){}if(K1==0){}while(K1==0);RELAY=~RELAY;DelayMS(20XX說(shuō)明:系統(tǒng)顯示撥碼開(kāi)關(guān)所設(shè)置的編碼000~255《單片機(jī)C語(yǔ)言程序設(shè)計(jì)實(shí)訓(xùn)100例基于8051和PROTEUS仿真》案例#defineuintunsignedint//各數(shù)字的數(shù)碼管段碼(共陰)ucharcodeDSY_CODE[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//顯示緩沖ucharDSY_Buffer[3]={0,0,0};//延時(shí)voidDelayMS(uintms){uchart;while(ms--)for(t=0;t<120XX++);}//主程序voidmain(){}uchari,m,Num;P0=0xff;P2=0xff;while(1){}m=0xfe;Num=P1;//讀取撥碼開(kāi)關(guān)的值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);開(kāi)關(guān)控制報(bào)警器/*名稱(chēng):開(kāi)關(guān)控制報(bào)警器說(shuō)明:用K1開(kāi)關(guān)控制報(bào)警器,程序控制P1.0輸出兩種不同頻率的聲音,模擬很逼真的報(bào)警效果*/#include#defineucharunsignedchar#defineuintunsignedintsbitSPK=P1^0;sbitK1=P1^7;//發(fā)聲函數(shù)上海師范大學(xué)信息與機(jī)電工程學(xué)院—倪繼鋒《單片機(jī)C語(yǔ)言程序設(shè)計(jì)實(shí)訓(xùn)100例基于8051和PROTEUS仿真》案例voidAlarm(uchart){}voidmain(){}按鍵發(fā)音/*名稱(chēng):按鍵發(fā)音說(shuō)明:按下不同的按鍵會(huì)是SOUNDER發(fā)出不同頻率的聲音。本例使用延時(shí)函數(shù)實(shí)現(xiàn)不同頻率的聲音輸出,以后也可使用定時(shí)器*/#include#defineucharunsignedchar#defineuintunsignedintsbitBEEP=P3^7;sbitK1=P1^4;sbitK2=P1^5;sbitK3=P1^6;sbitK4=P1^7;//延時(shí)voidDelayMS(uintx){uchart;SPK=0;while(1){}if(K1==1){}Alarm(90);Alarm(120XXuchari,j;for(i=0;i<20XXi++){}SPK=~SPK;for(j=0;jwhile(x--)for(t=0;t<120XX++);}//按周期t發(fā)音voidPlay(uchart){上海師范大學(xué)信息與機(jī)電工程學(xué)院—倪繼鋒《單片機(jī)C語(yǔ)言程序設(shè)計(jì)實(shí)訓(xùn)100例基于8051和PROTEUS仿真》案例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);if(K2==0)Play(2);if(K3==0)Play(3);if(K4==0)Play(4);}}播放音樂(lè)/*名稱(chēng):播放音樂(lè)說(shuō)明:程序運(yùn)行時(shí)播放生日快樂(lè)歌,未使用定時(shí)器中斷,所有頻率完全用延時(shí)實(shí)現(xiàn)*/#include#defineucharunsignedchar#defineuintunsignedintsbitBEEP=P3^7;//生日快樂(lè)歌的音符頻率表,不同頻率由不同的延時(shí)來(lái)決定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};//生日快樂(lè)歌節(jié)拍表,節(jié)拍決定每個(gè)音符的演奏長(zhǎng)短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};//延時(shí)voidDelayMS(uintx){uchart;while(x--)for(t=0;t<120XX++);}//播放函數(shù)voidPlayMusic(){上海師范大學(xué)信息與機(jī)電工程學(xué)院—倪繼鋒《單片機(jī)C語(yǔ)言程序設(shè)計(jì)實(shí)訓(xùn)100例基于8051和PROTEUS仿真》案例}uinti=0,j,k;while(SONG_LONG[i]!=0||SONG_TONE[i]!=0){//播放各個(gè)音符,SONG_LONG為拍子長(zhǎng)度}for(j=0;j}DelayMS(10);i++;BEEP=~BEEP;//SONG_TONE延時(shí)表決定了每個(gè)音符的頻率for(k=0;k}BEEP=0;while(1){}PlayMusic();//播放生日快樂(lè)DelayMS(500);//播放完后暫停一段時(shí)間INT0中斷計(jì)數(shù)/*名稱(chēng):INT0中斷計(jì)數(shù)說(shuō)明:每次按下計(jì)數(shù)鍵時(shí)觸發(fā)INT0中斷,中斷程序累加計(jì)數(shù),計(jì)數(shù)值顯示在3只數(shù)碼管上,按下清零鍵時(shí)數(shù)碼管清零*/#include#defineucharunsignedchar#defineuintunsignedint//0~9的段碼ucharcodeDSY_CODE[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00};//計(jì)數(shù)值分解后各個(gè)待顯示的數(shù)位ucharDSY_Buffer[]={0,0,0};ucharCount=0;sbitClear_Key=P3^6;//數(shù)碼管上顯示計(jì)數(shù)值voidShow_Count_ON_DSY(){DSY_Buffer[2]=Count/100;//獲取3個(gè)數(shù)上海師范大學(xué)信息與機(jī)電工程學(xué)院—倪繼鋒《單片機(jī)C語(yǔ)言程序設(shè)計(jì)實(shí)訓(xùn)100例基于8051和PROTEUS仿真》案例DSY_Buffer[1]=Count%100/10;DSY_Buffer[0]=Count%10;if(DSY_Buffer[2]==0)//高位為0時(shí)不顯示{}P0=DSY_CODE[DSY_Buffer[0]];P1=DSY_CODE[DSY_Buffer[1]];DSY_Buffer[2]=0x0a;if(DSY_Buffer[1]==0)//高位為0,若第二位為0同樣不顯示DSY_Buffer[1]=0x0a;P2=DSY_CODE[DSY_Buffer[2]];}//主程序voidmain(){P0=0x00;P1=0x00;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++;//計(jì)數(shù)值遞增}外部INT0中斷控制LED/*名稱(chēng):外部INT0中斷控制LED說(shuō)明:每次按鍵都會(huì)觸發(fā)INT0中斷,中斷發(fā)生時(shí)將LED狀態(tài)取反,產(chǎn)生LED狀態(tài)由按鍵控制的效果*/#include#defineucharunsignedchar#defineuintunsignedintsbitLED=P0^0;//主程序voidmain()上海師范大學(xué)信息與機(jī)電工程學(xué)院—倪繼鋒《單片機(jī)C語(yǔ)言程序設(shè)計(jì)實(shí)訓(xùn)100例基于8051和PROTEUS仿真》案例{LED=1;EA=1;EX0=1;IT0=1;while(1);}//INT0中斷函數(shù)voidEX_INT0()interrupt0{}INT0及INT1中斷計(jì)數(shù)/*名稱(chēng):INT0及INT1中斷計(jì)數(shù)說(shuō)明:每次按下第1個(gè)計(jì)數(shù)鍵時(shí),第1組計(jì)數(shù)值累加并顯示在右邊3只數(shù)碼管上,每次按下第2個(gè)計(jì)數(shù)鍵時(shí),第2組計(jì)數(shù)值累加并顯示在左邊3只數(shù)碼管上,后兩個(gè)按鍵分別清零。*/#include#defineucharunsignedchar#defineuintunsignedintsbitK3=P3^4;//2個(gè)清零鍵sbitK4=P3^5;//數(shù)碼管段碼與位碼ucharcodeDSY_CODE[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff};ucharcodeDSY_Scan_Bits[]={0x20XXx10,0x08,0x04,0x02,0x01};//2組計(jì)數(shù)的顯示緩沖,前3位一組,后3位一組uchardataBuffer_Counts[]={0,0,0,0,0,0};uintCount_A,Count_B=0;//延時(shí)voidDelayMS(uintx){uchart;while(x--)for(t=0;t<120XX++);LED=~LED;//控制LED亮滅}//數(shù)據(jù)顯示voidShow_Counts(){uchari;Buffer_Counts[2]=Count_A/100;Buffer_Counts[1]=Count_A%100/10;Buffer_Counts[0]=Count_A%10;上海師范大學(xué)信息與機(jī)電工程學(xué)院—倪繼鋒《單片機(jī)C語(yǔ)言程序設(shè)計(jì)實(shí)訓(xùn)100例基于8051和PROTEUS仿真》案例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]];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++;上海師范大學(xué)信息與機(jī)電工程學(xué)院—倪繼鋒《單片機(jī)C語(yǔ)言程序設(shè)計(jì)實(shí)訓(xùn)100例基于8051和PROTEUS仿真》案例}定時(shí)器控制單只LED/*名稱(chēng):定時(shí)器控制單只LED說(shuō)明:LED在定時(shí)器的中斷例程控制下不斷閃爍。*/#include#defineucharunsignedchar#defineuintunsignedintsbitLED=P0^0;ucharT_Count=0;//主程序voidmain(){TMOD=0x00;//定時(shí)器0工作方式0TH0=(8192-5000)/32;//5ms定時(shí)TL0=(8192-5000)%32;IE=0x82;//允許T0中斷TR0=1;while(1);}//T0中斷函數(shù)voidLED_Flash()interrupt1{}TH0=(8192-5000)/32;//恢復(fù)初值TL0=(8192-5000)%32;if(++T_Count==100)//0.5s開(kāi)關(guān)一次LED{}LED=~LED;T_Count=0;TIMER0控制流水燈/*名稱(chēng):TIMER0控制流水燈說(shuō)明:定時(shí)器控制P0、P2口的LED滾動(dòng)顯示,本例未使用中斷函數(shù)。*/#include#include#defineucharunsignedchar#defineuintunsignedint上海師范大學(xué)信息與機(jī)電工程學(xué)院—倪繼鋒《單片機(jī)C語(yǔ)言程序設(shè)計(jì)實(shí)訓(xùn)100例基于8051和PROTEUS仿真》案例//主程序voidmain(){ucharT_Count=0;P0=0xfe;P2=0xfe;TMOD=0x01;TH0=(65536-40000)/256;//定時(shí)器0工作方式1//40ms定時(shí)TL0=(65536-40000)%256;TR0=1;//啟動(dòng)定時(shí)器while(1){if(TF0==1){}TF0=0;TH0=(65536-40000)/256;//恢復(fù)初值TL0=(65536-40000)%256;if(++T_Count==5){}P0=_crol_(P0,1);P2=_crol_(P2,1);T_Count=0;}}定時(shí)器控制4個(gè)LED滾動(dòng)閃爍/*名稱(chēng):定時(shí)器控制4個(gè)LED滾動(dòng)閃爍說(shuō)明:4只LED在定時(shí)器控制下滾動(dòng)閃爍。*/#include#defineucharunsignedchar#defineuintunsignedintsbitB1=P0^0;sbitG1=P0^1;sbitR1=P0^2;sbitY1=P0^3;uinti,j,k;//主程序voidmain(){i=j=k=0;P0=0xff;上海師范大學(xué)信息與機(jī)電工程學(xué)院—倪繼鋒《單片機(jī)C語(yǔ)言程序設(shè)計(jì)實(shí)訓(xùn)100例基于8051和PROTEUS仿真》案例TMOD=0x02;TH0=256-20XXTL0=256-20XXIE=0x82;TR0=1;//定時(shí)器0工作方式2//20XXs定時(shí)//啟動(dòng)定時(shí)器while(1);}//T0中斷函數(shù)voidLED_Flash_and_Scroll()interrupt1{if(++k<35)k=0;switch(i){case0:case1:case2:B1=~B1;break;G1=~G1;break;R1=~R1;break;return;//定時(shí)中斷若干次后執(zhí)行閃爍case3:Y1=~Y1;break;default:i=0;}if(++j<300)return;//每次閃爍持續(xù)一段時(shí)間j=0;P0=0xff;//關(guān)閉顯示i++;//切換到下一個(gè)LED}T0控制LED實(shí)現(xiàn)二進(jìn)制計(jì)數(shù)/*名稱(chēng):T0控制LED實(shí)現(xiàn)二進(jìn)制計(jì)數(shù)說(shuō)明:本例對(duì)按鍵的計(jì)數(shù)沒(méi)有使用查詢(xún)法,沒(méi)有使用外部中斷函數(shù),沒(méi)有使用定時(shí)或計(jì)數(shù)中斷函數(shù)。而是啟用了計(jì)數(shù)器,連接在T0引腳的按鍵每次按下時(shí),會(huì)使計(jì)數(shù)寄存器的值遞增,其值通過(guò)LED以二進(jìn)制形式顯示*/#include//主程序voidmain(){TMOD=0x05;//定時(shí)器0為計(jì)數(shù)器,工作方式1,最大計(jì)數(shù)值65535TH0=0;//初值為0TL0=0;TR0=1;while(1)上海師范大學(xué)信息與機(jī)電工程學(xué)院—倪繼鋒//啟動(dòng)定時(shí)器《單片機(jī)C語(yǔ)言程序設(shè)計(jì)實(shí)訓(xùn)100例基于8051和PROTEUS仿真》案例{}P1=TH0;P2=TL0;}TIMER0與TIMER1控制條形LED/*名稱(chēng):TIMER0與TIMER1控制條形LED說(shuō)明:定時(shí)器T0定時(shí)控制上一組條形LED,滾動(dòng)速度較快定時(shí)器T1定時(shí)控制下一組條形LED,滾動(dòng)速度較慢*/#include#include#defineucharunsignedchar#defineuintunsignedintuchartc0=0,tc1=0;//主程序voidmain(){P0=0xfe;P2=0xfe;TMOD=0x11;//定時(shí)器0、定時(shí)器1均工作于方式1TH0=(65536-15000)/256;//定時(shí)器0:15ms//定時(shí)器1:50msTL0=(65536-15000)%256;TH1=(65536-50000)/256;TL1=(65536-50000)%256;IE=0x8a;TR0=1;//啟動(dòng)定時(shí)器TR1=1;while(1);}//T0中斷函數(shù)voidTime0()interrupt1{TH0=(65536-15000)/256;//恢復(fù)定時(shí)器0初值TL0=(65536-15000)%256;if(++tc0==10)//150ms轉(zhuǎn)換狀態(tài){tc0=0;P0=_crol_(P0,1);}}//T1中斷函數(shù)上海師范大學(xué)信息與機(jī)電工程學(xué)院—倪繼鋒《單片機(jī)C語(yǔ)言程序設(shè)計(jì)實(shí)訓(xùn)100例基于8051和PROTEUS仿真》案例voidTime1()interrupt3{TH0=(65536-50000)/256;}10s的秒表//恢復(fù)定時(shí)器1初值TL0=(65536-50000)%256;if(++tc1==10)//500ms轉(zhuǎn)換狀態(tài){}tc1=0;P2=_crol_(P2,1);/*名稱(chēng):10s的秒表說(shuō)明:首次按鍵計(jì)時(shí)開(kāi)始,再次按鍵暫停,第三次按鍵清零。*/#include#defineucharunsignedchar#defineuintunsignedintsbitK1=P3^7;uchari,Second_Counts,Key_Flag_Idx;bitKey_State;ucharDSY_CODE[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//延時(shí)voidDelayMS(uintms){uchart;while(ms--)for(t=0;t<120XX++);}//處理按鍵事件voidKey_Event_Handle(){if(Key_State==0){Key_Flag_Idx=(Key_Flag_Idx+1)%3;switch(Key_Flag_Idx){}case1:case2:case0:EA=1;ET0=1;TR0=1;break;EA=0;ET0=0;TR0=0;break;P0=0x3f;P2=0x3f;i=0;Second_Counts=0;上海師范大學(xué)信息與機(jī)電工程學(xué)院—倪繼鋒《單片機(jī)C語(yǔ)言程序設(shè)計(jì)實(shí)訓(xùn)100例基于8051和PROTEUS仿真》案例}}//主程序voidmain(){P0=0x3f;//顯示00P2=0x3f;i=0;Second_Counts=0;Key_Flag_Idx=0;//按鍵次數(shù)(取值0,1,2,3)Key_State=1;//按鍵狀態(tài)TMOD=0x01;//定時(shí)器0方式1TH0=(65536-50000)/256;//定時(shí)器0:15msTL0=(65536-50000)%256;while(1){if(Key_State!=K1){DelayMS(10);Key_State=K1;Key_Event_Handle();}}}//T0中斷函數(shù)voidDSY_Refresh()interrupt1{TH0=(65536-50000)/256;//恢復(fù)定時(shí)器0初值TL0=(65536-50000)%256;if(++i==2)//50ms*2=0.1s轉(zhuǎn)換狀態(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;//滿(mǎn)100(10s)后顯示00}}用計(jì)數(shù)器中斷實(shí)現(xiàn)100以?xún)?nèi)的按鍵計(jì)數(shù)/*名稱(chēng):用計(jì)數(shù)器中斷實(shí)現(xiàn)100以?xún)?nèi)的按鍵計(jì)數(shù)說(shuō)明:本例用T0計(jì)數(shù)器中斷實(shí)現(xiàn)按鍵技術(shù),由于計(jì)數(shù)寄存器初值為1,因此P3.4引腳的每次負(fù)跳變都會(huì)觸發(fā)T0中斷,實(shí)現(xiàn)計(jì)數(shù)值累加。計(jì)數(shù)器的清零用外部中斷0控制。上海師范大學(xué)信息與機(jī)電工程學(xué)院—倪繼鋒《單片機(jī)C語(yǔ)言程序設(shè)計(jì)實(shí)訓(xùn)100例基于8051和PROTEUS仿真》案例*/#include#defineucharunsignedchar#defineuintunsignedint//段碼ucharcodeDSY_CODE[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00};ucharCount=0;//主程序voidmain(){P0=0x00;//計(jì)數(shù)器T0方式2//計(jì)數(shù)值為1//允許T0中斷//允許INT0中斷//允許CPU中斷P2=0x00;TMOD=0x06;TH0=TL0=256-1;ET0=1;EX0=1;EA=1;IP=0x02;IT0=1;TR0=1;while(1){//設(shè)置優(yōu)先級(jí),T0高于INT0//INT0中斷觸發(fā)方式為下降沿觸發(fā)//啟動(dòng)T0P0=DSY_CODE[Count/10];P2=DSY_CODE[Count%10];}}//T0計(jì)數(shù)器中斷函數(shù)voidKey_Counter()interrupt1{Count=(Count+1)%100;//因?yàn)橹挥袃晌粩?shù)碼管,計(jì)數(shù)控制在100以?xún)?nèi)(00~99)}//INT0中斷函數(shù)voidClear_Counter()interrupt0{}Count=0;上海師范大學(xué)信息與機(jī)電工程學(xué)院—倪繼鋒《單片機(jī)C語(yǔ)言程序設(shè)計(jì)實(shí)訓(xùn)100例基于8051和PROTEUS仿真》案例100000s以?xún)?nèi)的計(jì)時(shí)程序/*名稱(chēng):100000s以?xún)?nèi)的計(jì)時(shí)程序說(shuō)明:在6只數(shù)碼管上完成0~99999.9s。*/#include#include#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;//延時(shí)voidDelayMS(uintms){uchart;while(ms--)for(t=0;t<120XX++);}//主程序voidmain(){uchari,j;P0=0x00;P3=0xff;Count=0;TMOD=0x01;TH0=(65536-50000)/256;//計(jì)數(shù)器T0方式1//50ms定時(shí)TL0=(65536-50000)%256;IE=0x82;TR0=1;//啟動(dòng)T0while(1){j=0x7f;//顯示Digits_of_6DSY[5]~Digits_of_6DSY[0]的內(nèi)容//前面高位,后面低位,循環(huán)中i!=-1亦可寫(xiě)成i!=0xfffor(i=5;i!=-1;i--){j=_crol_(j,1);上海師范大學(xué)信息與機(jī)電工程學(xué)院—倪繼鋒《單片機(jī)C語(yǔ)言程序設(shè)計(jì)實(shí)訓(xùn)100例基于8051和PROTEUS仿真》案例P3=j;P0=DSY_CODE[Digits_of_6DSY[i]];if(i==1)Dot=1;//加小數(shù)點(diǎn)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++)//進(jìn)位處理{if(Digits_of_6DSY[i]==10){Digits_of_6DSY[i]=0;if(i!=5)Digits_of_6DSY[i+1]++;//如果0~4位則分別向高一位進(jìn)位//若某低位沒(méi)有進(jìn)位,怎循環(huán)提前結(jié)束//恢復(fù)初值}elsebreak;}}定時(shí)器控制數(shù)碼管動(dòng)態(tài)顯示/*名稱(chēng):定時(shí)器控制數(shù)碼管動(dòng)態(tài)顯示說(shuō)明:8個(gè)數(shù)碼管上分兩組動(dòng)態(tài)顯示年月日與時(shí)分秒,本例的位顯示延時(shí)用定時(shí)器實(shí)現(xiàn)。*/#include#include#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;上海師范大學(xué)信息與機(jī)電工程學(xué)院—倪繼鋒《單片機(jī)C語(yǔ)言程序設(shè)計(jì)實(shí)訓(xùn)100例基于8051和PROTEUS仿真》案例uintt=0;//主程序voidmain(){P3=0x80;//位碼初值TMOD=0x00;//計(jì)數(shù)器T0方式0TH0=(8192-4000)/32;//4ms定時(shí)TL0=(8192-4000)%32;IE=0x82;TR0=1;//啟動(dòng)T0while(1);}//T0中斷函數(shù)控制數(shù)碼管刷新顯示voidDSY_Show()interrupt1{TH0=(8192-4000)/32;//恢復(fù)初值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;//保持刷新一段時(shí)間t=0;i=(i+1)%2;//數(shù)組行i=0時(shí)顯示年月日,i=1時(shí)顯示時(shí)分秒}8X8LED點(diǎn)陣顯示數(shù)字/*名稱(chēng):8X8LED點(diǎn)陣顯示數(shù)字說(shuō)明:8X8LED點(diǎn)陣屏循環(huán)顯示數(shù)字0~9,刷新過(guò)程由定時(shí)器中斷完成。*/#include#include#defineucharunsignedchar#defineuintunsignedintucharcodeTable_of_Digits[]={0x00,0x3e,0x41,0x41,0x41,0x3e,0x00,0x00,0x00,0x00,0x00,0x21,0x7f,0x01,0x00,0x00,0x00,0x27,0x45,0x45,0x45,0x39,0x00,0x00,0x00,0x22,0x49,0x49,0x49,0x36,0x00,0x00,0x00,0x0c,0x14,0x24,0x7f,0x04,0x00,0x00,//0//1//2//3//4上海師范大學(xué)信息與機(jī)電工程學(xué)院—倪繼鋒《單片機(jī)C語(yǔ)言程序設(shè)計(jì)實(shí)訓(xùn)100例基于8051和PROTEUS仿真》案例0x00,0x72,0x51,0x51,0x51,0x4e,0x00,0x00,0x00,0x3e,0x49,0x49,0x49,0x26,0x00,0x00,0x00,0x40,0x40,0x40,0x4f,0x70,0x00,0x00,0x00,0x36,0x49,0x49,0x49,0x36,0x00,0x00,//5//6//7//8//90x00,0x32,0x49,0x49,0x49,0x3e,0x00,0x00};uchari=0,t=0,Num_Index;//主程序voidmain(){P3=0x80;Num_Index=0;TMOD=0x00;//從0開(kāi)始顯示//T0方式0//2ms定時(shí)TH0=(8192-20XX)/32;TL0=(8192-20XX)%32;IE=0x82;TR0=1;//啟動(dòng)T0while(1);}//T0中斷函數(shù)voidLED_Screen_Display()interrupt1{TH0=(8192-20XX)/32;//恢復(fù)初值}按鍵控制8X8LED點(diǎn)陣屏顯示圖形/*名稱(chēng):按鍵控制8X8LED點(diǎn)陣屏顯示圖形說(shuō)明:每次按下K1時(shí),會(huì)使8X8LED點(diǎn)陣屏循環(huán)顯示不同圖形。本例同時(shí)使用外部中斷和定時(shí)中斷。*/#include上海師范大學(xué)信息與機(jī)電工程學(xué)院—倪繼鋒TL0=(8192-20XX)%32;P0=0xff;//輸出位碼和段碼P0=~Table_of_Digits[Num_Index*8+i];P3=_crol_(P3,1);if(++i==8)i=0;//每屏一個(gè)數(shù)字由8個(gè)字節(jié)構(gòu)成if(++t==250){}//每個(gè)數(shù)字刷新顯示一段時(shí)間t=0;if(++Num_Index==10)Num_Index=0;//顯示下一個(gè)數(shù)字《單片機(jī)C語(yǔ)言程序設(shè)計(jì)實(shí)訓(xùn)100例基于8051和PROTEUS仿真》案例#include#defineucharunsignedchar#defineuintunsignedint//待顯示圖形編碼ucharcodeM[][8]={{0x00,0x7e,0x7e,0x7e,0x7e,0x7e,0x7e,0x00},//圖1{0x00,0x38,0x44,0x54,0x44,0x38,0x00,0x00},//圖2{0x00,0x20XXx30,0x38,0x3c,0x3e,0x00,0x00}//圖3};uchari,j;//主程序voidmain(){P0=0xff;P1=0xff;TMOD=0x01;//T0方式1TH0=(65536-20XX)/256;//2ms定時(shí)TL0=(65536-20XX)%256;IT0=1;//下降沿觸發(fā)IE=0x83;//允許定時(shí)器0、外部0中斷i=0xff;//i的初值設(shè)為0xff,加1后將從0開(kāi)始while(1);}//T0中斷控制點(diǎn)陣屏顯示voidShow_Dot_Matrix()interrupt1{TH0=(65536-20XX)/256;//恢復(fù)初值TL0=(65536-20XX)%256;P0=0xff;//輸出位碼和段碼P0=~M[i][j];P1=_crol_(P1,1);j=(j+1)%8;}//INT0中斷(定時(shí)器由鍵盤(pán)中斷啟動(dòng))voidKey_Down()interrupt0{P0=0xff;P1=0x80;j=0;i=(i+1)%3;//i在0,1,2中取值,因?yàn)橹灰?個(gè)圖形TR0=1;}用定時(shí)器設(shè)計(jì)的門(mén)鈴上海師范大學(xué)信息與機(jī)電工程學(xué)院—倪繼鋒《單片機(jī)C語(yǔ)言程序設(shè)計(jì)實(shí)訓(xùn)100例基于8051和PROTEUS仿真》案例/*名稱(chēng):用定時(shí)器設(shè)計(jì)的門(mén)鈴*/#include#defineucharunsignedchar#defineuintunsignedintsbitKey=P1^7;sbitDoorBell=P3^0;uintp=0;//主程序voidmain(){DoorBell=0;TMOD=0x00;//T0方式0說(shuō)明:按下按鍵時(shí)蜂鳴器發(fā)出叮咚的門(mén)鈴聲。TH0=(8192-700)/32;//700us定時(shí)TL0=(8192-700)%32;IE=0x82;while(1){if(Key==0){//按下按鍵啟動(dòng)定時(shí)器TR0=1;while(Key==0);}}}//T0中斷控制點(diǎn)陣屏顯示voidTimer0()interrupt1{DoorBell=~DoorBell;p++;if(p<400)//若需要拖長(zhǎng)聲音,可以調(diào)整400和800{}{}else{TR0=0;上海師范大學(xué)信息與機(jī)電工程學(xué)院—倪繼鋒TH0=(8192-700)/32;//700us定時(shí)TL0=(8192-700)%32;elseif(p<800)TH0=(8192-1000)/32;//1ms定時(shí)TL0=(8192-1000)%32;《單片機(jī)C語(yǔ)言程序設(shè)計(jì)實(shí)訓(xùn)100例基于8051和PROTEUS仿真》案例}}p=0;39演奏音階/*名稱(chēng):演奏音階說(shuō)明:本例使用定時(shí)器演奏一段音階,播放由K1控制。*/#include#defineucharunsignedchar#defineuintunsignedintsbitK1=P1^0;sbitSPK=P3^4;uinti=0;//音符索引//14個(gè)音符放在方式2下的定時(shí)寄存器(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,20XX,8,6,2,23,5,26,1,4,3};//定時(shí)器0中斷函數(shù)voidT0_INT()interrupt1{TL0=LO_LIST[i];TH0=HI_LIST[i];SPK=~SPK;}//延時(shí)voidDelayMS(uintms){uchart;while(ms--)for(t=0;t<120XX++);}//主程序voidmain(){TMOD=0x00;IE=0x82;SPK=0;while(1){//T0方式0while(K1==1);while(K1==0);for(i=1;i<15;i++){//未按鍵等待//等待釋放上海師范大學(xué)信息與機(jī)電工程學(xué)院—倪繼鋒《單片機(jī)C語(yǔ)言程序設(shè)計(jì)實(shí)訓(xùn)100例基于8051和PROTEUS仿真》案例}}}TR0=1;DelayMS(500);TR0=0;DelayMS(50);//播放一個(gè)音符//播放延時(shí)按鍵控制定時(shí)器選播多段音樂(lè)/*名稱(chēng):按鍵控制定時(shí)器選播多段音樂(lè)說(shuō)明:本例內(nèi)置3段音樂(lè),K1可啟動(dòng)停止音樂(lè)播放,K2用于選擇音樂(lè)段。*/#include#include#defineucharunsignedchar#defineuintunsignedintsbitK1=P1^0;sbitSPK=P3^7;//播放和停止鍵//蜂鳴器//當(dāng)前音樂(lè)段索引,音符索引ucharSong_Index=0,Tone_Index=0;//數(shù)碼管段碼表ucharcodeDSY_CODE[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//標(biāo)準(zhǔn)音符頻率對(duì)應(yīng)的延時(shí)表ucharcodeHI_LIST[]={0,226,229,232,233,236,238,240,241,242,244,245,246,247,248};ucharcodeLO_LIST[]={0,4,13,10,20XX,8,6,2,23,5,26,1,4,3};//三段音樂(lè)的音符ucharcodeSong[][50]={{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. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025店面合伙經(jīng)營(yíng)協(xié)議書(shū)-咖啡輕食店合作
- 2025年度游戲工作室音效制作人員用工協(xié)議
- 二零二五年度水果店與廣告公司品牌宣傳合作協(xié)議
- 個(gè)人車(chē)位產(chǎn)權(quán)轉(zhuǎn)讓與車(chē)位增值服務(wù)及配套設(shè)施維護(hù)協(xié)議(2025年度)
- 二零二五年度反擔(dān)保人合作協(xié)議:旅游度假區(qū)項(xiàng)目資金安全反擔(dān)保協(xié)議
- 美容院二零二五年度合伙人合作協(xié)議:風(fēng)險(xiǎn)管理與合規(guī)經(jīng)營(yíng)
- 二零二五年度小產(chǎn)權(quán)房屋買(mǎi)賣(mài)與智能家居安裝合同
- 二零二五年度新能源行業(yè)定向就業(yè)人才培養(yǎng)合同
- 二零二五年度房屋拆除工程風(fēng)險(xiǎn)評(píng)估與處理合同
- 二零二五年度文創(chuàng)園區(qū)房東租賃服務(wù)協(xié)議
- 皮膚病學(xué)-動(dòng)物性皮膚病課件
- 涉詐風(fēng)險(xiǎn)賬戶(hù)審查表
- 論完整的學(xué)習(xí)與核心素養(yǎng)的形成課件
- 新零售運(yùn)營(yíng)管理PPT完整全套教學(xué)課件
- (完整版)小學(xué)英語(yǔ)語(yǔ)法大全-附練習(xí)題,推薦文檔
- 注塑參數(shù)表完整版
- 初中英語(yǔ)中考總復(fù)習(xí)
- 學(xué)習(xí)弘揚(yáng)楓橋精神與楓橋經(jīng)驗(yàn)PPT楓橋經(jīng)驗(yàn)蘊(yùn)含的精神和內(nèi)涵PPT課件(帶內(nèi)容)
- ArcEngine二次開(kāi)發(fā)入門(mén)介紹
- 山東大學(xué)出版社六年級(jí)上冊(cè)傳統(tǒng)文化第一單元寬仁厚愛(ài)備課教案
- 選煤廠(chǎng)工完料盡場(chǎng)地清制度
評(píng)論
0/150
提交評(píng)論