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