51单片机——中断
單片機——中斷
宗旨:技術的學習是有限的,分享的精神是無限的。
?
1、中斷:放下手中的事情去處理另一種事情。
?
2、定時器中斷
?????? 定時器是單片機模塊的一個資源,確確實實存在的一個模塊,中斷是單片機的一種運行機制。不是一回事,不只是定時器才能觸發中斷。
? ? ? ?對單片機的操作主要是操作IO口和操作寄存器的。
x * 8 + 3 = 向量地址?—— x為中斷函數編號
?
3、數碼管動態掃描
余暉效應:(10ms) ? ??
P0 = 0xff; // 消隱
EA = 0;
ET0 = 0; // 開總中斷,開定時器0中斷
#include <reg52.h>typedef unsigned int uint; typedef unsigned char uchar;uchar code display[] = {//數碼管顯示字符轉換表0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8,0x80, 0x90, 0x88, 0x83, 0xC6, 0xA1, 0x86, 0x8E }; uchar buffer[6] = {//數碼管顯示緩沖區,初值0xFF確保啟動時都不亮0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF }; uint cnt = 0; //記錄T0中斷次數int main(void) {unsigned long sec = 0; //記錄經過的秒數EA = 1; //使能總中斷TMOD = 0x01; //設置T0為模式1TH0 = 0xFC; //為T0賦初值0xFC67,定時1msTL0 = 0x67;ET0 = 1; //使能T0中斷TR0 = 1; //啟動T0while(1);return 0; } /* 定時器0中斷服務函數 */ void InterruptTimer0() interrupt 1 {static uchar i = 0; //動態掃描的索引TH0 = 0xFC; //重新加載初值TL0 = 0x67;cnt++; //中斷次數計數值加1//以下代碼完成數碼管動態掃描刷新P0 = 0xFF; //顯示消隱switch (i){case 0:P1 = 0xfe;i++;P0 = buffer[0];break;case 1:P1 = 0xfd;i++;P0 = buffer[1];break;case 2:P1 = 0xfb;i++;P0 = buffer[2];break;case 3:P1 = 0xf7;i++;P0 = buffer[3];break;case 4:P1 = 0xef;i++;P0 = buffer[4];break;case 5:P1 = 0xdf;i = 0;P0 = buffer[5];break;default:break;}if(cnt >= 1000) //判斷T0溢出是否達到1000次{cnt = 0; //達到1000次后計數值清零sec++; //秒計數自加1//以下代碼將sec按十進制位從低到高依次提取并轉為數碼管顯示字符buffer[0] = display [sec % 10];buffer[1] = display [sec / 10 % 10];buffer[2] = display [sec / 100 % 10];buffer[3] = display [sec / 1000 % 10];buffer[4] = display [sec / 10000 % 10];buffer[5] = display [sec / 100000 % 10];} }
總結
- 上一篇: 生成fnt字体工具BMFontTool工
- 下一篇: 彻底卸载VS2015