久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

專注電子技術(shù)學(xué)習(xí)與研究
當(dāng)前位置:單片機(jī)教程網(wǎng) >> MCU設(shè)計(jì)實(shí)例 >> 瀏覽文章

STC12C2052AD單片機(jī)做的紅外學(xué)習(xí)遙控器-學(xué)了按鍵可以發(fā)射

作者:佚名   來(lái)源:本站原創(chuàng)   點(diǎn)擊數(shù):  更新時(shí)間:2011年03月31日   【字體:


 

// 中斷函數(shù)注意養(yǎng)成指定寄存器組的習(xí)慣
//不同優(yōu)先級(jí)的中斷程序絕對(duì)不能使用同一組寄存器
/*****編程時(shí)防止中斷把寄存器中的數(shù)據(jù)改變的解決方法是給中斷指定寄存器,
       同優(yōu)先級(jí)的使用同一組沒事。
    1、寫中斷程序一定要用using語(yǔ)句指定寄存器組。第1、2、3組都可以,不能是0.
    2、51單片機(jī)的中斷有兩個(gè)優(yōu)先級(jí)。一個(gè)中斷不會(huì)打斷另一個(gè)相同優(yōu)先級(jí)的中斷。 
       這樣相同級(jí)別中斷可以使用同一個(gè)組。比如:低優(yōu)先級(jí)的中斷函數(shù)都
       用 using 1,高優(yōu)先級(jí)的中斷都用 using 2 。這樣不會(huì)沖突。 
    下面是一個(gè)正常的例子:  
    C程序: void int0() interrupt 0 using 1
 默認(rèn)5個(gè)中斷時(shí)同級(jí)的,不會(huì)沖突,但是最好養(yǎng)成好習(xí)慣
 不指定中斷要使用的寄存器,每次都要入棧保護(hù)數(shù)據(jù),中斷完還要出棧,代碼會(huì)增加32字節(jié)
 完整代碼下載:http://www.zg4o1577.cn/f/hwxx52.rar
********************************************************************/
#include <stc12c2052ad.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
//少占魚制作  河北正定歡迎您   長(zhǎng)沙航空職業(yè)技術(shù)學(xué)院  2010 年QQ:41165643
//
//定義Flash 操作等待時(shí)間及允許IAP/ISP/EEPROM 操作的常數(shù)
//#define ENABLE_ISP 0x80 //系統(tǒng)工作時(shí)鐘<30MHz 時(shí),對(duì)ISP_CONTR 寄存器設(shè)置此值 
//#define ENABLE_ISP 0x81 //系統(tǒng)工作時(shí)鐘<24MHz 時(shí),對(duì)ISP_CONTR 寄存器設(shè)置此值 
#define ENABLE_ISP 0x82 //系統(tǒng)工作時(shí)鐘<20MHz 時(shí),對(duì)ISP_CONTR 寄存器設(shè)置此值  
//#define ENABLE_ISP 0x83 //系統(tǒng)工作時(shí)鐘<12MHz 時(shí),對(duì)ISP_CONTR 寄存器設(shè)置此值  
//#define ENABLE_ISP 0x84 //系統(tǒng)工作時(shí)鐘<6MHz 時(shí),對(duì)ISP_CONTR 寄存器設(shè)置此值 
//#define ENABLE_ISP 0x85 //系統(tǒng)工作時(shí)鐘<3MHz 時(shí),對(duì)ISP_CONTR 寄存器設(shè)置此值  
//#define ENABLE_ISP 0x86 //系統(tǒng)工作時(shí)鐘<2MHz 時(shí),對(duì)ISP_CONTR 寄存器設(shè)置此值  
//#define ENABLE_ISP 0x87 //系統(tǒng)工作時(shí)鐘<1MHz 時(shí),對(duì)ISP_CONTR 寄存器設(shè)置此值  

union union_temp16
{
    uint un_temp16;
    uchar  un_temp8[2];
}my_unTemp16;

uchar Byte_Read(uint add);              //讀一字節(jié),調(diào)用前需打開IAP 功能 
void Byte_Program(uint add, uchar ch);  //字節(jié)編程,調(diào)用前需打開IAP 功能  
void Sector_Erase(uint add);            //擦除扇區(qū) 
void IAP_Disable();                       //關(guān)閉IAP 功能  

sbit JIESHOU=P1^0; //接收指示燈
sbit FASHE=P1^1; //發(fā)射指示燈
sbit KEY=P3^5;
sbit cin=P3^2; //接收端
sbit contrl=P3^0;//發(fā)射控制端
sbit khz=P3^1;//38KHZ產(chǎn)生 ,由T1設(shè)置
/****************************************************************/
void delayms(uint);          
void ADC();
void InitADC();
void init1();
void init2();
void fashe();
void jieshou();
void delayus(uchar i);
void led(uchar x);
/******************************************************/
uint voltage;
bit  receive=0;//接收標(biāo)志
bit flag=0;//低電平記錄完成標(biāo)志 
bit end=0;
bit finish=1;
uchar  a[43]={121,1,3,4,44,55,24,156,35};//間接尋址的高128RAM,內(nèi)部256RAM高128只能間接尋址
uchar j=0;
uint zu=0,addr=0; //扇區(qū)地址
uchar k;//按鍵代號(hào)
uchar m=0;//寫EEPROM時(shí)用來(lái)移動(dòng)數(shù)組的 
uchar b[6];//用來(lái)存儲(chǔ)每一組數(shù)據(jù)的總字節(jié)數(shù)
/**********************************************************************/
/****************************************************************/
 void main()
{   
 delayus(5);
 delayms(1000);
 InitADC();//這里對(duì)其他用到P1口的地方有影響,盡量放前面
 contrl=0;//關(guān)閉38K輸出
 KEY=1;
      Sector_Erase(0x0000);//擦除扇區(qū) 1
  Sector_Erase(0x200);
  Sector_Erase(0x400);
  Sector_Erase(0x600);
  Sector_Erase(0x800);
  Sector_Erase(0xa00);
  Sector_Erase(0xc00);//擦除扇區(qū) 7
 addr=0xc00;
 FASHE=0;
 JIESHOU=0;
  FASHE=1;
     delayms(4900);

  for(j=6;j>0;j--)//j是數(shù)據(jù)總長(zhǎng)度,如此判斷,不會(huì)存儲(chǔ)多余的空位
   { Byte_Program(addr,a

??);//從本組數(shù)據(jù)對(duì)應(yīng)扇區(qū)首地址開始寫EEPROM
        m++;  //數(shù)組下移
  addr++; //地址下移
  delayms(1);} //for end
    m=Byte_Read(0xc00);

 if(m==121)
    {
 JIESHOU=1;
 delayms(6000);
 }
 m=0;//下面還要用,所以清0  
 addr=0;
 zu=0;
 
 FASHE=0;
 KEY=1;
 JIESHOU=0;
     delayms(1000);
      Sector_Erase(0x0000);//擦除扇區(qū) 1
  Sector_Erase(0x200);
  Sector_Erase(0x400);
  Sector_Erase(0x600);
  Sector_Erase(0x800);
  Sector_Erase(0xa00);
  Sector_Erase(0xc00);//擦除扇區(qū) 7
 EX1=1; //開外部中斷1
 IT1=1;//外部中斷1邊沿觸發(fā),不然按住的時(shí)候一直中斷
   EA=1;
 delayms(1);
   //等待按鍵時(shí)兩個(gè)燈滅
   while(1)
   {
  if(receive)//外部按鍵中斷1,正式進(jìn)入接收函數(shù)
  {
  FASHE=0;//發(fā)射指示燈
  JIESHOU=1; //接收指示燈
  delayms(3000);
  JIESHOU=0;
  delayms(2);
  FASHE=1;
  delayms(3000);
  FASHE=0;
  jieshou(); //接收函數(shù)是T0定時(shí)開始后計(jì)數(shù)滿溢出跳出的 
  }
    if(!KEY) //KEY為0時(shí)進(jìn)入發(fā)射模式
  {
  JIESHOU=0;
   delayms(200);
  FASHE=1;
  delayms(200);
  KEY=1;
  fashe();
  }
   }  
}
/********************************************************************/
//接收函數(shù)初始化
void init1()//接收初始化
{
  finish=1;
  EA=0;  //因?yàn)橄旅嬉獙慐EPROM,必須關(guān)閉EA
  TMOD=0x01;//T0方式1
  TH0=0x00;
  TL0=0x00;
  TR0=0;
  EX0=1;
  EX1=0;//關(guān)閉外部中斷1按鍵 ,一旦進(jìn)入接收函數(shù),就關(guān)閉按鍵防止干擾 
  ET0=1; //開T0中斷
  IT0=1; //外部中斷邊沿觸發(fā)
  EA=0;
}
//
/********************************************************************/
//發(fā)射函數(shù)初始化
void init2()//發(fā)射初始化
{
  contrl=0;//關(guān)閉發(fā)射端,由于它與38K輸出端并聯(lián),所以拉低不輸出
  TMOD=0x21;//T0方式1,外部INTO喚醒 ,T1方式2
  TH1=-(13/256);//定時(shí)13us翻轉(zhuǎn)一次,即38KHZ (26us)
  TL1=-(13%256);
  ET1=1; //T1中斷
  TR1=1;
  EA=1;
}

/************************************************************************/
// 紅外接收子程序
void jieshou()
{
 init1(); //接收初始化
 delayms(3000);
   flag=0;
   finish=1;
   JIESHOU=1;//接收燈亮才可以開始按遙控
   EA=1;//開中斷    
       EX0=1;
 //接收燈亮等待接收
 while(finish)  //退出接收循環(huán)檢測(cè)
 {
   while(flag)//T0已啟動(dòng)標(biāo)志,用完記得清0,由外部中斷0啟動(dòng),初次啟動(dòng)檢測(cè)
   {//第一次低電平測(cè)寬已經(jīng)開始
    while(!cin);//等待高電平到來(lái),T0中斷不會(huì)在這里發(fā)生,因?yàn)榈碗娖綄挾炔粫?huì)有65MS這么長(zhǎng)
     {
   TR0=0;   
      a[j]=TH0; //低電平寬度 先存高8位數(shù)據(jù)
   j++;
   a[j]=TL0;//存儲(chǔ)的是低電平寬度
      j++;//數(shù)組下移 
  TH0=0;//重裝T0
      TL0=9;//補(bǔ)償前面消耗的時(shí)間
      TR0=1;//重新啟動(dòng)T0,計(jì)時(shí)高電平     
      }
     //高電平測(cè)寬開始
    while(cin&&flag);//等待cin低電平到來(lái)。T0中斷就是在這里等待的時(shí)候發(fā)生的,因?yàn)樽詈笠粋(gè)電平必然是高電平(無(wú)信號(hào)就是高)
     //flag=1表示T0還沒中斷,還是接收有效
  if(flag)//flag為1才表示計(jì)時(shí)有效,flag=0表示最后高電平很長(zhǎng)結(jié)束了
  {  //加個(gè)flag才能退出這個(gè)等待
      TR0=0;
   a[j]=TH0; //先存高8位數(shù)據(jù)
   j++;
   a[j]=TL0;//存儲(chǔ)的是低電平段
      j++;//數(shù)組下移 
  TH0=0;   //重裝T0
      TL0=0;
      TR0=1;//重新啟動(dòng)T0,計(jì)時(shí)低電平
  }
   }
    //判斷是否退出接收
     if(end)
  {

  receive=0;//用完接收啟動(dòng)標(biāo)志要清0
  flag=0;
  FASHE=1;
  delayms(122);
  JIESHOU=1;//亮兩個(gè)燈表示接收成功 
  j=0;
  finish=0;
  end=0;
  }
  }
  //接收完亮兩個(gè)燈
      finish=1;
    EX1=1;//開外部按鍵中斷1
  EA=1;
  }
/***********************************************/
// 紅外發(fā)射子程序
void fashe() //發(fā)射程序里沒有安排推出操作,所以只有重啟才能重新進(jìn)入選擇模式
{
 
  while(1)
  {
  ADC();
  switch(k)
  {
  case 1:for(j=0<j<b[0];j++){a[j]=Byte_Read(j);}led(b[0]); break;
  case 2:for(j=0<j<b[1];j++){a[j]=Byte_Read(j+0x200);}led(b[1]);break;
  case 3:for(j=0<j<b[2];j++){a[j]=Byte_Read(j+0x400);}led(b[2]);break;
  case 4:for(j=0<j<b[3];j++){a[j]=Byte_Read(j+0x600);}led(b[3]);break;
  case 5:for(j=0<j<b[4];j++){a[j]=Byte_Read(j+0x800);}led(b[4]);break;
  case 6:for(j=0<j<b[5];j++){a[j]=Byte_Read(j+0xa00);}led(b[5]);break;

  default:k=0;break;
  }
  init2();//必須先讀EEPROM再開定時(shí)器中斷,不然會(huì)無(wú)法讀EEPROM
  }
}
//
/**********************************************************************/
 void led(uchar x)
 {
  j=0;
  x=x/2;//2個(gè)數(shù)組是一段電平,而且肯定是偶數(shù)個(gè)數(shù)組 2*N 是偶數(shù)嘛
  while(x)
  {
  TH0=a[j];
  j++;
  TL0=a[j];
  j++;
  TR0=1;//
  while(!TF0);//等待T0溢出,因?yàn)闆]有采用T0中斷 
  contrl=!contrl;
  x--;
  }
  }
//
/***************************************************************/
/*****編程時(shí)防止中斷把寄存器中的數(shù)據(jù)改變的解決方法是給中斷指定寄存器,同優(yōu)先級(jí)的使用同一組沒事。
     1、寫中斷程序一定要用using語(yǔ)句指定寄存器組。第1、2、3組都可以,不能是0.
    2、51單片機(jī)的中斷有兩個(gè)優(yōu)先級(jí)。一個(gè)中斷不會(huì)打斷另一個(gè)相同優(yōu)先級(jí)的中斷。 
 這樣相同級(jí)別中斷可以使用同一個(gè)組。比如:低優(yōu)先級(jí)的中斷函數(shù)都用 using 1,高優(yōu)先級(jí)的中斷都用 using 2 。這樣不會(huì)沖突。 
    下面是一個(gè)正常的例子:  
    C程序: void int0() interrupt 0 using 1
 默認(rèn)5個(gè)中斷時(shí)同級(jí)的,不會(huì)沖突,但是最好養(yǎng)成好習(xí)慣
 不指定中斷要使用的寄存器,每次都要入棧保護(hù)數(shù)據(jù),中斷完還要出棧,代碼會(huì)增加32字節(jié)
********************************************************************/
//中斷函數(shù)要指定使用那組寄存器,使用同一組時(shí)可能會(huì)破壞了上次寄存器中的數(shù)據(jù)   
//同一優(yōu)先級(jí)的中斷可以使用同一組寄存器
  void time0() interrupt 1 using 1//定時(shí)器0中斷
  {
   EA=0;
   EX0=0;
   EX1=0;
   ET0=0;
   FASHE=0;
   delayms(200);
   JIESHOU=0; //接收指示燈
   delayms(1000);
   //有65MS以上了,表示接收完畢
   b[zu/0x200]=j; //j是從0開始的,最后一次電平存完j自加1了,總長(zhǎng)度正好是當(dāng)前值 
   addr=zu;//因?yàn)橄旅鎧u值還要用,所以這里轉(zhuǎn)移其數(shù)據(jù) 
   //zu是每個(gè)存儲(chǔ)空間的起始地址
   m=0;
   for(;j>0;j--)//j是數(shù)據(jù)總長(zhǎng)度,如此判斷,不會(huì)存儲(chǔ)多余的空位
   { Byte_Program(addr,a

??);//從本組數(shù)據(jù)對(duì)應(yīng)扇區(qū)首地址開始寫EEPROM
        m++;  //數(shù)組下移
  addr++; //地址下移
  delayms(1);} //for end

     i<(zu<0xa00)//第一組代碼完畢后,轉(zhuǎn)到第二組,每組都是200個(gè)空間
      zu+=0x200; //測(cè)完一組 ,扇區(qū)地址指向下一個(gè)扇區(qū)
      else
    { zu=0x000;} //超過(guò)6組代碼,內(nèi)存重新指向第1組
  flag=0;
  receive=0;//用完接收啟動(dòng)標(biāo)志要清0
      end=1;//退出接收函數(shù)最外層循環(huán)

  }
/******************************************************/
// 發(fā)射頻率38khz由T1產(chǎn)生
  void time1() interrupt 3 using 1 //定時(shí)器1中斷 ,因?yàn)槟J(rèn)是同優(yōu)先級(jí),所以可以使用同一組寄存器
  {
   khz=!khz;
  }
/******************************************************/
// 外部中斷 存儲(chǔ)高電平長(zhǎng)度
void interint0()  interrupt 0 using 1 //外部中斷0  
{
 
  if (flag==0)//flag=0表示是首次接收到脈沖
   {
     TH0=0;
 TL0=10;//前面延時(shí)函數(shù)消耗的時(shí)間補(bǔ)上
     TR0=1;
 EX0=0;//關(guān)閉外部中斷0,以后的計(jì)數(shù)都在接收函數(shù)里
     flag=1;//表示啟動(dòng)T0

    }

}
//
/************************************************************/
/******************************************************/
// 外部按鍵中斷 1
void interint1()  interrupt 2 using 1 //外部中斷1   
{
 receive=1;
 delayms(122);//等過(guò)抖動(dòng)時(shí)間
 EA=0;
}

/******************************************************/
//AD轉(zhuǎn)換初始化 ----打開ADC電源
void InitADC()
{
P1=0xff;//這里對(duì)其他用到P1口的地方有影響
ADC_CONTR|=0x80;
delayms(30);
//這兩個(gè)寄存器用來(lái)設(shè)置 P1口四種狀態(tài),每一位對(duì)應(yīng)一個(gè)P1引腳 ,按狀態(tài)組合操作

P1M0=0x08;//這兩個(gè)寄存器用來(lái)設(shè)置 P1口四種狀態(tài),每一位對(duì)應(yīng)一個(gè)P1引腳 ,按狀態(tài)組合操作
P1M1=0x08;//設(shè)置 P1.3做AD  

 }


 /******************************************************************/
// AD轉(zhuǎn)換程序
void  ADC()
{ 
  

    ADC_DATA   = 0; //清除結(jié)果

    ADC_CONTR = 0x60;      //轉(zhuǎn)換速度設(shè)置  0x60  最快速度

    ADC_CONTR = 0xE0;               //1110,0000 清 ADC_FLAG, ADC_START 位和低 3 位
    ADC_CONTR |= 0x03;           //選擇 A/D 當(dāng)前通道   P1.3
    delayus(100);                       //使輸入電壓達(dá)到穩(wěn)定
    ADC_CONTR |= 0x08;              //0000,1000 令 ADCS = 1, 啟動(dòng)A/D轉(zhuǎn)換, 

    while(!(ADC_CONTR & 0x10)); //!的優(yōu)先級(jí)比&高太多了 
 /***************
 這里while 不能改成while(ADC_CONTR & 0x10==0) ;就錯(cuò)誤了,因?yàn)閮?yōu)先級(jí) ==比&高 ,所以要加括號(hào)
  while( (ADC_CONTR & 0x10)  ==0)    或者非一下  while(!(ADC_CONTR & 0x10)); //!的優(yōu)先級(jí)比&高太多了 
    ******************************/
    ADC_CONTR &= 0xE7;     //1111,0111 清 ADC_FLAG 位, 關(guān)閉A/D轉(zhuǎn)換, 
 
   voltage=ADC_DATA;

   if( vol<age<40)
    {
  k=1; //對(duì)應(yīng)0X000扇區(qū)內(nèi)容
    }
   if(voltage>=40&&vol<age<80)
    {
  k=2; //對(duì)應(yīng)0X200扇區(qū)內(nèi)容
    }

  if(voltage>=80&&vol<age<110)
    {
   k=3;
    }
  if(voltage>=110&&vol<age<130)
    {
   k=4;
    }
  if(voltage>=130&&vol<age<148)
    {
  k=5;
    }
  if(voltage>=148&&vol<age<160)//注意:默認(rèn)是165 電壓AD值
    {
   k=6;
    }

}

/******************************************/
/*
  --- STC International Limited ----------------
一個(gè)完整的EEPROM 測(cè)試程序,用宏晶的下載板可以直接測(cè)試
STC12C52xxAD 系列單片機(jī) EEPROM/IAP 功能測(cè)試程序演示 
STC11xx 系列單片機(jī) EEPROM/IAP 功能測(cè)試程序演示
STC10xx 系列單片機(jī) EEPROM/IAP 功能測(cè)試程序演示
 --- STC International Limited ------------------
 --- 宏晶科技  設(shè)計(jì) 2009/1/12 V1.0 --------------
***********************************************/


//讀一字節(jié),調(diào)用前需打開IAP 功能,入口:DPTR = 字節(jié)地址,返回:A = 讀出字節(jié) 
uchar Byte_Read(uint add)
{
    ISP_DATA = 0x00;
    ISP_CONTR = ENABLE_ISP;         //打開IAP 功能, 設(shè)置Flash 操作等待時(shí)間 
    ISP_CMD = 0x01;                 //IAP/ISP/EEPROM 字節(jié)讀命令 

    my_unTemp16.un_temp16 = add;  //聯(lián)合體變量賦值 ,這里是倆字節(jié),因?yàn)楣脙?nèi)存,所以下面數(shù)組也是此內(nèi)容
    ISP_ADDRH = my_unTemp16.un_temp8[0];    //設(shè)置目標(biāo)單元地址的高8 位地址 
    ISP_ADDRL = my_unTemp16.un_temp8[1];    //設(shè)置目標(biāo)單元地址的低8 位地址 

    EA = 0;
    ISP_TRIG = 0x46;   //先送 5Ah,再送A5h 到ISP/IAP 觸發(fā)寄存器,每次都需如此 
    ISP_TRIG = 0xB9;   //送完A5h 后,ISP/IAP 命令立即被觸發(fā)起動(dòng)
    _nop_();
    //EA = 1;
    IAP_Disable();  //關(guān)閉IAP 功能, 清相關(guān)的特殊功能寄存器,使CPU 處于安全狀態(tài),
                    //一次連續(xù)的IAP 操作完成之后建議關(guān)閉IAP 功能,不需要每次都關(guān)   
    return (ISP_DATA); //數(shù)據(jù)在ISP_DATA寄存器中
}

//字節(jié)編程,調(diào)用前需打開IAP 功能,入口:DPTR = 字節(jié)地址, A= 須編程字節(jié)的數(shù)據(jù)  
void Byte_Program(uint add, uchar ch)
{
    ISP_CONTR = ENABLE_ISP;         //打開 IAP 功能, 設(shè)置Flash 操作等待時(shí)間 
    ISP_CMD = 0x02;                 //IAP/ISP/EEPROM 字節(jié)編程命令 

    my_unTemp16.un_temp16 = add;  //聯(lián)合體變量賦值 ,這里是倆字節(jié),因?yàn)楣脙?nèi)存,所以下面數(shù)組也是此內(nèi)容
    ISP_ADDRH = my_unTemp16.un_temp8[0];    //設(shè)置目標(biāo)單元地址的高8 位地址 
    ISP_ADDRL = my_unTemp16.un_temp8[1];    //設(shè)置目標(biāo)單元地址的低8 位地址 

    ISP_DATA = ch;                  //要編程的數(shù)據(jù)先送進(jìn)ISP_DATA 寄存器  
    EA = 0;//必須關(guān)中斷,不然沒法寫
    ISP_TRIG = 0x46;   //先送 46h,再送B9h 到ISP/IAP 觸發(fā)寄存器,每次都需如此 
    ISP_TRIG = 0xb9;   //送完B9h 后,ISP/IAP 命令立即被觸發(fā)起動(dòng)    
    _nop_();
    //EA = 1;
    IAP_Disable();  //關(guān)閉IAP 功能, 清相關(guān)的特殊功能寄存器,使CPU 處于安全狀態(tài),
                    //一次連續(xù)的IAP 操作完成之后建議關(guān)閉IAP 功能,不需要每次都關(guān)   
}

//擦除扇區(qū), 入口:DPTR = 扇區(qū)地址
void Sector_Erase(uint add)
{
    ISP_CONTR = ENABLE_ISP;         //打開IAP 功能, 設(shè)置Flash 操作等待時(shí)間 
    ISP_CMD = 0x03;                 //IAP/ISP/EEPROM 扇區(qū)擦除命令 

    my_unTemp16.un_temp16 = add;
    ISP_ADDRH = my_unTemp16.un_temp8[0];    //設(shè)置目標(biāo)單元地址的高8 位地址 
    ISP_ADDRL = my_unTemp16.un_temp8[1];    //設(shè)置目標(biāo)單元地址的低8 位地址 

    EA = 0;//必須關(guān)中斷
    ISP_TRIG = 0x46;   //先送 46h,再送B9h 到ISP/IAP 觸發(fā)寄存器,每次都需如此  
    ISP_TRIG = 0xB9;   //送完B9h 后,ISP/IAP 命令立即被觸發(fā)起動(dòng)   
    _nop_();
    //EA = 1;
    IAP_Disable();  //關(guān)閉IAP 功能, 清相關(guān)的特殊功能寄存器,使CPU 處于安全狀態(tài),
                    //一次連續(xù)的IAP 操作完成之后建議關(guān)閉IAP 功能,不需要每次都關(guān) 
}

void IAP_Disable()
{
    //關(guān)閉IAP 功能, 清相關(guān)的特殊功能寄存器,使CPU 處于安全狀態(tài),
    //一次連續(xù)的IAP 操作完成之后建議關(guān)閉IAP 功能,不需要每次都關(guān)   
    ISP_CONTR = 0;      //關(guān)閉IAP 功能
    ISP_CMD   = 0;      //清命令寄存器,使命令寄存器無(wú)命令,此句可不用   
    ISP_TRIG  = 0;      //清命令觸發(fā)寄存器,使命令觸發(fā)寄存器無(wú)觸發(fā),此句可不用  
    ISP_ADDRH = 0;
    ISP_ADDRL = 0;
}


//
void delayus(uchar i )
{

    while(i--);
}

//延時(shí)函數(shù)
void delayms(uint k)
{
uint data i,j;
for(i<0;i<k;i++)
  {
    for(j<0;j<200;j++)
     {;}
   }
}

 
關(guān)閉窗口

相關(guān)文章

主站蜘蛛池模板: 亚洲欧美视频一区二区 | 国产精品欧美一区二区三区 | 精品日韩一区 | 免费一看一级毛片 | 日本在线免费视频 | 亚洲综合视频 | 国产精品视频一区二区三区, | 日韩一区二区在线观看 | 成人国产精品视频 | 在线国产一区 | 亚洲国产精品一区二区三区 | 妖精视频一区二区三区 | 免费高清av | 91视频大全 | 中文字幕在线视频网站 | 日日夜夜天天 | 中文字幕成人在线 | 91精品在线播放 | 欧美大片一区 | 久久精品一区二区三区四区 | 国产午夜精品视频 | 成人免费观看男女羞羞视频 | 欧美日本在线观看 | 91精品国产色综合久久不卡98 | 成人av一区 | 91嫩草精品| 手机在线观看 | 日韩欧美国产精品 | 99国产精品99久久久久久 | 亚洲精品中文字幕 | 亚洲一区二区三区 | 99pao成人国产永久免费视频 | 国产成都精品91一区二区三 | 日本欧美黄色片 | 国产精品久久片 | 久久精品国产一区 | 国产精品久久久久久亚洲调教 | 国产精品久久久久久238 | 国产精品视频在线观看 | 久久精品久久久久久 | 国产成人综合在线 |