設計一個帶有控制功能脈沖計數器系統,被計數脈沖由T1(P3.5)輸入,所記錄的脈沖數以十進制形式在數碼管顯示(至少應可記錄256個脈沖);1個點動開關控制是否允許計數(按1次允許,再按1次禁止。再按又允許。。。。),1個點動開關作為外部脈沖輸入,不啟動計數時,數碼管顯示6位學號(在6個數碼管顯示),啟動計數后數碼管顯示計數個數(在最右側三個數碼管上顯示)。
系統增加脈沖發生器功能,由T0產生周期為2s的方波,由P3.0口輸出到LED0,用發光二極管顯示方波信號;
單片機程序如下:
- #include<reg51.h>
- #include<intrins.h>
- charxuehao[]={0x7d,0x6d,0x3f,0x4f,0x07,0x06}; //這里順序分別是4 5 6 3 7 1(按照需要自己改)
- code unsigned char LEDMAP[] = { // 八段管顯示碼
- 0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07,
- 0x7f, 0x6f, 0x77, 0x7c, 0x39, 0x5e, 0x79, 0x71 //這里是從1~f(16進制)
- };
- sbit p3_0=P3^0;
- char t=0;
- void delay(char j)
- {
- chari;
- for(i=0;i<125;i++)
- for(;j>0;j--);
- }
- void main()
- {
- charled,a,b,c,count;
- TMOD=0x51; //這里是T1計數,T0定時,如果這里改了,那么后邊的TH1,TH0等等都得改一下,相信大家應該都會!
- EA=1;
- ET0=1;
- ET1=1;
- TR1=0;
- TR0=1;
- IT0=1;
- IT1=1;
- EX0=1;
- EX1=1;
- TH1=TL1=0;
- TH0=3c;
- TL0=b0;
- p3_0=1;
- while(1)
- {
- if(TR1==0)
- {
- P2=0x20;
- for(led=0;led<6;led++)
- {
- P1=xuehao[led];
- delay(30);
- P2>>=1;
-
- }
- }
- else if(TR1==1)
- {
- count=TL1;
- c=count/100;
- b=(count%100)/10;
- a=count%10;
- P2=0x08;
- P1= LEDMAP[c];
- delay(300);
- P2=0x10;
- P1= LEDMAP[ b];
- delay(300);
- P2=0x20;
- P1= LEDMAP[a];
- delay(300);
- }
- }
- }
- void key()interrupt 0
- {
- TR1=!TR1;
- if(TR1==0)
- TL1=0;
- }
- void key2()interrupt 2
- {
- TR0=!TR0;
- if(TR0==0)
- p3_0=0;
- }
- void time()interrupt 1
- {
- TH0=3c;
- TL0=b0;
- t++;
- if(t==20)
- {
- p3_0=!p3_0;
- t=0;
- }
- }
復制代碼
|