c语言et1tr1怎么用,这个单片机程序为什么用ET0=1才可以运行,明明改成模式3了...

#include

#include

#define uchar unsigned char

#define uint unsigned int

unsigned long num=0,tt=0;

uchar j,k;

sbit shuru=P1^0;

sbit shuchu=P1^1;

uchar a0,b0,c0,d0,e0,f0;

sbit dula=P2^6;

sbit wela=P2^7;

sbit beep=P2^3;

unsigned char pwm_left_val = 0;//

unsigned char pwm_t;//周期

unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,

0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00};

int flag=0;

void delay(uchar i)

{

for(j=i;j>0;j--)

for(k=125;k>0;k--);

}

void displayw(uint a,uint b,uint c,uint d,uint e,uint f)

{

dula=0;

P0=table[a];

dula=1;

dula=0;

wela=0;

P0=0xfe;

wela=1;

wela=0;

delay(5);

P0=table[b];

dula=1;

dula=0;

P0=0xfd;

wela=1;

wela=0;

delay(5);

P0=table[c];

dula=1;

dula=0;

P0=0xfb;

wela=1;

wela=0;

delay(5);

P0=table[d];

dula=1;

dula=0;

P0=0xf7;

wela=1;

wela=0;

delay(5);

P0=table[e];

dula=1;

dula=0;

P0=0xef;

wela=1;

wela=0;

delay(5);

P0=table[f];

dula=1;

dula=0;

P0=0xdf;

wela=1;

wela=0;

delay(5);

}

void display0(num)

{

if(num<10)

{

a0=num;b0=16;c0=16;d0=16;e0=16;f0=16;

}

else

{

if(num<100)

{a0=num/10;b0=num%10;c0=16;d0=16;e0=16;f0=16;}

else

{

if(num<1000)

{a0=num/100;b0=num%100/10;c0=num%10;d0=16;e0=16;f0=16;}

else

{

if(num<10000)

{a0=num/1000;b0=num%1000/100;c0=num%100/10;d0=num%10;e0=16;f0=16;}

else

{

if(num<100000)

{a0=num/10000;b0=num%10000/1000;c0=num%1000/100;d0=num%100/10;e0=num%10;f0=16;}

else

{

if(num<1000000)

{a0=num/100000;b0=num%100000/10000;c0=num%10000/1000;d0=num%1000/100;e0=num%100/10;f0=num%10;}

}

}

}

}

}

displayw(a0,b0,c0,d0,e0,f0);

}

void main()

{

TMOD=0x51;

TR0=1;

TR1=1;

TH1=0x4c;// 5*10^-2s

TL1=0x00;

ET0=1;

ET1=1;

EA=1;

while(1)

{

display0(num/2);

if(TL1==1)

{

shuchu=~shuchu;

num++;

TL1=0;

}

if (flag==1)

{

if ((num/2)<10)

{

beep=0;

delay(8);

beep=1;

delay(2);

}

if ((num/2)>40)

{

beep=0;

delay(20);

display0(num/2);

delay(20);

beep=1;

}

}

}

}

/*void timer0() interrupt 1

{

pwm_t++;

if(pwm_t == 200)

pwm_t = P1 = 0;

if(pwm_left_val == pwm_t)

P1 = 0XFF;

}                                    */

void time0() interrupt 3

{

TH1=0x4c;

TL1=0x00;

tt++;

shuru=~shuru; //定时器每隔50ms发起一次中断,shuru电平变换一次,故模拟输入方波的周期为100ms

if(tt==200)

{

EA=0;

flag=1;

}

}

首先,需要了解51单片机的定时器0和定时器1的工作原理和寄存器配置。 定时器0是一个8位定时器,可以产生1毫秒的中断。它的工作原理是通过给定的时钟频率和预设的计数器值来计算定时时间,并在计数器值达到上限时触发中断。定时器0的寄存器包括TH0、TL0、TMOD、IE、IP等。 定时器1是一个16位定时器,可以产生5秒的中断。它的工作原理类似于定时器0,但需要注意的是,由于它是16位的,需要分别设置高8位和低8位的计数器值。定时器1的寄存器包括TH1、TL1、TMOD、IE、IP等。 下面是一个使用定时器0和定时器1产生中断的程序示例: ```c #include <reg52.h> sbit LED = P1^0; //定义LED连接的IO口 void Timer0_ISR() interrupt 1 { static unsigned int cnt = 0; TH0 = (65536 - 1000) / 256; //设置定时器0的计数器初值 TL0 = (65536 - 1000) % 256; cnt++; //计数器加1 if(cnt >= 5000) //如果计数器达到5000,表示已经过去5秒 { cnt = 0; LED = !LED; //LED取反 } } void Timer1_ISR() interrupt 3 { TH1 = (65536 - 50000) / 256; //设置定时器1的计数器初值 TL1 = (65536 - 50000) % 256; } void main() { TMOD = 0x11; //设置定时器0为模式1,定时器1为模式1 TH0 = (65536 - 1000) / 256; //设置定时器0的计数器初值 TL0 = (65536 - 1000) % 256; TH1 = (65536 - 50000) / 256; //设置定时器1的计数器初值 TL1 = (65536 - 50000) % 256; EA = 1; //开启总中断 ET0 = 1; //开启定时器0中断 ET1 = 1; //开启定时器1中断 TR0 = 1; //启动定时器0 TR1 = 1; //启动定时器1 while(1); } ``` 在上面的程序中,我们定义了LED连接的IO口,并在定时器0的中断函数中使用一个静态计数器cnt来累加中断触发的次数,当cnt达到5000时,表示已经过去5秒,LED取反。 在main函数中,我们先配置定时器0和定时器1的工作模式和计数器初值,并开启总中断和定时器0、定时器1的中断。然后启动定时器0和定时器1,并进入一个无限循环,等待中断的触发。 在定时器0和定时器1的中断服务函数中,需要重新设置定时器的计数器初值,以便下一次定时。这里使用了一个常用的设置初值的方法,即使用65536减去所需的计数器值,然后分别保存高8位和低8位。 需要注意的是,由于定时器0和定时器1的中断向量地址不同,所以需要分别定义两个中断服务函数。在中断服务函数中,不要做太多的计算和IO操作,否则会影响定时器的精度和稳定性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值