1、編寫C51代碼,實現(xiàn)流水燈字變花型:
/***********************************************************
* 實驗功能 : LED實現(xiàn)流水燈花型控制
*************************************************************/
# include
void delay(unsigned int z)
{
unsigned int x,y;
for(x=z;x>0;x--)
for(y=100;y>0;y--);
}
timer0() interrupt 1
{
static unsigned int tt; //tt用來保存當前時間在一秒鐘的比例位置
tt++; //每250us增加1
if(tt==10) //2.5ms的時鐘周期
tt=0; //使tt=0,開始新的PWM周期
}
void run(int *a,int len)
{
unsigned int k;
for(k=0;k P0 = a[k]; delay(100*len); } } void main(void) { int a[]={0XFF,0XFE,0XFC,0XF8,0XF0,0XE0,0XC0,0X80,0X00}; int b[]={0X01,0X03,0X7,0X0F,0X1F,0X3F,0X7F,0XFF}; int c[]={0X00,0X18,0X3C,0X7E,0XFF}; int d[]={0XE7,0XC3,0X81,0X00}; TMOD=0x02; //T0:工作模式2,8位定時模式 TH0=0x06; //裝T0初值,使250us溢出一次(12MHz) TL0=0x06; TR0=1; //啟動T0 ET0=1; //允許T0中斷 EA=1; //允許總中斷 while(1){ run(a,9); run(b,8); run(c,5); run(d,4); } } 2、實現(xiàn)八個LED的三級亮度變化: #include"reg51.h" //模擬PWM輸出控制燈的10個亮度級 unsigned int scale; //占空比控制變量 void main(void) { unsigned int n; //延時循環(huán)變量 TMOD=0x02; //T0:工作模式2,8位定時模式 TH0=0x06; //裝T0初值,使250us溢出一次(12MHz) TL0=0x06; TR0=1; //啟動T0 ET0=1; //允許T0中斷 EA=1; //允許總中斷 while(1) { for(n=0;n<50000;n++);/*延時*/ scale+=4; //占空比控制變量加4(0,4,8三種),使得實驗現(xiàn)象更清晰 if(scale>=10) scale=0; } } /********************************************************* 程序名稱:T0中斷服務程序 程序功能:程序中從tt=0開始到scale為低電平,從scale開始到tt=10為高電平;由于scale是變量,所以改變scale就可以改變占空比。 **********************************************************/ timer0() interrupt 1 { static unsigned int tt; //tt用來保存當前時間在一秒鐘的比例位置 tt++; //每250us增加1 if(tt>=10) //2.5ms的時鐘周期 { tt=0; //使tt=0,開始新的PWM周期 P0=0xFF; //LED燈亮(LED燈為陰極接地) } if(scale==tt) //按照當前占空比切換輸出為高電平 P0=0x00; //使LED燈滅 } 3、動態(tài)驅(qū)動八位數(shù)碼管,顯示兩人學號: /*********************************************************** * 實驗功能 : 8位數(shù)碼管動態(tài)驅(qū)動,顯示二人學號 *************************************************************/ #include #define GPIO_DIG P0 //定義要使用的IO口 void Delay10ms(unsigned int c); //聲明延時函數(shù) //unsigned char code DIG_CODE[10]={0x3F,0x06,0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F}; //共陰數(shù)碼管0~9的段碼 unsigned char code DIG_CODE_KANG[] = {0X3F,0X6D,0X06,0X66,0X7F,0X06,0X4F,0X6F};//學號共陰碼 unsigned char code DIG_CODE_ZHANG[] = {0X3F,0X6D,0X06,0X66,0X7F,0X06,0X66,0X3F};//學號共陰碼 unsigned char code choose[] = {0X01,0X02,0X04,0X08,0X10,0X20,0X40,0X80};//位選共陽碼 void main(void) { unsigned char i = 0; unsigned int n = 0; while(1){ P0 = 0X00; Delay10ms(500); n = i = 0; while(1) { P2 = ~choose[i];/*位選*/ GPIO_DIG = DIG_CODE_KANG[i];/*段選*/ i++; n++; Delay10ms(1); if(i == 8)/*動態(tài)控制,循環(huán)顯示*/ i = 0; if(n == 300)/*保證學號不是一閃而過,而是動態(tài)循環(huán)300個周期,兩秒左右時間*/ break; } /*第一個人的學號顯示完之后,變量全部清零并且延時片刻*/ n = i = 0; P0 = 0X00; Delay10ms(500); while(1) { P2 = ~choose[i]; GPIO_DIG = DIG_CODE_ZHANG[i]; i++; n++; Delay10ms(1); if(i == 8) i = 0; if(n == 300) break; } } } void Delay10ms(unsigned int c) //延時函數(shù) { unsigned char a, b; for (;c>0;c--) //--函數(shù)調(diào)用時,c已經(jīng)被賦值,此處不用再賦初值 for (b=5;b>0;b--) for (a=130;a>0;a--); } 4、用四位數(shù)碼管實現(xiàn)0~9999計數(shù)器: /*********************************************************** * 實驗功能 : 4位數(shù)碼管實現(xiàn)0~9999的計數(shù)器 *************************************************************/ #include void Delay10ms(unsigned int c); //聲明延時函數(shù) void show(int choose_bit,int number); //聲明段選顯示與位選函數(shù) unsigned char code TIMER[] = {0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F}; /*段選共陰碼*/ unsigned char code choose[] = {0X01,0X02,0X04,0X08}; /*位選共陽碼*/ void main(void) { unsigned char i = 0, j = 0, k = 0, m = 0; while(1) { for(i=0;i<10;i++) for(j=0;j<10;j++) for(k=0;k<10;k++) for(m=0;m<10;m++){ show(0,i); show(1,j); show(2,k); show(3,m); } } } /*延時函數(shù)*/ void Delay10ms(unsigned int c) { unsigned char a, b; for (;c>0;c--) for (b=5;b>0;b--) for (a=130;a>0;a--); } /*段選與位選,動態(tài)驅(qū)動*/ void show(int choose_bit,int number) { P2 = ~choose[choose_bit]; P0 = TIMER[number]; delay(1); }