【Keil5 C51】AT89C52 中断系统与定时/计数器的介绍
生活随笔
收集整理的這篇文章主要介紹了
【Keil5 C51】AT89C52 中断系统与定时/计数器的介绍
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
80C51中斷系統(tǒng)
結(jié)構(gòu)
80C51有5個(gè)中斷源(89C52有6個(gè)),2個(gè)優(yōu)先級(jí),可實(shí)現(xiàn)二級(jí)中斷嵌套
TCON中斷標(biāo)志
IT0(TCON.0),外部中斷0觸發(fā)方式控制位
IE0(TCON.1),外部中斷0中斷請(qǐng)求標(biāo)志位
IT1(TCON.2),外部中斷1觸發(fā)方式控制位
IE1(TCON.3),外部中斷1中斷請(qǐng)求標(biāo)志位
TF0(TCON.5),定時(shí)/計(jì)數(shù)器T0溢出中斷請(qǐng)求標(biāo)志位
TF1(TCON.7),定時(shí)/計(jì)數(shù)器T1溢出中斷請(qǐng)求標(biāo)志位
中斷源響應(yīng)優(yōu)先級(jí)
中斷響應(yīng)條件
- 中斷源有中斷請(qǐng)求
- 此中斷源的中斷允許位置1
- CPU開(kāi)中斷(即EA = 1)
定時(shí)/計(jì)數(shù)器的結(jié)構(gòu)
定時(shí)/計(jì)數(shù)器的實(shí)質(zhì)是加1計(jì)數(shù)器(16位),有由高8位和低8位兩個(gè)寄存器組成,TMOD是定時(shí)/計(jì)數(shù)器的工作方式及寄存器,確定工作方式和功能,
TCON是控制寄存器,控制T0,T1的啟動(dòng)和停止及設(shè)置出標(biāo)志位。
TMOD
- GATE 門控位
- C/T 模式選擇位 1定時(shí)器模式,0計(jì)數(shù)器模式
- M0M1工作方式位
00 方式0 13位定時(shí)計(jì)數(shù)器
01 方式1 16位定時(shí)計(jì)數(shù)器
10 方式2 8位自動(dòng)重裝定時(shí)計(jì)數(shù)器
11 方式3 T0分為兩個(gè)獨(dú)立的8位定時(shí)計(jì)數(shù)器,T1停止計(jì)數(shù)
定時(shí)/計(jì)數(shù)器初始化
- 對(duì)TMOD賦值,以確定T0和T1的工作方式。
- 計(jì)算初值,并將其寫(xiě)入TH0,TL0或TH1,TL1
假設(shè)晶振12 計(jì)滿時(shí)間為 t = 65535 * 1/12(震蕩周期) * 12 = 65535 - 中斷方式,對(duì)IE賦值,開(kāi)放中斷
- 使TR0或TR1置位,啟動(dòng)定時(shí)/計(jì)數(shù)器
定時(shí)器實(shí)現(xiàn)延時(shí)
#include <reg52.h> #define uint unsigned int #define uchar unsigned charsbit LE_D = P2^6; //數(shù)碼管段 該LE控制數(shù)碼管顯示的數(shù)字 sbit LE_W = P2^7; //數(shù)碼管位 該LE控制數(shù)碼管顯示的位置uint num = 0; uint time = 0;//數(shù)碼管從0->9 uchar code table[] = {0xC0,0xF9,0xA4,0XB0,0x99,0x92,0x82,0xF8,0x80,0x98};//數(shù)碼管的數(shù)次從0開(kāi)始每隔1s加1,用定時(shí)器實(shí)現(xiàn) void main(){ //中斷函數(shù)初始化EA = 1; //開(kāi)總中斷ET0 = 1; //開(kāi)T0定時(shí)/計(jì)數(shù)器中斷TR0 = 1; //啟動(dòng)TO TR0為T0運(yùn)行控制位,置1開(kāi)始工作TMOD = 0x01;//設(shè)置T0的工作方式 0000 0001TH0 = 0x3C; //65535 - 50000 = 15535 (50000為50mS)為3CAF TH0為高8位所以賦值3CTL0 = 0xAF; //TL0低8位所以賦值A(chǔ)F//數(shù)碼管顯示的位置LE_W = 1; //開(kāi)位鎖存器P0 = 0x01; //第一個(gè)數(shù)碼管顯示數(shù)字LE_W = 0; //關(guān)鎖存器//數(shù)碼管顯示的初始數(shù)字LE_D = 1;P0 = table[0];LE_D = 0;while(1){if(time == 20){ //進(jìn)入20次中斷后,(每次中斷為50mS) 20*50=1000ms = 1s time = 0; //time清零,重新開(kāi)始定時(shí)LE_D = 1; //開(kāi)鎖存器P0 = table[num];//鎖存器存入table[num]LE_D = 0; //關(guān)寄存器num++; //使數(shù)碼管顯示的數(shù)字+1} if(num == 10){ //當(dāng)數(shù)碼管顯示的數(shù)字為9時(shí)num清0 又從0開(kāi)始num = 0;}} }//定時(shí)器中斷函數(shù) void exter1() interrupt 1{ //1為定時(shí)/計(jì)數(shù)器0(T0)TH0 = 0x3C; //每次進(jìn)入定時(shí)器函數(shù)說(shuō)明TH0,TL0已加滿后清0,所以重新賦值TL0 = 0xAF; //TL0低8位time++; //沒(méi)進(jìn)入一次中斷給time+1 }Proteus仿真圖
總結(jié)
以上是生活随笔為你收集整理的【Keil5 C51】AT89C52 中断系统与定时/计数器的介绍的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: w5100 资料整理
- 下一篇: 基于AT89C52单工串行通信系统设计