设计一个带有控制功能脉冲计数器系统,被计数脉冲由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;
- }
- }
复制代码
|