单片机实验-定时中断
一.實驗目的
1.掌握51單片機定時器工作原理。
2.掌握51單片機中斷系統工作原理。
3.掌握定時器初始化編程。
4.掌握中斷程序的編寫和調試。
二.實驗設備和器件
1.KEIL軟件
2.PROTEUS仿真軟件 ??
3.偉福實驗箱
三.實驗內容
(1)編程實現:在單片機外中斷0引腳接一個單脈沖源作為外部輸入信號,通過發光二極管顯示中斷次數,發光二極管初始狀態為全滅
- 電路圖:
?
- 代碼:
#include<reg52.h> ?
#include<intrins.h> ???
#define uint unsigned int ?
#define uchar unsigned char
uchar b=0; ?
void delay()//延時函數
{
?uint a=30000;
?while(a--)_nop_();
}
void main()//主函數
{
?????P0=0xff; //初始化燈
?????INT0==1;//打開外部中斷0
?????EA=1; ??//開總中斷
?????EX0=1; ??//允許中斷0
?IT0=1; ?//設置外部中斷0邊沿觸發
?while(1);
?}
void srv_INT0() interrupt 0 ???//中斷服務程序
{
???b=b+1; ??
???P0=0xff-b; ??
???delay();
?}
- 分析:
1、外部中斷0為邊沿觸發,則初始化時需要將IT0置1;
2、在proteus仿真中,因為低電平燈才會亮,則P0不能直接等于計數的b,需要用0xff-b,才能是相應的燈亮滅
?
(2)模擬一個交通燈時序,要求綠燈6s,紅燈4s,黃燈2s,循環實現
- 電路圖:
?
- 代碼:
#include <reg51.h>
#include <intrins.h>
void delay1s(unsigned char k);
void main()
{
TMOD =0x01; //定時器工作方式1
TH0=0x3C;
TL0=0xB0;//定時器初值15536,定時100ms
while(1)
{
P0=0xfe; //green ,D0作為綠燈
delay1s(6);//延時6s
P0=0xfd; ??//red ,D1作為紅燈
delay1s(4);//延時4s
P0=0xfb; ??//yellow,D2作為黃燈
delay1s(2);//延時2s
}
}
?
void delay1s(unsigned char m) ?//定時器0采用查詢的方式
{
unsigned char k1,k2;
TH0=0x3C;TL0=0xB0;//2^16-100x10^3/2=65536-50000=15536-3cb0,定時100ms
TR0=1;//開啟定時器0
for(k1=0;k1<m;k1++) // 定時每次是1s,根據m值的不一樣,決定總定時時間
{
for(k2=0;k2<10;k2++)//定時器0定時100ms,循環10次,1s
{
while(!TF0); ??//查詢方式
TF0=0; ??//清除
TH0=0x3C;TL0=0xB0;
}
}
}
- 分析:
1、定時器處理方式有中斷、查詢
2、實驗箱設置的系統時鐘為12MHz--1us
???Proteus仿真設置的系統時鐘為6MHz--2us
3、定時器0定時100ms,循環10次之后定時1s,根據相應的m值,決定延時多長時間
(3)編程實現:在實驗2基礎上,加一個外中斷請求信號來處理緊急情況,當外中斷請求發生時,進入緊急狀態,紅燈閃爍5s,之后退出,繼續原來的狀態執行。
- 電路圖:
?
- 代碼:
#include <reg51.h>
#include <intrins.h>
void delay1s(unsigned char k);
void main()
{
TMOD =0x01;
TH0=0x3C;
TL0=0xB0;
IE=0x81; ?//允許總中斷,允許外部中斷0
TCON=0x01; //允許外部中斷0
while(1)
{
P0=0xfe; //green
delay1s(6);
P0=0xfd; ??//red
delay1s(4);
P0=0xfb; ??//yellow
delay1s(2);
}
}
void int_0(void) interrupt 0
{
??while(1)
{
??P0 =0xfd;
??delay1s(5);
??P0=0xff;
??delay1s(5);
???}
?}
void delay1s(unsigned char m) ?//定時器0采用查詢的方式
{
unsigned char k1,k2;
TH0=0x3C;TL0=0xB0;//2^16-100x10^3/2=65536-50000=15536----3cb0,定時00ms
TR0=1;//開啟定時器0
for(k1=0;k1<m;k1++) // 定時每次是1s,根據m值的不一樣,決定總定時時間
{
for(k2=0;k2<10;k2++)//定時器0定時100ms,循環10次,1s
{
while(!TF0); ??//查詢方式
TF0=0; ??//清除
TH0=0x3C;TL0=0xB0;
}
}
}
- 分析:
1、其他同實驗二
2、用到外部中斷0,需要允許中斷0,當執行中斷0時,紅燈持續閃爍
總結
以上是生活随笔為你收集整理的单片机实验-定时中断的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 双摄与双目视觉
- 下一篇: kudu参数优化设置,让集群飞起来~