STM8S003F3P6采用內(nèi)部16M晶振。我看市場上面有使用這個單片機采用內(nèi)部晶振進行控制的。不知道為什么我總是控制不到。
QQ圖片20171104153205.png (138.87 KB, 下載次數(shù): 90)
下載附件
2017-11-4 15:32 上傳
2.png (56.92 KB, 下載次數(shù): 94)
下載附件
2017-11-4 15:33 上傳
一個NOP是68NS 左右 空指令符合規(guī)格書要求Send_Dat = 1; 但是空指令后Send_Dat = 0;時間就變?yōu)?.2US了
同樣的單片機 我不知道別人怎么做到Send_Dat = 1的時候850NS的。有沒有高手指導(dǎo)指導(dǎo)一下。(我i采集過市場上面的他可以做到850NS)
3.png (17.25 KB, 下載次數(shù): 98)
下載附件
2017-11-4 15:34 上傳
- /* 添加包含芯片的頭文件 */
- #include<iostm8s103f3.h>
- #define nop() asm("nop");
- #define LED PB_ODR_ODR5
- #define Send_Dat PC_ODR_ODR7 //數(shù)據(jù)輸出,接pb5腳
- #define Number 100
- typedef unsigned char uint8;
- typedef unsigned int uint16;
- //定義全局變量
- /*******************************************************************************
- **函數(shù)名稱:void Send_8bit(uchar dat)
- **功能描述:發(fā)送24個字節(jié)
- **入口參數(shù):無
- **輸出:無
- *******************************************************************************/
- void send_24bits(uint8 dat1,uint8 dat2,uint8 dat3) //WS2811B
- {
- uint8 a;
- for(a=0;a<8;a++)
- {
- if(dat1&0x80) //code"1"
- {
- Send_Dat = 1;
- nop();
- nop();
- nop();
- nop();
- nop();
- Send_Dat = 0;
- }
- else
- {
- Send_Dat = 1; //code"0"
- nop();
- nop();
- nop();
- nop();
- nop();
- nop();
- nop();
- nop();
- nop();
- nop();
- nop();
- nop();
- nop();
- nop();
- Send_Dat = 0;
- }
- dat1 = dat1<<1;
- }
- for(a=0;a<8;a++)
- {
- if(dat2&0x80) //code"1"
- {
- Send_Dat = 0;
- nop();
- nop();
- nop();
- nop();
- nop();
- Send_Dat = 1;
- }
- else
- {
- Send_Dat = 1; //code"0"
- nop();
- nop();
- nop();
- nop();
- nop();
- nop();
- nop();
- nop();
- nop();
- nop();
- nop();
- nop();
- nop();
- nop();
- Send_Dat = 0;
- }
- dat1 = dat2<<1;
- }
- for(a=0;a<8;a++)
- {
- if(dat3&0x80) //code"1"
- {
- Send_Dat = 0;
- nop();
- nop();
- nop();
- nop();
- nop();
- Send_Dat = 1;
- }
- else
- {
- Send_Dat = 1; //code"0"
- nop();
- nop();
- nop();
- nop();
- nop();
- nop();
- nop();
- nop();
- nop();
- nop();
- nop();
- nop();
- nop();
- nop();
- Send_Dat = 0;
- }
- dat1 = dat3<<1;
- }
- }
- /*******************************************************************************
- **函數(shù)名稱:void Delay_us(uint16 x)
- **功能描述:延時函數(shù)
- **入口參數(shù):無
- **輸出:無
- *******************************************************************************/
- void Delay_us(uint16 x)
- {
- uint8 j,k;
- for(j=x;j>0;j--)
- for(k=120;k>0;k--);
- }
- /*******************************************************************************
- **函數(shù)名稱:rest()
- **功能描述:復(fù)位函數(shù)
- **入口參數(shù):無
- **輸出:無
- *******************************************************************************/
- void rest() //復(fù)位
- {
- Send_Dat = 0;
- Delay_us(1);
- }
- /*******************************************************************************
- **函數(shù)名稱:void Timer2Init()
- **功能描述:定時器2參數(shù)初始化
- **入口參數(shù):無
- **輸出:無
- *******************************************************************************/
- void Timer2Init()
- {
- TIM2_PSCR = 0x00; //定時器2預(yù)分頻數(shù)為 1 分頻,即定時器時鐘 = 系統(tǒng)時鐘 = 16MHz
- TIM2_ARRH = 0x3e; //設(shè)置1毫秒時間自動重載 16000 = 0x3e80
- TIM2_ARRL = 0x80; //
- TIM2_CNTRH = 0; //清除計數(shù)寄存器
- TIM2_CNTRL = 0; //
- TIM2_IER = 0x01; //使能定時器2允許更新中斷
- TIM2_SR1 = 0x00; //清除所有的中斷標示
- TIM2_CR1 = 0x81; //使能計數(shù)器,并允許自動預(yù)裝
- }
- /*******************************************************************************
- **函數(shù)名稱:void LED2Init()
- **功能描述:LED2->功能引腳初始化
- **入口參數(shù):無
- **輸出:無
- *******************************************************************************/
- void Init_GPIO()
- {
- PB_DDR_DDR5 = 1;
- PB_CR1 = 0xff;
- PB_CR2 = 0x00;
- PC_DDR_DDR7 = 1;
- PC_CR1 = 0xff;
- PC_CR2 = 0x00;
- }
- void rest_all()
- {
- uint16 i;
- for(i=0;i<Number;i++)
- {
- send_24bits(0,0,0);
- }
- rest();
- }
- void Five_Color_Flow() //5個同色燈珠流水
- {
- uint8 i=0,mode_flag=0;
- char a,b=0;
- rest_all();
- while(1)
- {
- for(i=0;i<Number;i++)
- {
- if(a<5) send_24bits(255,0,0);
- else if(a<10) send_24bits(0,255,0);
- else if(a<15) send_24bits(0,0,255);
- else if(a<20) send_24bits(255,255,0);
- else if(a<25) send_24bits(0,255,255);
- else if(a<30) send_24bits(255,255,0);
- else send_24bits(255,255,255);
- a++;
- if(a>34) a=0;
- }
- rest();
- Delay_us(150);
- b--;
- if(b<0) b=34;
- }
- }
- /*******************************************************************************
- **函數(shù)名稱:主函數(shù)
- **功能描述:1=55US
- **入口參數(shù):無
- **輸出:無
- *******************************************************************************/
- int main(void)
- {
- asm("sim"); //先關(guān)閉總中斷
- CLK_CKDIVR = 0x00; //CPUDIV = 1 HSIDIV = 1 內(nèi)部時鐘 = 16Mhz
- Init_GPIO(); //初始化IO口
- Timer2Init(); //調(diào)用定時器2初始化函數(shù)
- asm("rim"); //打開總中斷
- while(1) //進入死循環(huán),等待定時器2周期中斷
- {
- send_24bits(255,0,0) ;
- }
- }
- /*******************************************************************************
- **函數(shù)名稱:__interrupt void TIM2_UPDATE_IRQHandler(void)
- **功能描述:定時器2重載更新中斷服務(wù)函數(shù)
- **入口參數(shù):無
- **輸出:無
- *******************************************************************************/
- #pragma vector = 15 //設(shè)置定時器2重載的中斷向量號 = 15
- __interrupt void TIM2_UPDATE_IRQHandler(void)
- {
- TIM2_SR1 = 0x00; //清除中斷標志
- /* ms_count++; //中斷使 ms_count++ 做加法,記錄1毫秒產(chǎn)生的中斷次數(shù)
- if(ms_count >= 1000) //記錄達到1000毫秒,即1秒
- {
- ms_count = 0; //復(fù)位記錄中斷次數(shù)
- // PC_ODR ^= 0x80; //對LED2進行異或取反,使LED2以1秒的周期亮滅
- }
- */
- }
復(fù)制代碼 |