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