外部中斷的常用功能
創(chuàng)新互聯(lián)是一家專業(yè)提供曲阜企業(yè)網(wǎng)站建設(shè),專注與成都網(wǎng)站制作、成都網(wǎng)站建設(shè)、H5響應(yīng)式網(wǎng)站、小程序制作等業(yè)務(wù)。10年已為曲阜眾多企業(yè)、政府機構(gòu)等服務(wù)。創(chuàng)新互聯(lián)專業(yè)網(wǎng)站制作公司優(yōu)惠進(jìn)行中。
外部中斷經(jīng)常用來記錄外部脈沖的個數(shù),也就是當(dāng)我們使用外部中斷1時,如果想記錄自身單片機的某個引腳的下降沿個數(shù),只需用杜邦線把這個引腳和P3.3連接即可。
比如P2.3引腳產(chǎn)生這樣的電平無規(guī)律跳轉(zhuǎn),則下降沿的個數(shù)為茄悉雀5
所以我們就用外部中斷1來實現(xiàn)記錄K4按鍵從按下到松手的抖動過程中經(jīng)歷了多少個下降沿,把下降沿的個數(shù)顯示在數(shù)碼管上。
2.程序陸睜思路
我們定義一個16位的全局變量pulse用來記錄P2.3下降沿的個數(shù),在中斷函數(shù)中的任務(wù)就是簡單的pulse自加,因為引腳遇到下降沿就會進(jìn)入中斷函數(shù)。
在主函數(shù)里就是負(fù)責(zé)數(shù)碼管顯示即可。
3.代碼#include?
#include?//詳見第六章第8講
u16?pulse=0;
void?main()
{
u16?x,PULSE_buf;
IT1?=?顫早1;???//下降沿觸發(fā)模式
EX1?=?1;
EA??=?1;
LED_Init();//初始化LED硬件模塊
KEY_Init();//初始化按鍵功能模塊
ShowNumber(pulse);
while(1)
{
SEG_Scan();
if(PULSE_buf!=pulse)ShowNumber(pulse);//pulse不再是前一次的值,也就是pulse數(shù)值更新了,所以數(shù)碼管緩存區(qū)也要更新pulse的數(shù)值以便顯示出來
x++;
if(x=50)//隔一段時間過來記錄此時的pulse數(shù)值
{
x=0;
PULSE_buf=pulse;
}
}
}
//請把P3.3和P2.3用杜邦線連接起來
void?EXTI1_IRQHandler()?interrupt?2
{
pulse++;
}
大家多按幾次K4,發(fā)現(xiàn)按下后松手的一個動作里有時pulse就自加了幾次,顯示在數(shù)碼管上的數(shù)加了好幾下。
隨便你輸入那一天都能算星期幾
#include畝襲time.h
#includestdio.h
#includeconio.h
#includestddef.h
#define BIG 1
#define SMALL 2
void info()
{
textcolor(RED);
gotoxy(37,11);
puts("WEEKDAY");
}
int runyear(int year) /*判斷是否為閏年*/
{
return !(year%4)year%100||!(year%400);
}
void main()
{
int year,month,day,yeardata,monthdata;
char *weekday;
time_t lt;
struct tm *ptr;
lt=time(NULL);
do
{
clrscr();
info();
gotoxy(18,15);
printf("Please Input The Year: ");
scanf("%d",year);
}while(year0||year9999);
yeardata=runyear(year);
do
{
clrscr();
info();
gotoxy(18,15);
printf("Please Input The Month:");
scanf("%d",month);
}while(month1||month12);
switch(month) /*大小月,2月*/
{
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12: monthdata=BIG; break;
case 4:
case 6:
case 9:
case 11: monthdata=SMALL; break;
case 2: monthdata=3; break;
}
l1:
clrscr();
info();
gotoxy(18,15);
printf("Please Input The Day:");
scanf("%d",day);
if(monthdata==BIG)/*大月*/
{
if(day1||day31)
goto l1;
}
if(monthdata==SMALL)/*小月*/
{
if(day1||day汪中30)
goto l1;
}
if(yeardata==0monthdata==3)/*平年2月*/困耐山
{
if(day1||day28)
goto l1;
}
if(yeardata==1monthdata==3)/*閏年2月*/
{
if(day1||day29)
goto l1;
}
ptr=localtime(lt);
weekday=asctime(ptr);
ptr-tm_mday=day;
ptr-tm_mon=month;
ptr-tm_year=year;
weekday=asctime(ptr);
clrscr();
gotoxy(13,30);
puts(weekday);
}
#include graphics.h#include conio.h int g_len; // Hilbert 曲線的單位長度 // 遞歸繪制 Hilbert 曲線void hilbert(LPCTSTR cmd, int level){ static BYTE d = 0; // 方向 static POINT c[4] = {1, 0, 0, -1, -1, 0, 0, 1}; // 方向?qū)?yīng)的軸系數(shù) if (level 0) return; // 處理命令字符串 int i = 0; while(cmd[i]) { switch(cmd[i++]) { case '+': d = (d + 1) 3; break; case '-': d = (d - 1) 3; break; case 'X': hilbert("+YF-XFX-FY+", level - 1); break; case 'Y': hilbert("-XF+YFY+FX-", level - 1); break; case 'F': linerel(c[d].x * g_len, c[d].y * g_len); break; } }} //蠢態(tài) 主函數(shù)void main(){ // 設(shè)置繪圖環(huán)境 initgraph(800, 600); // 設(shè)置窗口大小 outtextxy(20, 550, "按 1~8 顯示不同級別的 Hilbert 曲線,按 ESC 退出。"); rectangle(143, 23, 657, 537); // 繪制表示范圍的矩形框 setorigin(144, 24); // 設(shè)置原點坐標(biāo) setcolor(RED); // 設(shè)置顏色 setfillstyle(BLACK); int level = '5'; // 設(shè)置初始級別 do { if (level = '1' level = '8') // 僅處理 1~8 { level -= '0'; // 轉(zhuǎn)換為對應(yīng)的數(shù)字值氏槐 bar(0, 0, 511, 511); // 清空繪圖區(qū) g_len = 512 level; // 計算單位長度 moveto(g_len / 2, 512 - g_len / 2); // 設(shè)定起點 hilbert("X", level); // 遞歸繪制 Hilbert 曲線 } } while( (level = getch()) != 27 ); /帶核源/ 按 ESC 退出 closegraph();}