久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费
標題:
為什么51單片機中斷后一直卡死在中斷,不會繼續往下執行,也不會返回主程序
[打印本頁]
作者:
hjskjhgskh
時間:
2019-5-15 14:48
標題:
為什么51單片機中斷后一直卡死在中斷,不會繼續往下執行,也不會返回主程序
#include<reg52.h>
#include"2.h"
/***************紅外解碼***********************/
unsigned char IR_DAT[4];
sbit IR=P3^2; //將IR位定義為P3.2引腳
unsigned int LowTime,HighTime; //儲存高、低電平的寬度
unsigned char bz;
/************************************************************
函數功能:對4個字節的用戶碼和鍵數據碼進行解碼
說明:解碼正確,返回1,否則返回0
出口參數:dat
*************************************************************/
/*****************先知科技******************************
led顯示驅動程序
V1.0-20190512
*******************************************************/
#include<reg52.h>
sbit SI=P2^0;//定義數據輸入口
sbit SCK=P2^1;//上升沿時數據寄存器的數據移位,a>h
sbit RCK=P2^2;//上升沿時移位寄存器數據進入數據存儲器
/**************************************************
函數功能:延時1ms
***************************************************/
void delay1ms()
{
unsigned char i,j;
for(i=0;i<10;i++)
for(j=0;j<33;j++)
;
}
/*****************************************************
函數功能:延時若干毫秒
入口參數:n
**************************************************/
void delay(unsigned int n)
{
unsigned int i;
for(i=0;i<n;i++)
delay1ms();
}
void Ser_IN(unsigned char DataH,unsigned char DataL)
{
unsigned char i;
for(i=0;i<8;i++)
{
SCK=0;//現將移位寄存器時鐘置低
SI=DataH&0x80;//取數據最高位
DataH<<=1;
SCK=1;
}
for(i=0;i<8;i++)
{
SCK=0;//現將移位寄存器時鐘置低
SI= DataL&0x80;//取數據最高位
DataL<<=1;
SCK=1;
}
}
//并行數據輸出
void Par_OUT(void)
{
RCK=0;
RCK=1;
}
void dispay_reset1(void)
{
Ser_IN(0x00,0x00); //全部開啟
Par_OUT();
delay(100);
Ser_IN(0xff,0xff); //全部關閉
Par_OUT();
delay(100);Ser_IN(0x00,0x00); //全部開啟
Par_OUT();
delay(100);
Ser_IN(0xff,0xff); //全部關閉
Par_OUT();
delay(100);Ser_IN(0x00,0x00); //全部開啟
Par_OUT();
delay(100);
Ser_IN(0xff,0xff); //全部關閉
Par_OUT();
delay(100);Ser_IN(0x00,0x00); //全部開啟
Par_OUT();
delay(100);
Ser_IN(0xff,0xff); //全部關閉
Par_OUT();
delay(100);Ser_IN(0x00,0x00); //全部開啟
Par_OUT();
delay(100);
Ser_IN(0xff,0xff); //全部關閉
Par_OUT();
delay(100);Ser_IN(0x00,0x00); //全部開啟
Par_OUT();
delay(100);
Ser_IN(0xff,0xff); //全部關閉
Par_OUT();
delay(100);Ser_IN(0x00,0x00); //全部開啟
Par_OUT();
delay(100);
Ser_IN(0xff,0xff); //全部關閉
Par_OUT();
delay(100);Ser_IN(0x00,0x00); //全部開啟
Par_OUT();
delay(100);
Ser_IN(0xff,0xff); //全部關閉
Par_OUT();
delay(100);Ser_IN(0x00,0x00); //全部開啟
Par_OUT();
delay(100);
Ser_IN(0xff,0xff); //全部關閉
Par_OUT();
delay(100);Ser_IN(0x00,0x00); //全部開啟
Par_OUT();
delay(100);
Ser_IN(0xff,0xff); //全部關閉
Par_OUT();
delay(100);Ser_IN(0x00,0x00); //全部開啟
Par_OUT();
delay(100);
Ser_IN(0xff,0xff); //全部關閉
Par_OUT();
delay(100);Ser_IN(0x00,0x00); //全部開啟
Par_OUT();
delay(100);
Ser_IN(0xff,0xff); //全部關閉
Par_OUT();
delay(100);
}
void dispay_reset(void)
{
/**************************************
流水燈檢測壞點
**************************************/
Ser_IN(0x7f,0xff);//1
Par_OUT();
delay(100);
Ser_IN(0xbf,0xff);//2
Par_OUT();
delay(100);
Ser_IN(0xdf,0xff);//3
Par_OUT();
delay(100);
Ser_IN(0xef,0xff);//4
Par_OUT();
delay(100);
Ser_IN(0xf7,0xff);//5
Par_OUT();
delay(100);
Ser_IN(0xfb,0xff);//6
Par_OUT();
delay(100);
Ser_IN(0xfd,0xff);//7
Par_OUT();
delay(100);
Ser_IN(0xfe,0xff);//8
Par_OUT();
delay(100);
Ser_IN(0xff,0x7f);//9
Par_OUT();
delay(100);
Ser_IN(0xff,0xbf);//10
Par_OUT();
delay(100);
Ser_IN(0xff,0xdf);//11
Par_OUT();
delay(100);
Ser_IN(0xff,0xef);//12
Par_OUT();
delay(100);
Ser_IN(0xff,0xf7);//13
Par_OUT();
delay(100);
Ser_IN(0xff,0xfb);//14
Par_OUT();
delay(100);
Ser_IN(0xff,0xfd);//15
Par_OUT();
delay(100);
Ser_IN(0xff,0xfe);//16
Par_OUT();
delay(100);
Ser_IN(0x00,0x00); //全部開啟
Par_OUT();
delay(100);
Ser_IN(0xff,0xff); //全部關閉
Par_OUT();
delay(100);
Ser_IN(0x00,0x00); //全部開啟
Par_OUT();
delay(100);
Ser_IN(0xff,0xff); //全部關閉
Par_OUT();
delay(100);
Ser_IN(0x00,0x00); //全部開啟
Par_OUT();
delay(100);
Ser_IN(0xff,0xff); //全部關閉
Par_OUT();
delay(100);
Ser_IN(0xff,0xfe);//16
Par_OUT();
delay(100);
Ser_IN(0xff,0xfd);//15
Par_OUT();
delay(100);
Ser_IN(0xff,0xfb);//14
Par_OUT();
delay(100);
Ser_IN(0xff,0xf7);//13
Par_OUT();
delay(100);
Ser_IN(0xff,0xef);//12
Par_OUT();
delay(100);
Ser_IN(0xff,0xdf);//11
Par_OUT();
delay(100);
Ser_IN(0xff,0xbf);//10
Par_OUT();
delay(100);
Ser_IN(0xff,0x7f);//9
Par_OUT();
delay(100);
Ser_IN(0xfe,0xff);//8
Par_OUT();
delay(100);
Ser_IN(0xfd,0xff);//7
Par_OUT();
delay(100);
Ser_IN(0xfb,0xff);//6
Par_OUT();
delay(100);
Ser_IN(0xf7,0xff);//5
Par_OUT();
delay(100);
Ser_IN(0xef,0xff);//4
Par_OUT();
delay(100);
Ser_IN(0xdf,0xff);//3
Par_OUT();
delay(100);
Ser_IN(0xbf,0xff);//2
Par_OUT();
delay(100);
Ser_IN(0x7f,0xff);//1
Par_OUT();
delay(100);
Ser_IN(0x00,0x00); //全部開啟
Par_OUT();
delay(100);
Ser_IN(0xff,0xff); //全部關閉
Par_OUT();
delay(100);
Ser_IN(0x00,0x00); //全部開啟
Par_OUT();
delay(100);
Ser_IN(0xff,0xff); //全部關閉
Par_OUT();
delay(100);
Ser_IN(0x00,0x00); //全部開啟
Par_OUT();
delay(100);
Ser_IN(0xff,0xff); //全部關閉
Par_OUT();
delay(100);
}
main()
{
while(1)
{ EA=1; //開啟總中斷
EX0=1; //開外中斷0
ET0=0; //定時器T1中斷允許
IT0=1; //外中斷的下降沿觸發
TMOD=0x11; //使用定時器T1的模式1
TR0=0; //定時器T0關閉
dispay_reset();
if(0x0a==bz)
{
Ser_IN(bz,bz);
Par_OUT();
}
else
{
dispay_reset1();
}
}
}
/************************************************************
函數功能:紅外線觸發的外中斷處理函數
*************************************************************/
void Int0(void) interrupt 0
{
unsigned char i,j;
unsigned char IR_temp; //儲存解碼出的數據
EX0=0;//關閉外中斷0,不在接收二次紅外信號中斷,只解碼當前的紅外
TH0=0;//定時器高八位清零
TL0=0;//定時器T0低八位清0
TR0=1;//定時器開啟
while(IR==0);//等待低電平變為高電平計算低電平的時間
TR0=0;//關閉定時器T0
LowTime=TH0*256+TL0;//保存低電平的時間
TH0=0;
TL0=0;
TR0=1;//定時器清空之后,重新計算高電平的時間
while(IR==1);
TR0=0;//關閉定時器
HighTime=TH0*256+TL0;
if((LowTime>7800)&&(LowTime<8800)&&(HighTime>3600)&&(HighTime<4700)) //如果是引導碼,就開始解碼,否則放棄,引導碼的低電平計時
{
for(i=0;i<4;i++)
{
for(j=0;j<8;j++)
{
while(IR==0);//低電平不執行程序,濾掉低電平,只檢測高電平
TH0=0;
TL0=0; //檢測到高電平開始計算高電平持續時間
TR0=1;
while(IR==1);//等待高電平結束
TR0=0;//高電平結束停止計時
HighTime=TH0*256+TL0; //計算高電平的時間
IR_temp=IR_temp>>1;
if((HighTime>420)&&(HighTime<620)) //如果高電平時間在560微秒左右,即計數560/1.085=516次
IR_temp=IR_temp&0x7f; //(520-100=420, 520+100=620),則該位是0
if((HighTime>1300)&&(HighTime<1800)) //如果高電平時間在1680微秒左右,即計數1680/1.085=1548次
IR_temp=IR_temp|0x80;
}
IR_DAT[i]=IR_temp;//將得到的數據保存在數組中
dispay_reset1();
}
/******************************
if(IR_DAT[2]!=~IR_DAT[3])
{
bz=0xff;
EX0=1;
Ser_IN(0xff,0x00);
Par_OUT();
return;
}
else
{
bz=IR_DAT[2];
Ser_IN(bz,bz);
Par_OUT();
EX0=1;
//
}
dispay_reset();
return;
}
// else
// {
// EX0=0;//關閉外中斷0,不在接收二次紅外信號中斷,只解碼當前的紅外
//dispay_reset1();
// }
*******************************/
}
EX0=1;
//restart:
}
作者:
克林
時間:
2019-11-8 20:08
中斷服務函數里面好像是不能執行太多東西的。
作者:
chen_ying992
時間:
2019-11-24 10:07
我是遇到網上拿來的紅外中斷出問題了,回不去主程序,中斷一直沒問題,后來把中斷名改正常了 好像也就好了
void exint0() interrupt 0
作者:
無敵的UUZ大人
時間:
2019-11-26 12:23
為什么我在程序中并沒有看到定時器設初值這條?
作者:
SKLMT
時間:
2019-11-26 14:42
中斷執行完如果有需求需要加個return;中斷不要執行時間太長;不然很容易出現預想不到的問題。
作者:
H1996
時間:
2019-11-26 17:18
中斷里面內容過多
作者:
zhang1070020919
時間:
2019-11-26 17:36
為什么我在程序中并沒有看到定時器設初值這條?
歡迎光臨 (http://www.zg4o1577.cn/bbs/)
Powered by Discuz! X3.1
主站蜘蛛池模板:
情侣酒店偷拍一区二区在线播放
|
欧美日韩在线一区二区三区
|
日韩精品免费看
|
国产成人在线视频
|
视频一区二区在线观看
|
亚洲欧美国产精品久久
|
成人免费毛片片v
|
美女人人操
|
久久久国产一区
|
www.日韩
|
激情亚洲
|
日韩av美女电影
|
免费一区
|
国产精品久久久久久一区二区三区
|
国产目拍亚洲精品99久久精品
|
久久精品一级
|
国产精品一区久久久
|
日韩中文字幕在线视频
|
国产高清视频
|
91av免费看
|
搞黄网站在线观看
|
日日摸天天添天天添破
|
久久亚洲综合
|
精品成人在线观看
|
xx性欧美肥妇精品久久久久久
|
综合一区
|
韩国精品在线
|
久久久久久国产精品免费免费男同
|
九九热这里只有精品6
|
一区二区三区四区国产
|
а天堂中文最新一区二区三区
|
欧美成人综合
|
超碰操
|
a欧美
|
精品在线一区二区三区
|
亚洲成年在线
|
日韩欧美电影在线
|
日本久久综合
|
999久久
|
欧美久久久久久久久中文字幕
|
免费一区二区三区
|