<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 51單片機(jī)一鍵下載相關(guān)

          51單片機(jī)一鍵下載相關(guān)

          作者: 時(shí)間:2016-11-28 來(lái)源:網(wǎng)絡(luò) 收藏

          // 作品:STC免手動(dòng)燒寫(xiě)(自適應(yīng)波特率自動(dòng)冷啟) + 簡(jiǎn)易邏輯分析儀
          // 芯片:STC15F104E
          // 晶振:45MHz
          // 編譯:Keil uVision4 V9.00
          //
          // 說(shuō)明:自適應(yīng)STC-ISP軟件最低波特率(1200bps/2400bps/4800bps)
          //3種模式:①自動(dòng)燒寫(xiě)(默認(rèn))【LED_key不亮:模式① ,LED亮:通電 ,LED不亮:關(guān)電】
          //②邏輯分析儀(正向波形) 【LED_key亮:模式② ,LED亮:預(yù)備 ,LED不亮:采樣】
          //③邏輯分析儀(反向波形) 【LED_key閃爍:模式③ ,LED亮:預(yù)備 ,LED不亮:采樣】
          //①②③模式下,系統(tǒng)板都可以正常串口通信。
          //②③模式下,也可以燒寫(xiě)程序(手動(dòng)燒寫(xiě)),不過(guò)正在“采樣”時(shí)請(qǐng)不要燒寫(xiě)程序以及系統(tǒng)板串口通信。
          //
          // 注:建議燒寫(xiě)程序時(shí)啟動(dòng)看門(mén)狗(預(yù)分頻數(shù)256,約2.2S @ 45MHz)
          //
          //另:關(guān)于STC-ISP V4.88版本,發(fā)現(xiàn)用PL2303HX芯片燒寫(xiě)STC15系列很難成功,最低/高波特率都選用4800bps才可以燒寫(xiě)。
          //關(guān)于STC-ISP V6.06版本,用PL2303HX芯片燒寫(xiě)STC15系列非常好(直接用默認(rèn)的最低/高波特率),
          //但V6.06版本內(nèi)部R/C振蕩器最高只可以選33.1776MHz。
          //用FT232芯片燒寫(xiě),則通殺STC-ISP所有版本(直接用默認(rèn)的最低/高波特率)。
          //

          #include "STC15F104E.H"
          #include "MY_SET.h"

          sbit LED= P3^0;//指示燈
          sbit KEY= P3^1;//按鍵
          sbit RXB= P3^2;
          sbit TXB= P3^3;
          sbit PNP= P3^4;//PNP三極管
          sbit IO_in = P3^5;//分析儀采樣引腳

          uint8Mode;//模式
          bitB_init;//初始化標(biāo)志
          uint8KEY_Value; //按鍵消抖計(jì)數(shù)
          bitON;//按鍵標(biāo)志
          bitOver;
          bitLED_key;//模式指示燈(在按鍵上擴(kuò)展)
          uint16Count;//閃爍計(jì)數(shù)
          bitP_N;//正向標(biāo)志
          uint8BIT8,cnt,Dat;
          uint16Time;

          uint8 TBUF,RBUF;//發(fā)送/接收緩存
          uint8 TDAT,RDAT;//發(fā)送/接收數(shù)據(jù)暫存
          uint8 TCNT,RCNT;//發(fā)送/接收計(jì)數(shù)器
          uint8 TBIT,RBIT;//發(fā)送/接收比特?cái)?shù)
          bitTING,RING;//開(kāi)始發(fā)送/接收標(biāo)志
          bitTEND,REND;//發(fā)送/接收完成標(biāo)志

          bitSTART;//重啟標(biāo)志
          uint8 Correct_nums;//『連續(xù)正確』計(jì)數(shù)器
          uint8 Error_nums;//錯(cuò)誤累加計(jì)數(shù)器
          uint8 Status;//波特率狀態(tài)


          void YS(uint8 n)
          {
          uint8 a,b,c;

          while(n--)
          {
          for(c=66;c>0;c--)
          for(b=100;b>0;b--)
          for(a=100;a>0;a--);
          }
          }

          void UART_INIT()
          {
          TING = 0;
          RING = 0;
          TEND = 1;
          REND = 0;
          TCNT = 0;
          RCNT = 0;
          }

          void Analyzer_Init()
          {
          TR1 = 0;
          TF1 = 0;
          Time = 0;
          BIT8 = 0;
          TL0 = 0x7E; //初始化T0和設(shè)定重載值
          TH0 = 0xFF;//修改成 115200bps
          LED = 0;//指示燈開(kāi)
          }

          void UART_Change()
          {
          if(++Status > 2)Status=0;
          switch(Status)
          {
          case 0: TL0=(65536-15000000/1200); TH0=(65536-15000000/1200)>>8; break; // 1200bps
          case 1: TL0=(65536-15000000/2400); TH0=(65536-15000000/2400)>>8; break; // 2400bps
          case 2: TL0=(65536-15000000/4800); TH0=(65536-15000000/4800)>>8; break; // 4800bps
          }
          }

          void Restart()
          {
          if(START)
          {
          START = 0;

          TR0 = 0;
          PNP = 1;//關(guān)電
          LED = 1;
          YS(10);//從『加載HEX』到『提示上電』有5秒,但不必等到『提示上電』
          WDT_CONR |= 0x10;//清看門(mén)狗(預(yù)分頻數(shù)256,約2.2S @ 45MHz)
          PNP = 0;//通電
          LED = 0;
          YS(30);
          WDT_CONR |= 0x10;//清看門(mén)狗(預(yù)分頻數(shù)256,約2.2S @ 45MHz)

          TR0 = 1;
          RING = 0;
          REND = 0;
          RCNT = 0;
          }
          }

          void main()
          {
          uint8 i;

          P33 = 1;
          WDT_CONR |= 0x10; //清看門(mén)狗(預(yù)分頻數(shù)256,約2.2S @ 45MHz)
          PNP = 0;//通電
          LED= 0;
          LED_key = 1;//關(guān)

          for(i=0;i<30;i++){ YS(1); LED = ~LED; } //冷啟/低壓復(fù)位 指示
          WDT_CONR |= 0x10; //清看門(mén)狗(預(yù)分頻數(shù)256,約2.2S @ 45MHz)

          TMOD = 0x00;//T0、T1處于16位自動(dòng)重裝模式
          AUXR = 0xC0;//T0、T1工作在1T模式
          TL1 = (65536-903);
          TH1 = (65536-903)>>8;
          UART_Change();
          TR0 = 1;
          EA= 1;
          ET0 = 1;
          PT0 = 1;//提高T0的中斷優(yōu)先級(jí)
          ET1 = 1;
          UART_INIT();

          Mode = 0;

          while(1)
          {
          switch(Mode)
          {
          case 0: if(B_init)
          {
          B_init=0;
          TR1=0;
          PNP = 0;//通電
          LED=0;
          UART_Change();
          UART_INIT();
          }
          Restart();
          LED_key = 1;
          break;

          case 1: if(B_init){ B_init=0; P_N=1; Analyzer_Init(); }
          if(!IO_in){ TR1=1; LED=1;}//啟動(dòng)定時(shí)器1,采樣開(kāi)始
          if(Over)
          {
          Over=0;
          if(++Time > 3320)Analyzer_Init();//約16.6秒(5ms * 3320),即每次采集完,過(guò)4秒(16.6S-12.6S)后重新工作
          }
          LED_key = 0;
          break;

          case 2: if(B_init){ B_init=0; P_N=0; Analyzer_Init(); }
          if(!IO_in){ TR1=1; LED=1;}
          if(Over)
          {
          Over=0;
          if(++Time > 3320)Analyzer_Init();
          }
          if(++Count >10000){ Count=0; LED_key=!LED_key;} //閃爍
          break;

          default:Mode=0;
          break;
          }

          //按鍵檢測(cè)
          KEY = 1;//拉高電平
          NOP12();//稍微延時(shí)
          if(!KEY)
          {
          if(ON==0)KEY_Value++;
          if(KEY_Value > 200)
          {
          KEY_Value = 0;
          ON = 1;//按鍵標(biāo)志置“1”
          if(++Mode > 2)Mode=0;
          B_init = 1;//『初始化標(biāo)志』置“1”
          }
          }
          else { KEY_Value=0; ON=0; }

          //恢復(fù)指示燈狀態(tài)
          if(LED_key)KEY=1;
          elseKEY=0;

          WDT_CONR |= 0x10;//清看門(mén)狗(預(yù)分頻數(shù)256,約2.2S @ 45MHz)
          }
          }

          void tm0() interrupt 1 using 1
          {
          if(RING)
          {
          if(--RCNT == 0)
          {
          RCNT = 3;//復(fù)位接收波特率計(jì)數(shù)器
          if(--RBIT == 0)
          {
          RBUF = RDAT;//保存數(shù)據(jù)到RBuf管理
          RING = 0;//停止接收
          REND = 1;//設(shè)置接收完成標(biāo)志
          }
          else
          {
          RDAT >>= 1;
          if(RXB) RDAT |= 0x80; //RX數(shù)據(jù)轉(zhuǎn)移到RX緩沖區(qū)
          }
          }
          }
          else if(!RXB)//是否檢測(cè)到低電平
          {
          RING = 1;//設(shè)置開(kāi)始接收標(biāo)志
          RCNT = 4;//初始接收波特率計(jì)數(shù)器
          RBIT = 9;//初化始接收比特?cái)?shù)(8個(gè)數(shù)據(jù)位+1個(gè)停止位)
          }

          if(--TCNT == 0)
          {
          TCNT = 3;//復(fù)位發(fā)送波特率計(jì)數(shù)器
          if(TING)//判斷是否發(fā)送
          {
          if(TBIT == 0)
          {
          TXB = 0;//發(fā)送起始位
          TDAT = TBUF;//加載數(shù)據(jù)從TBUF至TDAT
          TBIT = 9;//初化始發(fā)送比特?cái)?shù)(8位數(shù)據(jù)位+1個(gè)停止位)
          }
          else
          {
          TDAT >>= 1;//位移數(shù)據(jù)至CY
          if(--TBIT == 0)
          {
          TXB = 1;
          TING = 0;//停止發(fā)送
          TEND = 1;//設(shè)置發(fā)送完成標(biāo)志
          }
          else
          {
          TXB = CY;//寫(xiě)CY至TX端口
          }
          }
          }
          }

          if((Mode==0) && REND)
          {
          REND = 0;
          if(RBUF == 0x7F)
          {
          if(++Correct_nums > 10)
          {
          START=1;
          Correct_nums=0;
          Error_nums=0;
          }
          }
          else
          {
          Correct_nums=0;
          if(++Error_nums > 6)
          {
          TR0 = 0;
          Error_nums=0;
          Correct_nums=0;
          UART_Change();
          RING = 0;
          REND = 0;
          RCNT = 0;
          TR0 = 1;
          }
          }
          }
          }

          void tm1() interrupt 3
          {
          if(IO_in)Dat |= 0x01;
          if(++BIT8 == 8) //每采集8次發(fā)送一次
          {
          if(P_N)TBUF =Dat;//正向輸出
          elseTBUF = ~Dat;//反向輸出
          TING = 1;
          BIT8 = 0;
          }
          Dat <<= 1;
          if(++cnt == 0)Over=1;//約5ms置1一次
          }【主位的電路,11.0592M】
          那個(gè)是舊版本,電路圖也有些不妥(應(yīng)該把10Ω電阻去掉),下載“最低波特率”固定,而且沒(méi)有邏輯分析儀功能

          【32樓的電路,11.0592M】
          在舊版上改進(jìn):自動(dòng)適應(yīng)STC-ISP軟件中的“最低波特率” 3種波特率,可選“1200bps/2400bps/4800bps”
          但也沒(méi)有邏輯分析儀功能

          【49樓的電路,45M】
          程序全新修改;
          自動(dòng)適應(yīng)STC-ISP軟件中的“最低波特率” 3種波特率,可選“1200bps/2400bps/4800bps”;
          增加簡(jiǎn)易單路邏輯分析儀。

          PS:
          STC-ISP軟件中選用不同型號(hào)的STC時(shí),默認(rèn)的下載“最低波特率”不同,比如:
          STC89系列:默認(rèn) 最低波特率 1200bps
          STC12系列:默認(rèn) 最低波特率 2400bps
          STC15系列:默認(rèn) 最低波特率 4800bps
          懶得每次選擇,所以增加自適應(yīng)3種最低波特率“1200bps/2400bps/4800bps”功能




          另:
          在STC單片機(jī)中有兩個(gè)程序區(qū),用戶程序區(qū)與ISP程序區(qū)。單片機(jī)上電后(冷啟動(dòng),并非外部手動(dòng)復(fù)位或看門(mén)狗復(fù)位),先會(huì)運(yùn)行ISP程序,檢測(cè)是否有合法的下載命令流,占時(shí)幾十毫秒到幾百毫秒,如果沒(méi)有合法的下載命令流,則立即運(yùn)行用戶程序。
          如果有合法的下載命令流,則ISP監(jiān)控程序開(kāi)始與ISP下載軟件通信,軟件也會(huì)進(jìn)入編程模式,向監(jiān)控程序發(fā)送程序碼,監(jiān)控程序接收程序碼,并將其寫(xiě)入用戶程序區(qū)中。在編程完畢,對(duì)程序校驗(yàn)成功后,用戶程序立即生效,開(kāi)始運(yùn)行用戶程序。
          STC-ISP嘗試與MCU握手連接的時(shí)候,是以“最低波特率”設(shè)置項(xiàng)中的波特率不斷的從串口發(fā)送“0x7F”信號(hào),直到MCU上電冷啟(或者軟復(fù)位至ISP)經(jīng)幾十毫秒到幾百毫秒檢測(cè)下載命令流后,MCU做出響應(yīng),STC-ISP才停止發(fā)送“0x7F”信號(hào)開(kāi)始燒寫(xiě)。

          用簡(jiǎn)易單路邏輯分析儀捕捉,STC-ISP下載程序前的串口命令流
          這個(gè)程序構(gòu)思不完善,主要是自動(dòng)適應(yīng)波特率部分有些BUG,
          如果是固定程序中的最低波特率(對(duì)應(yīng)STC-ISP的最低波特率選項(xiàng),最高波特率選項(xiàng)任意),這個(gè)程序就運(yùn)行很好,
          但這樣就不方便了,因?yàn)镾TC-ISP不同版本及不同型號(hào)默認(rèn)最低波特率選項(xiàng)不同,懶得每次更換都改下STC-ISP的最低波特率選項(xiàng)。

          所以使用新方案解決:
          不再用硬件串口/模擬串口捕捉數(shù)據(jù),先直接用計(jì)時(shí)器捕捉TXD上一定數(shù)量的連續(xù)電平數(shù)據(jù),然后分析電平數(shù)據(jù)(比如:低電平時(shí)間相等,0x7F次數(shù),……等等多重驗(yàn)證),
          如果符合條件就重啟(斷電幾百ms后上電,隔>1.5S恢復(fù)監(jiān)測(cè));
          如果不符合條件則重新監(jiān)測(cè)。

          上面這個(gè)方案幾近完美,負(fù)責(zé)監(jiān)控的STC15F104E也不需要超頻到45M了,22.1184M就可以,
          同時(shí)自動(dòng)適STC-ISP的最低波特率選項(xiàng)范圍更寬1200bps/2400bps/4800bps/9600bps,
          完美版的方案就是這樣,挺簡(jiǎn)單的,程序就不傳了















          上一頁(yè) 1 2 3 下一頁(yè)

          關(guān)鍵詞: 51單片機(jī)一鍵下

          評(píng)論


          相關(guān)推薦

          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();