仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
单片机源程序如下:
- #include <reg52.h>
- #define uint unsigned int
- #define uchar unsigned char
- sbit LED1=P2^0;
- sbit LED2=P2^1;
- sbit LED3=P2^2;
- sbit LED4=P2^3;
- sbit LED5=P0^4;
- sbit LED6=P0^5;
- sbit LED7=P0^6;
- sbit LED8=P0^7;
- sbit LEVEL=P2^6;//LEVEL,P2.4引脚上的电平值
- sbit LEVEL1=P2^5;
- sbit LEVEL2=P2^6;
- sbit LEVEL3=P2^7;
- uchar highcount; //记录高电平定时次数
- uchar zhaowei=0,zhaoweide=0;
- uchar count;
- uchar counth,countl,count2,count3;
- const uchar tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,}; /*显示0~9*/
- const uchar tab1[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,}; /*显示0~9*/
- void delay()
- {
- uint i,j;
- for(i=0;i<256;i++);
- for(j=0;j<256;j++);
- }
- void timer0isr(void) interrupt 1 using 1
- {
- TH0 = 0xD8;
- TL0 = 0xF0; //重置计数初值
- highcount++; //溢出次数加1
- if(highcount == zhaowei)
- {
- LEVEL = 0;
- if(highcount==100)
- {
- highcount=0;
- }
- }
- if(highcount == zhaoweide)
- {
- LEVEL = 1;
- if(highcount==100)
- {
- highcount=0;
- }
- }
- }
- void int0( ) interrupt 0 using 1
- {
- zhaowei=zhaowei+5;
- if(zhaowei==100)
- zhaowei=0;
- }
- void int1( ) interrupt 2 using 2
- {
- zhaoweide=zhaoweide+5;
- if(zhaoweide==100)
- zhaoweide=0;
- }
- void main(void)
- {
- zhaowei=0;
- zhaoweide=0;
- highcount = 0; //记录高电平定时次数
- TMOD = 0x01; //设定T/C0工作在定时器方式1
- LEVEL = 0; //初始电平为高
- TH0 = 0xD8;
- TL0 = 0xF0; //装载计数初值
- EA = 1; //开总中断
- ET0 = 1; //开T/C0中断
- TR0 = 1; //启动T/C0
- IT0=1;
- IT1=1;
- EX0=1;
- EX1=1;
- PX1=1;
- while(1)
- {
- counth=zhaowei/10;
- countl=zhaowei%10;
- P1=tab[counth];
- LED1=1;
- delay();
- LEVEL1=0;
- LED1=0;
- P1=tab[countl];
- LED2=1;
- delay();
- LEVEL1=1;
- LED2=0;
- //第二段数码管
- count2=zhaoweide/10;
- count3=zhaoweide%10;
- P0=tab1[count2];
- LED3=1;
- delay();
- LEVEL3=0;
- LED3=0;
- P1=tab1[count3];
- LED4=1;
- delay();
- LEVEL3=0;
- LED4=0;
- }
- }
复制代码
由于我是新手以上资料肯定存在一些错误,欢迎大家批评指正,一起学习 提高技术(仅供参考 切勿照搬):
利用定时器产生脉冲.zip
(184.24 KB, 下载次数: 41)
|