Berbagi teknologi

05: interupsi pengatur waktu

2024-07-12

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina


1. Ketika unit pemrosesan pusat (CPU) sedang memproses sesuatu, permintaan darurat terjadi dari dunia luar, mengharuskan CPU untuk menunda pekerjaan saat ini dan beralih ke memproses kejadian darurat tersebut. Setelah pemrosesan, kembali ke tempat semula yang terputus dan melanjutkan . Awalnya berfungsi, proses seperti itu disebut interupsi.
2. Biasanya sumber interupsi diantrekan sesuai dengan prioritas sumber interupsi, dan sumber permintaan interupsi dari kejadian yang paling mendesak diproses terlebih dahulu, yaitu setiap sumber interupsi ditentukan memiliki tingkat prioritas. CPU selalu merespon permintaan interupsi dengan prioritas tertinggi terlebih dahulu.
3. Mikrokontroler C51 memiliki 8 sumber permintaan interupsi:

Masukkan deskripsi gambar di sini

1. Pengatur waktu T0 menyela

Masukkan deskripsi gambar di sini

Seperti yang ditunjukkan pada gambar: Interupsi juga memerlukan register konfigurasi. Ada dua jenis register, yang pertama adalah register kontrol interupsi bit (IE dan XICON), dan yang kedua adalah register kontrol prioritas. Disini kita hanya mempelajari interupsi pada timer T0.
Untuk menggunakan interupsi pengatur waktu T0:

ET0 = 1;ET0为定时器T0的中断开关,为1时打开中断
EA = 1;  EA为中断源的总开关。
  • 1
  • 2

Setelah waktu yang ditentukan habis, jalankan program pada fungsi interupsi. Lalu bagaimana cara mengetahui fungsi mana yang merupakan fungsi interupsi? — Kueri nomor interupsi (nomor interupsi yang dihasilkan oleh sumber interupsi berbeda berbeda)
Masukkan deskripsi gambar di sini

2. Kasus: Menggunakan interupsi pengatur waktu T0 untuk mewujudkan lampu menyala dan mati dengan interval 1 detik

#include <REGX52.H>

sbit LED1 = P3^7;
int cnt = 0;

void Timer0_Init_10ms(void)		//10毫秒@11.0592MHz
{
	TMOD &= 0xF0;		//设置定时器模式
	TMOD |= 0x01;		//设置定时器模式
	TL0 = 0x00;		//设置定时初值
	TH0 = 0xDC;		//设置定时初值
	TF0 = 0;		//清除TF0标志
	TR0 = 1;		//定时器0开始计时
}

void Timer0_interrupt_Init(void)//定时器T0中断初始化
{
	ET0 = 1;
	EA = 1;
}

void main(void)
{ 
	LED1 = 1;//先让灯熄灭的状态
	Timer0_Init_10ms();//打开定时器T0
	Timer0_interrupt_Init();//打开定时器T0中断
	while(1)
	{
		
	 }
}

/*定义中断函数*/
void Timer0Hander() interrupt 1
{
	TF0 = 0;//软件清零
	TL0 = 0x00; //重新给初值
	TH0 = 0xDC;
	cnt++;
	if(cnt == 100)//数100次,相当于1s
	{
		cnt = 0;
		LED1 = !LED1;
	}
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • Ketika interupsi diaktifkan, fungsi utama akan dikeluarkan setiap 10 ms dan program dalam fungsi interupsi akan dijalankan.
  • Ketika waktu 10 ms pertama tiba, jalankan fungsi interupsi, setel ulang pengatur waktu selama 10 ms, cnt = 1, dan lampu masih mati.
  • Ketika penghitung waktu 10 md kedua tiba, jalankan fungsi interupsi, atur ulang pengatur waktu selama 10 md, cnt = 2, dan lampu masih mati.
  • Ketika pengatur waktu 10 ms ke-100 tiba, jalankan fungsi interupsi, setel ulang pengatur waktu selama 10 ms, cnt = 100, dan lampu menyala.

Dengan cara ini, interval hidup dan mati 1 detik tercapai.