51单片机中断程序大全.docx
- 文档编号:25151550
- 上传时间:2023-06-05
- 格式:DOCX
- 页数:13
- 大小:18.16KB
51单片机中断程序大全.docx
《51单片机中断程序大全.docx》由会员分享,可在线阅读,更多相关《51单片机中断程序大全.docx(13页珍藏版)》请在冰豆网上搜索。
51单片机中断程序大全
//实例42:
用定时器T0查询方式P2口8位控制LED闪烁
//#include
主函数**************************************************************/voidmain(void){
//EA=1;开总中断//
中断允许T0//定时器//ET0=1;
1的模式TMOD=0x01;//使用定时器T0
位赋初值定时器T0的高8TH0=(65536-46083)/256;//位赋初值的高8TL0=(65536-46083)%6;//定时器T0
T0启动定时器TR0=1;//TF0=0;P2=0xff;
无限循环等待查询while
(1)//{while(TF0==0);TF0=0;P2=~P2;
位赋初值的高8定时器TH0=(65536-46083)/256;//T0位赋初值T0TL0=(65536-46083)%6;//定时器的高8}}1KHzT1:
用定时器43实例//音频查询方式控制单片机发出
#include
/**************************************************************
函数功能:
主函数**************************************************************/voidmain(void){//EA=1;开总中断//
中断允许ET0=1;////定时器T01的模式使用定时器//T1TMOD=0x10;
位赋初值//TH1=(65536-921)/256;T1定时器的高8
TL1=(65536-921)%6;//定时器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)%6;//定时器T0的高8位赋初值}}
//实例44:
将计数器T0计数的结果送P1口8位LED显示
#include
S=P3^4;//将S位定义为P3.4引脚
/**************************************************************函数功能:
主函数**************************************************************/voidmain(void)
{//EA=1;//开总中断//ET0=1;//定时器T0中断允许2的模式T0//使用定时器TMOD=0x02;
TH0=256-156;//定时器T0的高8位赋初值
TL0=256-156;//定时器T0的高8位赋初值
TR0=1;//启动定时器T0
while
(1)//无限循环等待查询{
while(TF0==0)//如果未计满就等待{0if(S==0)按下接地,电平为按键S//
P1=TL0;//计数器TL0加1后送P1口显示}
TF0=0;//计数器溢出后,将TF0清0
}}
//实例45:
用定时器T0的中断控制1位LED闪烁
#include
sbitD1=P2^0;//将D1位定义为P2.0引脚
/**************************************************************函数功能:
主函数**************************************************************/voidmain(void){
EA=1;//开总中断
ET0=1;//定时器T0中断允许
TMOD=0x01;//使用定时器T0的模式2
TH0=(65536-46083)/256;//定时器T0的高8位赋初值
TL0=(65536-46083)%6;//定时器T0的高8位赋初值
TR0=1;//启动定时器T0
while
(1)//无限循环等待中断;
}/**************************************************************
函数功能:
定时器T0的中断服务程序**************************************************************/
voidTime0(void)interrupt1using0//“interrupt”声明函数为中断服务函数
//其后的1为定时器T0的中断编号;0表示使用第0组工作寄存器{
D1=~D1;//按位取反操作,将P2.0引脚输出电平取反
TH0=(65536-46083)/256;//定时器T0的高8位重新赋初值
TL0=(65536-46083)%6;//定时器T0的高8位重新赋初值}
//实例46:
用定时器T0的中断实现长时间定时
#include
/**************************************************************
函数功能:
主函数**************************************************************/
voidmain(void){
EA=1;//开总中断
ET0=1;//定时器T0中断允许
TMOD=0x01;//使用定时器T0的模式2
TH0=(65536-46083)/256;//定时器T0的高8位赋初值
TL0=(65536-46083)%6;//定时器T0的高8位赋初值TR0=1;//启动定时器T0Countor=0;//从0开始累计中断次数
while
(1)//无限循环等待中断;}/**************************************************************
函数功能:
定时器T0的中断服务程序**************************************************************/
voidTime0(void)interrupt1using0//“interrupt”声明函数为中断服务函数
//其后的1为定时器T0的中断编号;0表示使用第0组工作寄存器{
Countor++;//中断次数自加1if(Countor==20)1s次,即计时满20//若累计满{D1=~D1;//按位取反操作,将P2.0引脚输出电平取反Countor=0;//将Countor清0,重新从0开始计数}
TH0=(65536-46083)/256;//定时器T0的高8位重新赋初值
TL0=(65536-46083)%6;//定时器T0的高8位重新赋初值}
//实例47:
用定时器T1中断控制两个LED以不同周期闪烁
#include
T1中断次数unsignedcharCountor1;//设置全局变量,储存定时器
T1中断次数unsignedcharCountor2;//设置全局变量,储存定时器/**************************************************************
函数功能:
主函数**************************************************************/
voidmain(void){
EA=1;//开总中断
ET1=1;//定时器T1中断允许
TMOD=0x10;//使用定时器T1的模式1TH1=(65536-46083)/256;//定时器T1的高8位赋初值
TL1=(65536-46083)%6;//定时器T1的高8位赋初值
TR1=1;//启动定时器T1
Countor1=0;//从0开始累计中断次数
Countor2=0;//从0开始累计中断次数while
(1)//无限循环等待中断;
}/**************************************************************
函数功能:
定时器T1的中断服务程序**************************************************************/
voidTime1(void)interrupt3using0//“interrupt”声明函数为中断服务函数
//其后的3为定时器T1的中断编号;0表示使用第0组工作寄存器{Countor1++;//Countor1自加1Countor2++;//Countor2自加1100ms次,即计时满2//若累计满if(Countor1==2){D1=~D1;//按位取反操作,将P2.0引脚输出电平取反Countor1=0;开始计数,重新从0将Countor1清0//}
400ms次,即计时满//若累计满8if(Countor2==8){D2=~D2;引脚输出电平取反P2.1//按位取反操作,将Countor2=0;开始计数0清0,重新从将//Countor1}
8位重新赋初值TH1=(65536-46083)/256;//定时器T1的高位重新赋初值8TL1=(65536-46083)%6;//定时器T1的高}
//实例50-1:
输出50个矩形脉冲
#include
sbitu=P1^4;//将u位定义为P1.4/*************************************************
函数功能:
延时约30ms(3*100*100=30000μs=30m*************************************************/voiddelay30ms(void)
{unsignedcharm,n;
for(m=0;m<100;m++)for(n=0;n<100;n++);}/*******************************************
函数功能:
主函数******************************************/
voidmain(void){
unsignedchari;
u=1;//初始化输出高电平
for(i=0;i<50;i++)//输出50个矩形脉冲{u=1;
delay30ms();
u=0;delay30ms();}while
(1)
;//无限循环,防止程序“跑飞”}
//实例50-2:
计数器T0统计外部脉冲数
#include
主函数******************************************/
voidmain(void){
TMOD=0x06;//TMOD=00000110B,使用计数器T0的模式2EA=1;//开总中断ET0=0;T0的中断不使用定时器//TR0=1;//启动T0TH0=0;//计数器T0高8位赋初值TL0=0;//计数器T0低8位赋初值while
(1)P1口无限循环,不停地将//计数结果送TL0P1=TL0;}
//实例51-2:
定时器T0的模式2测量正脉冲宽度
#include
主函数******************************************/voidmain(void){TMOD=0x0a;T01的模式,GATE置2使用定时器//TMOD=00001010B,EA=1;//开总中断ET0=0;//不使用定时器T0的中断TR0=1;//启动T0TH0=0;//计数器T0高8位赋初值TL0=0;//计数器T0低8位赋初值while
(1)口P1无限循环,不停地将//计数结果送TL0{while(ui==0)//INT0T0不能启动为低电平,;0TL0为高电平,启动TL0=0;//INT0计时,所以将T0清while(ui==1)//在INT0高电平期间,等待,计时
;P1=TL0;//将计时结果送P1口显示}}
//实例53:
用外中断0的中断方式进行数据采集
#include
主函数******************************************/voidmain(void){
EA=1;//开放总中断
EX0=1;//允许使用外中断IT0=1;//选择负跳变来触发外中断
P1=0xff;while
(1)
;//无限循环,防止程序跑飞}
/**************************************************************
函数功能:
外中断T0的中断服务程序**************************************************************/
voidint0(void)interrupt0using0//外中断0的中断编号为0{
P1=~P1;//每产生一次中断请求,P1取反一次。
}
//实例54-1:
输出负脉宽为200微秒的方波
#include
sbitu=P1^4;//将u位定义为P1.4/*******************************************函数功能:
主函数******************************************/
voidmain(void){
TMOD=0x02;//TMOD=00000010B,使用定时器T0的模式2
EA=1;//开总中断
ET0=1;//定时器T0中断允许
TH0=256-200;//定时器T0的高8位赋初值
TL0=256-200;//定时器T0的高8位赋初值
TR0=1;//启动定时器T0
while
(1)//无限循环,等待中断;}/**************************************************************函数功能:
定时器T0的中断服务程序**************************************************************/
voidTime0(void)interrupt1using0//interrupt声明函数为中断服务函数{u=~u;//将P1.4引脚输出电平取反,产生方波
}
//实例54-2:
测量负脉冲宽度
#include
sbitu=P3^2;//将u位定义为P3.2/*******************************************函数功能:
主函数******************************************/voidmain(void){
TMOD=0x02;//TMOD=00000010B,使用定时器T0的模式2
EA=1;//开放总中断
EX0=1;//允许使用外中断IT0=1;//选择负跳变来触发外中断ET0=1;//允许定时器T0中断
TH0=0;//定时器T0赋初值0
TL0=0;//定时器T0赋初值0
TR0=0;//先关闭T0while
(1)
;//无限循环,不停检测输入负脉冲宽度
}/**************************************************************
函数功能:
外中断0的中断服务程序**************************************************************/
voidint0(void)interrupt0using0//外中断0的中断编号为0{
TR0=1;//外中断一到来,即启动T0计时
TL0=0;//从0开始计时
while(u==0)//低电平时,等待T0计时;
P1=TL0;//将结果送P1口显示
TR0=0;//关闭T0}
//实例55:
方式0控制流水灯循环点亮
#include
#include
unsignedcharcodeTab[]={0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F};//流水灯控制码,该数组被定义为全局变量sbitP17=P1^7;/**************************************************************
函数功能:
延时约150ms**************************************************************/voiddelay(void){unsignedcharm,n;for(m=0;m<200;m++)for(n=0;n<250;n++);}/**************************************************************函数功能:
发送一个字节的数据**************************************************************/
voidSend(unsignedchardat){
//P1.7引脚输出清0信号,对74LS164清0P17=0;
//延时一个机器周期_nop_();
//延时一个机器周期,保证清0完成_nop_();
//结束对74LS164的清0P17=1;
SBUF=dat;//将数据写入发送缓冲器,启动发送
while(TI==0)//若没有发送完毕,等待
;
//发送完毕,TI被置“1”,需将其清0TI=0;
}/*******************************************函数功能:
主函数******************************************/voidmain(void){unsignedchari;
SCON=0x00;//SCON=00000000B,使串行口工作于方式0
while
(1)
{for(i=0;i<8;i++){Send(Tab[i]);//发送数据delay();//延时}}}
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 51 单片机 中断 程序 大全