当前位置: 首页>編程日記>正文

51单片机中断程序大全

51单片机中断程序大全

在这里插入图片描述

51单片机中断程序大全

  • 实例 1:用定时器T1查询方式控制单片机发出1KHz音频
  • 实例 2:将计数器T0计数的结果送P1口8位LED显示
  • 实例 3:用定时器T0的中断控制1位LED闪烁
  • 实例 4:用定时器T0的中断实现长时间定时
  • 实例 5:用定时器T1中断控制两个LED以不同周期闪烁
  • 实例 6:输出50个矩形脉冲
  • 实例 7:计数器T0统计外部脉冲数
  • 实例 8:定时器T0的模式2测量正脉冲宽度
  • 实例 9:输出负脉宽为200微秒的方波
  • 实例 10:测量负脉冲宽度
  • 实例 11:方式0控制流水灯循环点亮

实例 1:用定时器T1查询方式控制单片机发出1KHz音频

#include<reg51.h>        //  包含51单片机寄存器定义的头文件
sbit sound=P3^7;   //将sound位定义为P3.7引脚
void main(void)
{EA=1;                  //开总中断ET0=1;                 //定时器T0中断允许         TMOD=0x10;            //使用定时器T1的模式1TH1=(65536-921)/256;  //定时器T1的高8位赋初值TL1=(65536-921)%256;  //定时器T1的高8位赋初值TR1=1;                //启动定时器T1TF1=0;while(1)//无限循环等待查询{while(TF1==0);TF1=0;sound=~sound;  //将P3.7引脚输出电平取反TH1=(65536-921)/256;  //定时器T0的高8位赋初值TL1=(65536-921)%256;  //定时器T0的高8位赋初值}}

实例 2:将计数器T0计数的结果送P1口8位LED显示

#include<reg51.h>        //  包含51单片机寄存器定义的头文件sbit S=P3^4;   //将S位定义为P3.4引脚void main(void)
{EA=1;                  //开总中断ET0=1;                 //定时器T0中断允许         TMOD=0x02;            //使用定时器T0的模式2TH0=256-156;  //定时器T0的高8位赋初值TL0=256-156;  //定时器T0的高8位赋初值TR0=1;                //启动定时器T0while(1)//无限循环等待查询{while(TF0==0)  //如果未计满就等待{if(S==0)  //按键S按下接地,电平为0P1=TL0; //计数器TL0加1后送P1口显示} TF0=0;  //计数器溢出后,将TF0清0}
}

实例 3:用定时器T0的中断控制1位LED闪烁

#include<reg51.h>  //  包含51单片机寄存器定义的头文件sbit D1=P2^0;  //将D1位定义为P2.0引脚void main(void)
{EA=1;                  //开总中断ET0=1;                 //定时器T0中断允许         TMOD=0x01;             //使用定时器T0的模式2TH0=(65536-46083)/256; //定时器T0的高8位赋初值TL0=(65536-46083)%256; //定时器T0的高8位赋初值TR0=1;                 //启动定时器T0while(1);
}//函数功能:定时器T0的中断服务程序
**************************************************************/
void Time0(void) interrupt 1 using 0   //寄存器 {D1=~D1;  //按位取反操作,将P2.0引脚输出电平取反TH0=(65536-46083)/256; //定时器T0的高8位重新赋初值TL0=(65536-46083)%256; //定时器T0的高8位重新赋初值}

实例 4:用定时器T0的中断实现长时间定时

#include<reg51.h>  //  包含51单片机寄存器定义的头文件sbit D1=P2^0;  //将D1位定义为P2.0引脚
unsigned char Countor; //设置全局变量,储存定时器T0中断次数void main(void)
{EA=1;                  //开总中断ET0=1;                 //定时器T0中断允许         TMOD=0x01;             //使用定时器T0的模式2TH0=(65536-46083)/256; //定时器T0的高8位赋初值TL0=(65536-46083)%256; //定时器T0的高8位赋初值TR0=1;                 //启动定时器T0Countor=0;            //从0开始累计中断次数while(1);
}
/**************************************************************
函数功能:定时器T0的中断服务程序
**************************************************************/
void Time0(void) interrupt 1 using 0 
{Countor++;   //中断次数自加1if(Countor==20)  //若累计满20次,即计时满1s{D1=~D1;     //按位取反操作,将P2.0引脚输出电平取反Countor=0;  //将Countor清0,重新从0开始计数}TH0=(65536-46083)/256; //定时器T0的高8位重新赋初值TL0=(65536-46083)%256; //定时器T0的高8位重新赋初值
}

实例 5:用定时器T1中断控制两个LED以不同周期闪烁

#include<reg51.h>  //  包含51单片机寄存器定义的头文件sbit D1=P2^0;  //将D1位定义为P2.0引脚
sbit D2=P2^1;  //将D2位定义为P2.1引脚
unsigned char Countor1; //设置全局变量,储存定时器T1中断次数
unsigned char Countor2; //设置全局变量,储存定时器T1中断次数void main(void)
{EA=1;                  //开总中断ET1=1;                 //定时器T1中断允许         TMOD=0x10;             //使用定时器T1的模式1TH1=(65536-46083)/256; //定时器T1的高8位赋初值TL1=(65536-46083)%256; //定时器T1的高8位赋初值TR1=1;                 //启动定时器T1Countor1=0;            //从0开始累计中断次数Countor2=0;            //从0开始累计中断次数 while(1);
}// 定时器1
void Time1(void) interrupt 3 using 0 
{Countor1++;   //Countor1自加1Countor2++;   //Countor2自加1if(Countor1==2)  //若累计满2次,即计时满100ms{D1=~D1;     //按位取反操作,将P2.0引脚输出电平取反Countor1=0;  //将Countor1清0,重新从0开始计数}if(Countor2==8)  //若累计满8次,即计时满400ms{D2=~D2;     //按位取反操作,将P2.1引脚输出电平取反Countor2=0;  //将Countor1清0,重新从0开始计数}		TH1=(65536-46083)/256; //定时器T1的高8位重新赋初值TL1=(65536-46083)%256; //定时器T1的高8位重新赋初值
}

实例 6:输出50个矩形脉冲

#include<reg51.h>   //包含51单片机寄存器定义的头文件sbit u=P1^4;    //将u位定义为P1.4/*************************************************
函数功能:延时约30ms (3*100*100=30 000μs =30m
*************************************************/
void delay30ms(void)
{ unsigned char m,n;for(m=0;m<100;m++)for(n=0;n<100;n++);
}void main(void)
{unsigned char i;u=1;    //初始化输出高电平for(i=0;i<50;i++) //输出50个矩形脉冲{ u=1;delay30ms();u=0;delay30ms(); }while(1) :
} 

实例 7:计数器T0统计外部脉冲数

#include<reg51.h>   //包含51单片机寄存器定义的头文件void main(void){TMOD=0x06;    // TMOD=0000 0110B,使用计数器T0的模式2EA=1;         //开总中断ET0=0;        //不使用定时器T0的中断     TR0=1;        //启动T0TH0=0;       //计数器T0高8位赋初值TL0=0;       //计数器T0低8位赋初值while(1)  //无限循环,不停地将TL0计数结果送P1口P1=TL0;		
}

实例 8:定时器T0的模式2测量正脉冲宽度

#include<reg51.h>   //包含51单片机寄存器定义的头文件sbit ui=P3^2;  //将ui位定义为P3.0(INT0)引脚,表示输入电压void main(void)
{TMOD=0x0a;   // TMOD=0000 1010B,使用定时器T0的模式2,GATE置1EA=1;         //开总中断ET0=0;        //不使用定时器T0的中断     TR0=1;        //启动T0TH0=0;        //计数器T0高8位赋初值TL0=0;        //计数器T0低8位赋初值while(1)       //无限循环,不停地将TL0计数结果送P1口{while(ui==0) : //INT0为低电平,T0不能启动TL0=0;       //INT0为高电平,启动T0计时,所以将TL0清0while(ui==1): //在INT0高电平期间,等待,计时P1=TL0;    //将计时结果送P1口显示		} 
}

实例 9:输出负脉宽为200微秒的方波

#include<reg51.h>   //包含51单片机寄存器定义的头文件sbit u=P1^4;    //将u位定义为P1.4void main(void){TMOD=0x02;            //TMOD=0000 0010B,使用定时器T0的模式2EA=1;                    //开总中断ET0=1;                  //定时器T0中断允许         TH0=256-200;   //定时器T0的高8位赋初值TL0=256-200;  //定时器T0的高8位赋初值TR0=1;                 //启动定时器T0while(1) : 
}             //无限循环,等待中断
void Time0(void) interrupt 1 using 0 //"interrupt"声明函数为中断服务函数
{u=~u;  //将P1.4引脚输出电平取反,产生方波
}

实例 10:测量负脉冲宽度

#include<reg51.h>   //包含51单片机寄存器定义的头文件sbit u=P3^2;    //将u位定义为P3.2void main(void)
{TMOD=0x02;  //TMOD=0000 0010B,使用定时器T0的模式2EA=1;   //开放总中断EX0=1;  //允许使用外中断IT0=1;  //选择负跳变来触发外中断ET0=1;  //允许定时器T0中断TH0=0;  //定时器T0赋初值0TL0=0;   //定时器T0赋初值0TR0=0;   //先关闭T0while(1)    ; //无限循环, 不停检测输入负脉冲宽度
}void int0(void) interrupt 0 using 0 //外中断0的中断编号为0
{   TR0=1;   //外中断一到来,即启动T0计时TL0=0;  //从0开始计时while(u==0)  //低电平时,等待T0计时;P1=TL0; //将结果送P1口显示TR0=0;  //关闭T0
}

实例 11:方式0控制流水灯循环点亮

#include<reg51.h>   //包含51单片机寄存器定义的头文件
#include<intrins.h> //包含函数_nop_()定义的头文件unsigned char code Tab[]={0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F};//流水灯控制码,该数组被定义为全局变量
sbit P17=P1^7;/**************************************************************
函数功能:延时约150ms
**************************************************************/
void delay(void)   
{unsigned char m,n;for(m=0;m<200;m++)for(n=0;n<250;n++);    
}/**************************************************************
函数功能:发送一个字节的数据
**************************************************************/
void Send(unsigned char dat)
{P17=0;     //P1.7引脚输出清0信号,对74LS164清0_nop_();   //延时一个机器周期_nop_();  //延时一个机器周期,保证清0完成P17=1;    //结束对74LS164的清0SBUF=dat;  //将数据写入发送缓冲器,启动发送while(TI==0)  //若没有发送完毕,等待;TI=0;   //发送完毕,TI被置“1”,需将其清0
}/*******************************************
函数功能:主函数
******************************************/	
void main(void)
{unsigned char i;SCON=0x00;  //SCON=0000 0000B,使串行口工作于方式0   while(1)  {for(i=0;i<8;i++){Send(Tab[i]);  //发送数据delay();       //延时}}
}


https://www.fengoutiyan.com/post/15684.html

相关文章:

  • 单片机程序大全
  • 51单片机中断程序例子
  • 51单片机外部中断程序
  • 51单片机定时器中断
  • 单片机程序实例
  • 单片机外部中断
  • 单片机中断处理过程
  • 单片机中断的概念
  • 鏡像模式如何設置在哪,圖片鏡像操作
  • 什么軟件可以把圖片鏡像翻轉,C#圖片處理 解決左右鏡像相反(旋轉圖片)
  • 手機照片鏡像翻轉,C#圖像鏡像
  • 視頻鏡像翻轉軟件,python圖片鏡像翻轉_python中鏡像實現方法
  • 什么軟件可以把圖片鏡像翻轉,利用PS實現圖片的鏡像處理
  • 照片鏡像翻轉app,java實現圖片鏡像翻轉
  • 什么軟件可以把圖片鏡像翻轉,python圖片鏡像翻轉_python圖像處理之鏡像實現方法
  • matlab下載,matlab如何鏡像處理圖片,matlab實現圖像鏡像
  • 圖片鏡像翻轉,MATLAB:鏡像圖片
  • 鏡像翻轉圖片的軟件,圖像處理:實現圖片鏡像(基于python)
  • canvas可畫,JavaScript - canvas - 鏡像圖片
  • 圖片鏡像翻轉,UGUI優化:使用鏡像圖片
  • Codeforces,CodeForces 1253C
  • MySQL下載安裝,Mysql ERROR: 1253 解決方法
  • 勝利大逃亡英雄逃亡方案,HDU - 1253 勝利大逃亡 BFS
  • 大一c語言期末考試試題及答案匯總,電大計算機C語言1253,1253《C語言程序設計》電大期末精彩試題及其問題詳解
  • lu求解線性方程組,P1253 [yLOI2018] 扶蘇的問題 (線段樹)
  • c語言程序設計基礎題庫,1253號C語言程序設計試題,2016年1月試卷號1253C語言程序設計A.pdf
  • 信奧賽一本通官網,【信奧賽一本通】1253:抓住那頭牛(詳細代碼)
  • c語言程序設計1253,1253c語言程序設計a(2010年1月)
  • 勝利大逃亡英雄逃亡方案,BFS——1253 勝利大逃亡
  • 直流電壓測量模塊,IM1253B交直流電能計量模塊(艾銳達光電)
  • c語言程序設計第三版課后答案,【渝粵題庫】國家開放大學2021春1253C語言程序設計答案
  • 18轉換為二進制,1253. 將數字轉換為16進制
  • light-emitting diode,LightOJ-1253 Misere Nim
  • masterroyale魔改版,1253 Dungeon Master
  • codeformer官網中文版,codeforces.1253 B
  • c語言程序設計考研真題及答案,2020C語言程序設計1253,1253計算機科學與技術專業C語言程序設計A科目2020年09月國家開 放大學(中央廣播電視大學)
  • c語言程序設計基礎題庫,1253本科2016c語言程序設計試題,1253電大《C語言程序設計A》試題和答案200901
  • 肇事逃逸車輛無法聯系到車主怎么辦,1253尋找肇事司機