主板介紹:P3^2~P^5為四個按鍵;P1^0~P1^7為8個LED燈
#include "reg52.h" //此檔案中定義了單片機的一些特殊功能暫存器 typedef unsigned int uint; //對資料型別進行宣告定義 typedef unsigned char u8; sbit k1=P3^5; //定義P31口是k1 sbit led=P1^0; //定義P10口是led /******************************************************************************* * 函 數 名 : delay * 函式功能 : 晶振11.0592M延時函式 *******************************************************************************/ void delay(uint z) { uint i,j; for(j=z;j>0;j--) for(i=112;i>0;i--); } /******************************************************************************* * 函 數 名 : keypros * 函式功能 : 按鍵處理函式,判斷按鍵K1是否按下 *******************************************************************************/ void keypros() { if(k1==0) { delay(50); if(k1==0) //再次判斷按鍵是否按下 led=~led; //led狀態取反 } while(!k1); //檢測按鍵是否松開 } /******************************************************************************* * 函 數 名 : main * 函式功能 : 主函式 * 輸 入 : 無 * 輸 出 : 無 *******************************************************************************/ void main() { while(1) { keypros(); //按鍵處理函式 } }按鍵取反燈亮或滅
按鈕外部中斷0
/*----------------------------------------------- 名稱:外部中斷0電平觸發 內容:通過中斷介面P3.2連接的獨立按鍵測驗,按一次P1口的LED燈反向, 這里使用電平觸發,所以一直按鍵不松開和一次按鍵效果不相同,按下會看到燈全部亮 說明中斷一直在作用,用示波器看則是高頻方波 ------------------------------------------------*/ #include<reg52.h> //包含頭檔案,一般情況不需要改動,頭檔案包含特殊功能暫存器的定義 /*------------------------------------------------ 外部中斷程式 ------------------------------------------------*/ void ISR_Key(void) interrupt 0 using 1 { P1=~P1; //進入中斷程式執行程式, //此時可以通過 EA=0指令暫時關掉中斷 } typedef unsigned int uint; //對資料型別進行宣告定義 void delay(uint i) { while(i--); } sbit btn=P3^2; sbit led=P1^0; /*------------------------------------------------ 主程式 ------------------------------------------------*/ main() { P1=0x55; //P1口初始值 EA=1; //全域中斷開 EX0=1; //外部中斷0開 IT0=0; //電平觸發 while(1); }按鈕中斷
先整理通用的代碼,有些不知所以然
#include<reg52.h> //包含頭檔案,一般情況不需要改動,頭檔案包含特殊功能暫存器的定義 #include <intrins.h> //頭檔案包含 typedef unsigned char u8; //重新定義資料型別名 typedef unsigned short u16;//重新定義資料型別名 typedef unsigned long u32; //重新定義資料型別名 sbit PWM_OUT=P1^1; u8 idata PWM_Write_Byte[3]=0; //****************************祁緒電子 2020年5月*** // 定時器0初始化 晶振11059200,12T,輸出50Hz的PWM,占空比0~255 // 定時器初值為:256-(11059200÷12÷50Hz÷256) = 184 = 0xB8 void PWM_Init(void) { TMOD &= 0xF0; //配置定時器作業模式 TMOD |= 0x02; //配置定時器作業模式 8位自動重裝模式 TL0 = 0xB8;; //定時器初值 TH0 = 0xB8; //定時器重裝初值 TR0 = 1; //啟動定時器0 ET0=1; //允許定時器0申請中斷 EA=1; //中斷總閘閉合 } //****************************祁緒電子 2020年5月*** //定時器0的CPU處理函式,位置任意寫都行 void PWM_Display_timer0() interrupt 1 { static u8 pwm_t=0; //區域變數,不丟失資料 if(pwm_t<PWM_Write_Byte[0]) { PWM_OUT=1; } else PWM_OUT=0; pwm_t++; } //***************************祁緒電子 2020年5月*** // PWM 數模變換資料分配 void PWM_Allot() { static u8 kkk=0; static u8 count=0; count++; if(count>150) { count=0; kkk++; PWM_Write_Byte[0]=kkk; //kkk為占空比自動增加 PWM_Write_Byte[1]=10; PWM_Write_Byte[2]=10; } } void main()//主函式 { PWM_Init(); while(1) //主函式大回圈 { PWM_Allot(); } }View Code
外部中斷1電平觸發
#include<reg52.h> //包含頭檔案,一般情況不需要改動,頭檔案包含特殊功能暫存器的定義 sbit LED=P1^0; //定義LED埠 void DelayUs2x(unsigned char t);//us級延時函式宣告 void DelayMs(unsigned char t); //ms級延時 /*------------------------------------------------ 主程式 ------------------------------------------------*/ main() { LED=0; //LED燈點亮 EA=1; //全域中斷開 EX1=1; //外部中斷0開 IT1=0; //琁T1=0表示電平觸發 while(1) { //在此添加其他程式 } } /*------------------------------------------------ 外部中斷程式 ------------------------------------------------*/ void ISR_INT1(void) interrupt 2 { if(!INT1) { DelayMs(10);//在此處可以添加去抖動程式,防止按鍵抖動造成錯誤 if(!INT1) while(!INT1);//等待按鍵釋放 { LED=!LED; } } } /*------------------------------------------------ uS延時函式,含有輸入引數 unsigned char t,無回傳值 unsigned char 是定義無符號字符變數,其值的范圍是 0~255 這里使用晶振12M,精確延時請使用匯編,大致延時 長度如下 T=tx2+5 uS ------------------------------------------------*/ void DelayUs2x(unsigned char t) { while(--t); } /*------------------------------------------------ mS延時函式,含有輸入引數 unsigned char t,無回傳值 unsigned char 是定義無符號字符變數,其值的范圍是 0~255 這里使用晶振12M,精確延時請使用匯編 ------------------------------------------------*/ void DelayMs(unsigned char t) { while(t--) { //大致延時1mS DelayUs2x(245); DelayUs2x(245); } }View Code
外部中斷0下降沿觸發
/*----------------------------------------------- 名稱:外部中斷0邊沿觸發 論壇:www.doflye.net 撰寫:shifang 日期:2009.5 修改:無 內容:通過中斷介面P3.2連接的獨立按鍵測驗,按一次P1口的LED燈反向, 這里使用邊沿觸發,所以一直按鍵不松開和一次按鍵效果相同,區 別于電平觸發 ------------------------------------------------*/ #include<reg52.h> //包含頭檔案,一般情況不需要改動,頭檔案包含特殊功能暫存器的定義 /*------------------------------------------------ 主程式 ------------------------------------------------*/ main() { P1=0x55; //P1口初始值 EA=1; //全域中斷開 EX0=1; //外部中斷0開 IT0=1; //邊沿觸發 while(1) { //在此添加其他程式 } } /*------------------------------------------------ 外部中斷程式 ------------------------------------------------*/ void ISR_Key(void) interrupt 0 using 1 { P1=~P1; //s3按下觸發一次,P1取反一次 }外部中斷0下降沿觸發
外部中斷1下降沿觸發
/*----------------------------------------------- 名稱:外部中斷1電下降沿平觸發 論壇:www.doflye.net 撰寫:shifang 日期:2009.5 修改:無 內容:通過中斷介面P3.3連接的獨立按鍵測驗,按一次P1.0口的LED燈反向, 作用效果和中斷0相同 ------------------------------------------------*/ #include<reg52.h> //包含頭檔案,一般情況不需要改動,頭檔案包含特殊功能暫存器的定義 sbit LED=P1^0; //定義LED埠 void DelayUs2x(unsigned char t);//us級延時函式宣告 void DelayMs(unsigned char t); //ms級延時 /*------------------------------------------------ 主程式 ------------------------------------------------*/ main() { LED=0; //LED燈點亮 EA=1; //全域中斷開 EX1=1; //外部中斷1開 IT1=1; //IT1=1表示邊沿觸發 while(1) { //在此添加其他程式 } } /*------------------------------------------------ 外部中斷程式 ------------------------------------------------*/ void ISR_INT1(void) interrupt 2 { if(!INT1) { DelayMs(10);//在此處可以添加去抖動程式,防止按鍵抖動造成錯誤 if(!INT1) //while(!INT1);//等待按鍵釋放 { LED=!LED; } } } /*------------------------------------------------ uS延時函式,含有輸入引數 unsigned char t,無回傳值 unsigned char 是定義無符號字符變數,其值的范圍是 0~255 這里使用晶振12M,精確延時請使用匯編,大致延時 長度如下 T=tx2+5 uS ------------------------------------------------*/ void DelayUs2x(unsigned char t) { while(--t); } /*------------------------------------------------ mS延時函式,含有輸入引數 unsigned char t,無回傳值 unsigned char 是定義無符號字符變數,其值的范圍是 0~255 這里使用晶振12M,精確延時請使用匯編 ------------------------------------------------*/ void DelayMs(unsigned char t) { while(t--) { //大致延時1mS DelayUs2x(245); DelayUs2x(245); } }外部中斷1下降沿觸發
中斷定義:
當機器正在執行程式的程序中,一旦遇到一些例外或者特殊請求時,停止正在 執行的程式轉入必要的處理,處理完畢后,立即回傳斷點繼續執行,
以上整理了一些中斷例子,還不是很懂,之后會重新整理,
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/254653.html
標籤:其他
上一篇:gho、wim、esd的區別
下一篇:QT串口助手(四):資料發送
