STC 最新研发的单片机型号STC8H2K32UT
一线制,单总线接口,【STC8H2K32UT】首次配置,
【一线制,单总线】,直接驱动 WS2812 !!!
新型号 STC8H2K32UT 内部增加了4组硬件单总线接口
单总线目前可支持的工作模式:
WS2812模式、
DS18B20 模式、DHT11 模式、
红外模式、
UARTX模式和UART模式。
STC 最新推出一个新的单片机型号STC8H2K32UT
一线制,单总线接口,【STC8H2K32UT】首次配置,
【一线制,单总线】,直接驱动 WS2812 !!!
这个新型号的STC单片机内部增加了4组硬件单总线接口
初步测试用单总线接口驱动WS2812灯带,功能正常
驱动核心代码如下:
- #include <stdio.h>
- #include <intrins.h>
-
- #include "def.h"
- #include "stc8h.h"
- #include "ow.h"
-
- #define FOSC 24000000UL
- #define BAUD (65536 - FOSC/4/115200)
- #define T1MS (65536 - FOSC / 1000)
- #define LED_NUM 12
- #define BUF_SIZE (LED_NUM * 3)
-
- #define PSCR 0
- #define tRES (60 * FOSC / 1000000 - 1)
- #define t0H (0.35 * FOSC / 1000000 - 1)
- #define t0L (0.70 * FOSC / 1000000 - 1)
- #define t1H (0.70 * FOSC / 1000000 - 1)
- #define t1L (0.35 * FOSC / 1000000 - 1)
-
- #define TEST_OW 1
-
-
- BYTE code COD[] =
- {
- // G R B
- 0x00, 0xff, 0xff, //紫
- 0xff, 0x00, 0xff, //靛
- 0x00, 0x00, 0xff, //蓝
- 0xff, 0x00, 0x00, //绿
- 0xff, 0xff, 0x00, //黄
- 0x80, 0xff, 0x00, //橙
- 0x00, 0xff, 0x00, //红
- };
-
- BOOL f1ms;
- BOOL trig;
-
- int count;
- int index;
- int offset;
- BYTE xdata BUF[BUF_SIZE];
-
- void main()
- {
- int i;
-
- P_SW2 = 0x80;
-
- P0M0 = 0xff; P0M1 = 0x00;
- P1M0 = 0x00; P1M1 = 0x00;
- P2M0 = 0x00; P2M1 = 0x00;
- P3M0 = 0x40; P3M1 = 0x00;
- P4M0 = 0x00; P4M1 = 0x00;
- P5M0 = 0x00; P5M1 = 0x00;
-
- SCON = 0x52;
- AUXR = 0x40;
- TMOD = 0x00;
- TL1 = BAUD;
- TH1 = BAUD >> 8;
- TR1 = 1;
-
- AUXR |= 0x80;
- TL0 = T1MS;
- TH0 = T1MS >> 8;
- TR0 = 1;
- ET0 = 1;
-
- printf("STC8H2K32UT Test (OneWire WS2812 REG) !\n");
-
- OW1_SetWS2812Mode(); //设置OW模式为WS2812模式
- OW1_SetWS2812_RST(tRES); //设置复位信号的低电平维持时间:(N+1)个OW时钟
- OW1_SetWS2812_D0H(t0H); //设置数据0的高电平维持时间:(N+1)个OW时钟
- OW1_SetWS2812_D0L(t0L); //设置数据0的低电平维持时间:(N+1)个OW时钟
- OW1_SetWS2812_D1H(t1H); //设置数据1的高电平维持时间:(N+1)个OW时钟
- OW1_SetWS2812_D1L(t1L); //设置数据1的低电平维持时间:(N+1)个OW时钟
- OW1_SetClockDivider(PSCR); //设置OW总线时钟分频(SYSclk/(PSCR+1))
- OW1_SwitchP36(); //选择P36口为单总线数据口
- OW1_ClearAllIntFlag(); //清除OW状态
- OW1_EnableResetInt(); //使能OW复位中断
- OW1_EnableTxInt(); //使能OW发送中断
- OW1_Enable(); //使能OW功能
-
- EA = 1;
-
- trig = 0;
- count = 0;
- index = 0;
- offset = 0;
-
- while (1)
- {
- if (f1ms)
- {
- f1ms = 0;
- if (count++ >= 100)
- {
- count = 0;
-
- for (i = 0; i < BUF_SIZE; i++)
- BUF[i] = 0;
- for (i = 0; i < sizeof(COD); i++)
- BUF[(i + offset * 3) % BUF_SIZE] = COD[i] / 16;
-
- if (++offset >= LED_NUM)
- offset = 0;
-
- OW1_ResetBus(); //触发总线复位
- }
- }
-
- if (trig)
- {
- trig = 0;
-
- if (index < BUF_SIZE)
- {
- OW1_WriteData(BUF[index++]);
- }
- }
- }
- }
-
- void ow1_isr() interrupt OW1_VECTOR
- {
- BYTE sr;
-
- sr = OW1_ReadIntStatus(); //读取中断标志
- OW1_ClearAllIntFlag(); //清除OW状态
-
- if (OWn_CheckResetFlag(sr))
- {
- index = 0;
- trig = 1;
- }
-
- if (OWn_CheckTxFlag(sr))
- {
- trig = 1;
- }
- }
-
- void tm0_isr() interrupt 1
- {
- f1ms = 1;
- }
复制代码
|