Ⅰ 如何將程序代碼燒錄進STC單片機 詳細�0�3
STC 先安裝<STC 單片機編程工具>軟體到計算機中, 然後進行下面的操作。 以下是燒錄程序的主要界面。 燒錄過程非常簡單, 操作也非常簡單。 圖中紅色的五個大數字就 表示了整個過程。簡簡單單的五步就可以了(實際上只需 4 步)。 啟動本燒錄程序後, 第一步就是選擇燒錄器件。 本燒錄軟體支持STC 全系列的 51 單片機晶元, 因此, 第一步必須選擇相對應的型號。 由於本實驗板選用的單片機晶元就是本燒錄軟 件首次啟動默認的型號,所以,本項一般都不需要選擇。另外,「 AP Memory」是指該晶元的內存大小和起止地址, 根據器件型號自動更改, 不必 理會。 選擇了器件型號, 第二步就應該選擇將要被燒錄的 HEX 機器碼文件。 HEX 文件由單片機開發環境輸入、 編輯代碼, 最後編繹產生。至於如何產生 HEX 文件, 很多資料也都有介紹, 本板光碟中有詳細的說明, 並且提供了多套開發軟體(每套都能用) 。 通過對照自學完全可以很快掌握操作。 並且,本實驗板光碟也提供了多 種單片機開發環境供大家學習研究。 本光碟中提供了一些例子程序, 大家可以點「open file」按鈕, 彈出以下窗口(源程序也 有,但這里不顯示),先選擇一些例子程序燒錄實驗。 選好了文件後, 大家可以發現「文件校驗和」 中的數據發生了變化, 大家可以通過留意這個數據是否 變化來確 定打開文件是否成功, 或者文件刷 新是否 有更改。 當然, 文件打開後, 會顯示在右邊的數據區, 大家也可以觀查右邊數據區是否有更改。不過, 當數據太多時, 更改的地方又很少時, 觀查「文件校驗和」 會更快更准確。 選好了器件, 選好了文件, 第三步就可以設置串口和串口通信速度了。 串口是一個九針的插座, 老式的滑鼠口就是串口。 為了讓通信可靠, 我們可以適當的選低一些的速度, 這個串 口線較長時非常重要。 燒錄過程中, 如果出現失敗, 可以考慮將串口通信速度降低再試, 這是由於機器配置以及當地環境因素決定的, 當環境干擾過大時, 必需選低一點的波特率(即通信速率) 。燒錄成功與失敗,可以從信息區的提示看出。 選擇並設置好串口後(一般不需更改) , 進入第四步, 而這一步基本上不用更改。 設置時鍾倍頻主要是為了提高工作速度, 設置時鍾增益是為了降低電磁幅射。 這些, 對於高級工程人員和最終產品會很有用, 對於初學者來說, 只當沒有看見就行了。第五步是最後一步, 點擊「Download/下載」 , 就可以進入燒錄狀態。特別 說明 :點擊「 Download/ 下載」之前實驗板的電源開關必須關閉,使單片 機徹底斷電, 點擊「Download/下載」 之後才可以使單片機上電,完成 程序的燒錄。 注意: 點擊「Re-Download/重復下載」 也可以, 這常用於大批量的編程, 不必每次都去點「Download/下載」 。 出現以下圖狀態時, 給實驗板通電就可以完成編程過程(如果實驗 板已經通電,則必須關掉電源 1 秒鍾再次通電)。 重點注意事項: 注意: 整個燒錄過程中(任何過程中) , 不要用手或者導體接觸單片機集成電路的引腳或者電路! 這樣很可能會永久性的損壞單片機實驗板或者集成電路或者電腦主機。 原因: 絕對大多數的電腦沒有採取良好的接地措施! 而電腦主機、 顯示器的電源電路中,又有電容直接連接到市電, 這個電壓和電流經常會達到很高, 當我們觸摸電腦機箱後, 有時會感受到明顯的電擊, 就是這個原因! 另外盡量消除人體的高壓靜電, 高壓靜電也可能對 集成電路或者電路已經造成永久性的損壞。 解決方法: 當實驗板與電腦連接時, 盡量不要用手接觸單片機引腳; 盡量消除人體的高 壓靜電(實驗時保持手有一定的潮濕度,可有效抑制靜電產生) 現在就過過癮吧! 在本光碟中提供了一些例子程序, 並且提供了已經編譯好的HEX文件, 立即打開,試著分別燒錄試試吧! 同一塊集成電路(MCU), 通過不同的源程序代碼, 傾刻間表現出不同的功能, 並且可以長期穩定工作, 這就是單片機的魅力所在! 只有懂了單片機, 才能設計開發出更復雜 、更可靠、更穩定的產品! 所以說, 不論學習電子技術多少年, 不論有了多少年電子工作經驗, 不論是否會修理電 子產品,如果不懂單片機,就始終低人一等!!! 單片機不難, 採用本站最新S TC 編程、 實驗、 開發一體化功能單片機板, 先實踐, 後理 論,在書和光碟的幫助下,讓你最快速度學會單片機! 仕別三日, 當令人刮目相看! 要實現理想, 從現在做起!
Ⅱ 如下程序:這幾句單片機的C語言程序是什麼意思
這是stc單片機的IO埠設置方式
1, P0M1 = 0;
P1M1 = 0;
是p1口的P1^0這個口為普通雙向輸入輸出方式,
2, P2M0 = 0XFF;
P2M1 = 0;
設置整個p2口為高阻輸入狀態
3,
P0M0 = 0XFF;因為P0M1沒給出是什麼,不好確定P1口為什麼狀態
看下stc單片機手冊就很清楚了
Ⅲ sTc8 pwm調光程序怎麼寫
下面這個程序是應用在stc上的pwm程序,測試成功
#includesfr CCON =0xD8; //PCA control register
sfr CMOD =0xD9;
sfr CL =0xe9;
sfr CH =0xF9;
sfr CCAP0L=0xea;
sfr CCAP1L=0xeb;
sfr CCAP0H=0xfa;
sfr CCAP1H=0xfb;
sfr CCAPM0=0xda;
sfr CCAPM1=0xdb;
sbit CR=0xde; //位定址
void main(void)
{
CMOD=0x02; //使用系統時鍾,時鍾輸入源頻率fosc/2。PWM頻率=fosc/2/256
/************************************
7 6 5 4 3 2 1 0
CIDL - - - cps2 CPS1 CPS0 ECF
CIDL: =0時,空閑模式下PCA計數器繼續工作;=1時,空閑模式下PCA計數器停止工作。
CPS2,CPS1,CPS0:PCA計數脈沖選擇。010,定時器0的溢出,可以實現可調頻率的PWM輸出。
ECF: =1時,使能寄存器CCON CF位的中斷;=0時,禁止該功能。
***************************************/
CL=0x00;
CH=0x00;
CCAP0L=0xc0; //當CL小於CCAP0L時,輸出為低;大於時,輸出為高。
CCAP0H=0x7f; //當CL由ff變為00溢出時,CCAP0H裝載到CCAP0L中,實現無干擾的更新PWM。
CCAP1L=0xc0; //當CL小於CCAP1L時,輸出為低;大於時,輸出為高。
CCAP1H=0xc0; //當CL由ff變為00溢出時,CCAP1H裝載到CCAP1L中,實現無干擾的更新PWM。
CCAPM0=0X42; //使能PWM模式,PWM0=1,ECOM0=1
CCAPM1=0X42; //使能PWM模式,PWM1=1,ECOM1=1
CR=1; //啟動PCA計數器
while(1)
{
CCAP0H=RF4432_TxRxBuf[4]; //此處改變占空比
CCAP1H=RF4432_TxRxBuf[5];
CCAP2H=RF4432_TxRxBuf[6]/2.5;
};
}
Ⅳ STC 89c52rc單片機代碼
/**********************為網友解答常式************************
波特率設置為9600,無奇偶校驗,晶振11.0592MHz,STC89C52.
單片機通過串口接收到 字元「a",單片機反饋」a"並打開p1.0 =1 。
如果單片機持續30S 沒收到「a" P1.0= 0 。
存在問題:1.延時、埠 要根據你的實際情況改一下參數。
2.上電or復位後,第一次P1.0=0的轉換時間要比以後動作轉換時間長,不一致。之後正常。
******************************************************************/
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
uchar buf;
sbit out = P1^0;
void delay(unsigned char s) //11.0592MHz下,帶參數延時
{
unsigned char i, j,k;
for(k=s;k>0;k--)
{
i = 180;
j = 73;
do
{
while (--j);
} while (--i);
}
}
void main(void)
{
SCON=0x50; //設定串口工作方式
PCON=0x00; //波特率不倍增
TMOD=0x20; //定時器1工作於8位自動重載模式, 用於產生波特率
EA=1;
ES = 1; //允許串口中斷
TL1=0xfd;
TH1=0xfd; //波特率9600
TR1=1;
while(1)
{
delay(100); //延時,此處要根據實際修改成你需要的數值
out = 0; //正常上電,延時後,會使P1.0等於0
//從串口收到a後, 會使P1.0馬上等於1,
//然後如果在延時時間內沒有再次接收到a ,那程序將再次使P1.0等於0,循環。。。
}
}
/*********************************************************
串列中斷服務函數
*********************************************************/
void serial() interrupt 4
{
ES = 0; //關閉串列中斷
RI = 0; //清除串列接受標志位
buf = SBUF; //從串口緩沖區取得數據
switch(buf)
{
case 0x61: out = 1;break; //接受到字元a,使P2.0為高(0x61為"a"的ASCII碼十六進制形式)
// case 0x32: out = 0;break; //接受到字元2,使P2.0為低(測試使用)
default: break; //接受到其它數據,無動作
}
ES = 1; //允許串口中斷
}
Ⅳ STC單片機串口程序
//注意,如您使用的MCU沒有那個功能,就不要操作相應的寄存器
//注意,如您使用的MCU沒有那那麼大的擴展SRAM,就不要操作超過范圍的SRAM
#include<reg51.h>
#include<intrins.h>
sfr S2CON = 0x9A;
//S2SM0,S2SM1,S2SM2,S2REN,S2TB8,SRB8,S2TI,S2RI
sfr IE2 = 0xAF;
//X,X,X,X,X,X,ESPI,ES2
sfr S2BUF = 0x9B;
sfr AUXR = 0x8e;
sfr BRT = 0x9c;
sfr IAP_CONTR = 0xC7;
sfr CCON = 0xD8;
sfr CMOD = 0xD9;
sfr CL = 0xE9;
sfr CH = 0xF9;
sfr CCAP0L = 0xEA;
sfr CCAP0H = 0xFA;
sfr CCAPM0 = 0xDA;
sfr CCAPM1 = 0xDB;
sbit CR = 0xDE;
sbit MCU_Start_Led = P1^7;
sbit S2_Interrupt_Receive_Led = P1^4;
//unsigned char self_command_array[4] = {0x22,0x33,0x44,0x55};
#define Self_Define_ISP_Download_Command 0x22
#define RELOAD_COUNT 0xfb //18.432MHz,12T,SMOD=0,9600bps
void serial_port_one_initial();
void send_UART_one(unsigned char);
void UART_one_Interrupt_Receive(void);
void serial_port_two_initial();
void send_UART_two(unsigned char);
void UART_two_Interrupt_Receive(void);
void soft_reset_to_ISP_Monitor(void);
void delay(void);
void display_MCU_Start_Led(void);
void send_PWM(void);
void main(void)
{
unsigned int array_point = 0;
unsigned char xdata Test_array_one[512] =
{
0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f,
0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27,
0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f,
0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37,
0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f,
0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47,
0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f,
0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57,
0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f,
0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67,
0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f,
0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77,
0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f,
0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,
0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f,
0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97,
0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f,
0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7,
0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf,
0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7,
0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf,
0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7,
0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf,
0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7,
0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf,
0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7,
0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef,
0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7,
0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff,
0xff, 0xfe, 0xfd, 0xfc, 0xfb, 0xfa, 0xf9, 0xf8,
0xf7, 0xf6, 0xf5, 0xf4, 0xf3, 0xf2, 0xf1, 0xf0,
0xef, 0xee, 0xed, 0xec, 0xeb, 0xea, 0xe9, 0xe8,
0xe7, 0xe6, 0xe5, 0xe4, 0xe3, 0xe2, 0xe1, 0xe0,
0xdf, 0xde, 0xdd, 0xdc, 0xdb, 0xda, 0xd9, 0xd8,
0xd7, 0xd6, 0xd5, 0xd4, 0xd3, 0xd2, 0xd1, 0xd0,
0xcf, 0xce, 0xcd, 0xcc, 0xcb, 0xca, 0xc9, 0xc8,
0xc7, 0xc6, 0xc5, 0xc4, 0xc3, 0xc2, 0xc1, 0xc0,
0xbf, 0xbe, 0xbd, 0xbc, 0xbb, 0xba, 0xb9, 0xb8,
0xb7, 0xb6, 0xb5, 0xb4, 0xb3, 0xb2, 0xb1, 0xb0,
0xaf, 0xae, 0xad, 0xac, 0xab, 0xaa, 0xa9, 0xa8,
0xa7, 0xa6, 0xa5, 0xa4, 0xa3, 0xa2, 0xa1, 0xa0,
0x9f, 0x9e, 0x9d, 0x9c, 0x9b, 0x9a, 0x99, 0x98,
0x97, 0x96, 0x95, 0x94, 0x93, 0x92, 0x91, 0x90,
0x8f, 0x8e, 0x8d, 0x8c, 0x8b, 0x8a, 0x89, 0x88,
0x87, 0x86, 0x85, 0x84, 0x83, 0x82, 0x81, 0x80,
0x7f, 0x7e, 0x7d, 0x7c, 0x7b, 0x7a, 0x79, 0x78,
0x77, 0x76, 0x75, 0x74, 0x73, 0x72, 0x71, 0x70,
0x6f, 0x6e, 0x6d, 0x6c, 0x6b, 0x6a, 0x69, 0x68,
0x67, 0x66, 0x65, 0x64, 0x63, 0x62, 0x61, 0x60,
0x5f, 0x5e, 0x5d, 0x5c, 0x5b, 0x5a, 0x59, 0x58,
0x57, 0x56, 0x55, 0x54, 0x53, 0x52, 0x51, 0x50,
0x4f, 0x4e, 0x4d, 0x4c, 0x4b, 0x4a, 0x49, 0x48,
0x47, 0x46, 0x45, 0x44, 0x43, 0x42, 0x41, 0x40,
0x3f, 0x3e, 0x3d, 0x3c, 0x3b, 0x3a, 0x39, 0x38,
0x37, 0x36, 0x35, 0x34, 0x33, 0x32, 0x31, 0x30,
0x2f, 0x2e, 0x2d, 0x2c, 0x2b, 0x2a, 0x29, 0x28,
0x27, 0x26, 0x25, 0x24, 0x23, 0x22, 0x21, 0x20,
0x1f, 0x1e, 0x1d, 0x1c, 0x1b, 0x1a, 0x19, 0x18,
0x17, 0x16, 0x15, 0x14, 0x13, 0x12, 0x11, 0x10,
0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x08,
0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00
};
unsigned char i = 0;
serial_port_one_initial(); //串口1初始化
// serial_port_two_initial(); //串口2初始化
display_MCU_Start_Led(); //點亮發光二極體表示單片機開始工作
// send_UART_two(0x55); //串口2發送數據表示單片機串口正常工作
// send_UART_two(0xaa); //串口2發送數據表示單片機串口正常工作
/*
for(array_point=0; array_point<512; array_point++)
{
send_UART_two(Test_array_one[array_point]);
}
*/
send_UART_one(0x34); //串口1發送數據表示單片機串口正常工作
send_UART_one(0xa7); //串口1發送數據表示單片機串口正常工作
for(array_point=0; array_point<512; array_point++)
{
send_UART_one(Test_array_one[array_point]);
}
// send_PWM(); //6kHz PWM, 50% ty
while(1);
}
void serial_port_one_initial()
{
SCON = 0x50; //0101,0000 8位可變波特率,無奇偶校驗位
// TMOD = 0x21; //0011,0001 設置頂時器1為8位自動重裝計數器
// TH1 = RELOAD_COUNT; //設置定時器1自動重裝數
// TL1 = RELOAD_COUNT;
// TR1 = 1; //開定時器1
BRT = RELOAD_COUNT;
// BRTR = 1, S1BRS = 1, EXTRAM = 1 ENABLE EXTRAM
AUXR = 0x11; // T0x12,T1x12,UART_M0x6,BRTR,S2SMOD,BRTx12,EXTRAM,S1BRS
ES = 1; //允許串口中斷
EA = 1; //開總中斷
}
void serial_port_two_initial()
{
//sfr SCON = 0x98;
//SM0,SM1,SM2,REN,TB8,RB8,TI,RI
//sfr S2CON = 0x9A;
//S2SM0,S2SM1,S2SM2,S2REN,S2TB8,S2RB8,S2TI,S2RI
//sfr S2BUF = 0x9B;
//sfr IE2 = 0xAF;
//X,X,X,X,X,X,ESPI,ES2
S2CON = 0x50; //0101,0000 8位可變波特率,無奇偶校驗位,允許接收
BRT = RELOAD_COUNT;
// BRTR = 1, S1BRS = 1, EXTRAM = 0 ENABLE EXTRAM
AUXR = 0x11; // T0x12,T1x12,UART_M0x6,BRTR,S2SMOD,BRTx12,EXTRAM,S1BRS
// ES = 1; //允許串口1中斷
// ES2 = 1
IE2 = 0x01; //允許串口2中斷,ES2=1
EA = 1; //開總中斷
}
void send_UART_one(unsigned char i)
{
ES = 0; //關串口中斷
TI = 0; //清零串口發送完成中斷請求標志
SBUF = i;
while(TI ==0); //等待發送完成
TI = 0; //清零串口發送完成中斷請求標志
ES = 1; //允許串口中斷
}
void send_UART_two(unsigned char i)
{
//sfr SCON = 0x98;
//SM0,SM1,SM2,REN,TB8,RB8,TI,RI
//sfr S2CON = 0x9A;
//S2SM0,S2SM1,S2SM2,S2REN,S2TB8,S2RB8,S2TI,S2RI
//sfr S2BUF = 0x9B;
//sfr IE2 = 0xAF;
//X,X,X,X,X,X,ESPI,ES2
unsigned char temp = 0;
// ES = 0; //關串口1中斷
IE2 = 0x00; //關串口2中斷,es2=0
// TI = 0; //清零串口1發送完成中斷請求標志
S2CON = S2CON & 0xFD; //B'11111101,清零串口2發送完成中斷請求標志
// SBUF = i;
S2BUF = i;
// while(TI ==0); //等待發送完成
do
{
temp = S2CON;
temp = temp & 0x02;
}while(temp==0);
// TI = 0; //清零串口發送完成中斷請求標志
S2CON = S2CON & 0xFD; //B'11111101,清零串口2發送完成中斷請求標志
// ES = 1; //允許串口1中斷
// ES2 = 1
IE2 = 0x01; //允許串口2中斷,ES2=1
}
void UART_one_Interrupt_Receive(void) interrupt 4
{
unsigned char k = 0;
if(RI==1)
{
RI = 0;
k = SBUF;
if(k==Self_Define_ISP_Download_Command) //是自定義下載命令
{
delay(); //延時1秒就足夠了
delay(); //延時1秒就足夠了
soft_reset_to_ISP_Monitor(); //軟復位到系統ISP監控區
}
send_UART_one(k+1);
}
else
{
TI = 0;
}
}
void UART_two_Interrupt_Receive(void) interrupt 8
{
//sfr SCON = 0x98;
//SM0,SM1,SM2,REN,TB8,RB8,TI,RI
//sfr S2CON = 0x9A;
//S2SM0,S2SM1,S2SM2,S2REN,S2TB8,S2RB8,S2TI,S2RI
//sfr S2BUF = 0x9B;
//sfr IE2 = 0xAF;
//X,X,X,X,X,X,ESPI,ES2
unsigned char k = 0;
k = S2CON ;
k = k & 0x01;
//if(S2RI==1)
if(k==1)
{
//RI = 0;
S2CON = S2CON & 0xFE; //1111,1110
S2_Interrupt_Receive_Led = 0;
k = S2BUF;
if(k==Self_Define_ISP_Download_Command) //是自定義下載命令
{
delay(); //延時1秒就足夠了
delay(); //延時1秒就足夠了
soft_reset_to_ISP_Monitor(); //軟復位到系統ISP監控區
}
send_UART_two(k+1);
}
else
{
//TI = 0;
S2CON = S2CON & 0xFD; //1111,1101
}
}
void soft_reset_to_ISP_Monitor(void)
{
IAP_CONTR = 0x60; //0110,0000 軟復位到系統ISP監控區
}
void delay(void)
{
unsigned int j = 0;
unsigned int g = 0;
for(j=0;j<5;j++)
{
for(g=0;g<60000;g++)
{
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
}
}
}
void display_MCU_Start_Led(void)
{
//sbit MCU_Start_Led = P1^7;
unsigned char i = 0;
for(i=0;i<1;i++)
{
MCU_Start_Led = 0; //頂亮MCU開始工作指示燈
delay();
MCU_Start_Led = 1; //熄滅MCU開始工作指示燈
delay();
MCU_Start_Led = 0; //頂亮MCU開始工作指示燈
}
}
void send_PWM(void)
{
CMOD = 0x00; // CIDL - - - - CPS1 CPS0 ECF Setup PCA Timer
// CPS1 CPS0 = 00, Fosc/12 is PCA/PWM clock
// 18432000/12/256 = 6000
CL = 0x00;
CH = 0x00;
CCAP0L = 0x80; //Set the initial value same as CCAP0H
CCAP0H = 0x80; //50% Duty Cycle
CCAPM0 = 0x42; //0100,0010 Setup PCA mole 0 in 8BIT PWM, P3.7
CR = 1; //啟動 PCA/PWM 定時器
}
Ⅵ 求stc系列單片機,要求:8個引腳,定時准,
STC15F10X系列
STC的8腳單片機有直插和SOP兩種形式的封裝,其中有6個IO口,剩下2個是VCC和GND ,不需要帶晶振內部自帶有時鍾發生電路,在此要說明這種型號的單片機有專用的燒錄軟體,在宏晶官網都有下載。這6個IO口實際上是我們普通單片機上的P3口,實際編程時也是使用P3.X來實現IO口操作。唯一的不同就是沒有硬體的串口,需要用到定時器來模擬(這點不好),但是下載電路和STC的串口下載電路時一樣的。不做修改。這個有點費解?下載時用到的是串口形式的下載電路,硬體上使用時卻沒有串口。杯具啊!
關於IO口的復用功能,除P3.1沒有復用功能外,其他引腳均有復用功能。分別是5個外部中斷,3個時鍾輸出,一個復位輸入 。晶元默認是不需要復位電路的,上電自復位的。可以通過軟體來選擇引腳作為復位腳。同時在燒錄軟體上可以選擇低壓復位。手冊上說的是8種。軟體上只顯示了6種-不解???讓人驚喜的是燒錄軟體上提供硬體開啟看門狗功能。還可以選擇看門狗分頻級數。還是蠻方便的嘛。。。程序又少了幾句話 。最後要說一點的是該種單片機以E結尾的都有EEPROM喔。例如我買的STC15F104E。
Ⅶ 如何把STC單片機里的代碼讀出來
這個需要單片機解密
單片機解密
單片機解密又叫單片機破解,晶元解密,IC解密,但是這嚴格說來這幾種稱呼都不科學,但已經成了習慣叫法,我們把CPLD解密,DSP解密都習慣稱為單片機解密。單片機只是能裝載程序晶元的其中一個類。能燒錄程序並能加密的晶元還有DSP,CPLD,PLD,AVR,ARM等。當然具存儲功能的存儲器晶元也能加密,比如DS2401 DS2501 AT88S0104 DM2602 AT88SC0104D等,當中也有專門設計有加密演算法用於專業加密的晶元或設計驗證廠家代碼工作等功能晶元,該類晶元業能實現防止電子產品復制的目的。
單片機攻擊者藉助專用設備或者自製設備,利用單片機晶元設計上的漏洞或軟體缺陷,通過多種技術手段,就可以從晶元中提取關鍵信息,獲取單片機內程序這就叫單片機解密。
解密過程
揭去晶元封裝
侵入型攻擊的第一步是揭去晶元封裝(簡稱「開蓋」有時候稱「開封」,英文為「DECAP」,decapsulation)。
有兩種方法可以達到這一目的:
第一種是完全溶解掉晶元封裝,暴露金屬連線。
第二種是只移掉硅核上面的塑料封裝。
第一種方法需要將晶元綁定到測試夾具上,藉助綁定台來操作;第二種方法除了需要具備攻擊者一定的知識和必要的技能外,還需要個人的智慧和耐心,但操作起來相對比較方便,完全家庭中操作。
晶元上面的塑料可以用小刀揭開,晶元周圍的環氧樹脂可以用濃硝酸腐蝕掉。熱的濃硝酸會溶解掉晶元封裝而不會影響晶元及連線。該過程一般在非常乾燥的條件下進行,因為水的存在可能會侵蝕已暴露的鋁線連接 (這就可能造成解密失敗)。
清洗晶元
接著在超聲池裡先用丙酮清洗該晶元以除去殘余硝酸,並浸泡。
尋找保護熔絲的位置並破壞
最後一步是尋找保護熔絲的位置並將保護熔絲暴露在紫外光下。一般用一台放大倍數至少100倍的顯微鏡,從編程電壓輸入腳的連線跟蹤進去,來尋找保護熔絲。若沒有顯微鏡,則採用將晶元的不同部分暴露到紫外光下並觀察結果的方式進行簡單的搜索。操作時應用不透明的紙片覆蓋晶元以保護程序存儲器不被紫外光擦除。將保護熔絲暴露在紫外光下5~10分鍾就能破壞掉保護位的保護作用,之後,使用簡單的編程器就可直接讀出程序存儲器的內容。
對於使用了防護層來保護EEPROM單元的單片機來說,使用紫外光復位保護電路是不可行的。對於這種類型的單片機,一般使用微探針技術來讀取存儲器內容。在晶元封裝打開後,將晶元置於顯微鏡下就能夠很容易的找到從存儲器連到電路其它部分的數據匯流排。由於某種原因,晶元鎖定位在編程模式下並不鎖定對存儲器的訪問。利用這一缺陷將探針放在數據線的上面就能讀到所有想要的數據。在編程模式下,重啟讀過程並連接探針到另外的數據線上就可以讀出程序和數據存儲器中的所有信息。
藉助顯微鏡和激光切割機破壞保護熔絲
還有一種可能的攻擊手段是藉助顯微鏡和激光切割機等設備來尋找保護熔絲,從而尋查和這部分電路相聯系的所有信號線。由於設計有缺陷,因此,只要切斷從保護熔絲到其它電路的某一根信號線(或切割掉整個加密電路)或連接1~3根金線(通常稱FIB:focused ion beam),就能禁止整個保護功能,這樣,使用簡單的編程器就能直接讀出程序存儲器的內容。
雖然大多數普通單片機都具有熔絲燒斷保護單片機內代碼的功能,但由於通用低檔的單片機並非定位於製作安全類產品,因此,它們往往沒有提供有針對性的防範措施且安全級別較低。加上單片機應用場合廣泛,銷售量大,廠商間委託加工與技術轉讓頻繁,大量技術資料外瀉,使得利用該類晶元的設計漏洞和廠商的測試介面,並通過修改熔絲保護位等侵入型攻擊或非侵入型攻擊手段來讀取單片機的內部程序變得比較容易。
Ⅷ stc8g1k17a,如何燒錄程序
方法如下:
單片機板和轉換板連線對應連接好,如發現無法通訊,可調整2、3的連線。
1、地線----地線。
2、TXD-----RXD。
3、RXD-----TXD轉換板由於PC供電,指對外提供很小的供電能力,建議單片機板用單獨的電源供電,切記不能外接電源和轉換板同時對單片機板供電,否則會燒設備或計算機的危險。
硬體連接正常後就是通過STC專門的燒錄軟體進行燒錄了。
Ⅸ 單片機RGB調色程序 要求基於PWM(STC系列單片機c語言)可以實現至少60種顏色調節,有多種模
選用STC12C56XX的單片機,利用三路PWM來調色就簡單了,再多的顏色無非是把表格做的大點,利用查表法,來獲取顏色的PWM寄存器的初裝值就可以了。
Ⅹ STC8A8K64S4A12單片機程序
這個可以有,是51的,用到STC8A8K64S4A12上應該不成問題。
#include <STC89.H>
unsigned char tmp;
sbit shebei1=P1^0;//定義控制設備的IO口
sbit shebei2=P1^1;
sbit shebei3=P1^2;
sbit shebei4=P1^3;
sbit shebei5=P1^4;
sbit shebei6=P1^5;
void main()
{
TMOD = 0x20; // 定時器1工作於8位自動重載模式, 用於產生波特率
TH1 = 0xFD; // 波特率9600
TL1 = 0xFD;
SCON = 0x50; // 設定串列口工作方式
PCON &= 0xef; // 波特率不倍增
TR1 = 1; // 啟動定時器1
IE = 0x0; // 禁止任何中斷
while(1)
{
if(RI) // 是否有數據到來
{
RI = 0;// 清接收標志
tmp = SBUF; // 暫存接收到的數據
switch(tmp )
{
case 0x22:shebei1=0;break;//關設備1
case 0x33:shebei1=1;break;//開設備1
case 0x44:shebei2=0;break;
case 0x55:shebei2=1;break;
case 0x66:shebei3=0;break;
case 0x77:shebei3=1;break;
case 0x88:shebei4=0;break;
case 0x99:shebei4=1;break;
// case 0xaa:shebei5=0;break;
// case 0xbb:shebei5=1;break;
// case 0xcc:shebei6=0;break;
// case 0xdd:shebei6=1;break;
case 0x17:shebei5=0;break;
case 0x18:shebei5=1;break;
case 0x19:shebei6=0;break;
case 0x20:shebei6=1;break;
}
}
}
}
void delayms(unsigned char ms)
// 延時子程序
{
unsigned char i;
while(ms--)
{
for(i = 0; i < 120; i++);
}
}