前几日,女朋友生日,问她想要啥礼物时,她提到说想要那种辉光管的自制时钟,然后上网一查,发现辉光管驱动电压挺高,而且管子还贵,于是折合了一下,用YS13-3荧光管代替辉光管来做时钟。废话不多说,下面介绍一下我的设计流程。
YS13-3
- 设计思路与元器件选择
- 原理图设计
- 程序设计
-
- 74HC595发送函数
- YS13-3显示函数
- 效果展示
设计思路与元器件选择
这里我采用的主控芯片是stm32f103C8T6。原因有几个,首先开发较快,用过stm32cubemx的都知道,开发效率上比传统标准库要快。其次便宜,而且好焊接。再然后是如何点亮荧光管的问题了。当初查找资料可是费了不少功夫。最后简单总接一下。YS13-3需要三个不同电压,1.2V,24V与GND.总的来说,就是引脚1接地,引脚9接1.2V,引脚6接24V,这三个是不变的。剩下的引脚,那个接24V,其对应的管就会亮。那如何找到引脚1呢?方法就是正视管子,内部左下角连接出去的就是引脚1,然后从底部看,1引脚顺时针寻下去就是2,3,4…等等。
然后就是驱动的芯片,这里我选择了74HC595和ULN2003来驱动数码管,此外为了有合适的电压,采用了AMS1117降压至3.3V与1.2V,然后用集成的XL6009升压模块升压至24V,然后还外接了一个无线串口通讯模块与PC机通讯。
原理图设计
YS-13驱动电路
主控电路
升降压电路
其他电路
程序设计
74HC595发送函数
void HC595_sendsata(uint8_t data) // (8bit)
{
uint8_t i;
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_15, GPIO_PIN_RESET); // SHCP=0
for(i=0;i<=7;i++)
{
if(data&0x01)
{
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, GPIO_PIN_SET);//DS=1
}
else
{
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, GPIO_PIN_RESET); // DS=0
}
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_15,GPIO_PIN_SET);//SHCP=1
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_15,GPIO_PIN_RESET);//SHCP=0
data=data>>1;
}
}
YS13-3显示函数
uint8_t time[4]={ 0,5,2,0};//存放每个辉光管要显示的数字
uint8_t mabiao[10]={ 0xa0,0xbe,0x44,0x0c,0x1a,0x09,0x01,0x3c,0x00,0x08}; //码表
void YS13_display() // YS13显示4个数字
{
uint8_t i;
for(i=0;i<4;i++)
{
HC595_sendsata(mabiao[time[3-i]]);
}
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_14, GPIO_PIN_SET); // STCP=1
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_14, GPIO_PIN_RESET); // STCP=0
}
}
74HC595主要通讯方式为当SHCP上升沿时,读取DS口的数据,且移位锁存,,但是此时Q0–Q7对外电平其实仍然是不变的,只有在STCP高电平时候,才会将内部移位寄存器的值一次性对外输出。例如,连续8次SHCP上升沿时,DS都是1,但是你此时Q0–Q7输出仍然是原来状态,只有将STCP置1,Q0–Q7才会输出1。
效果展示
最后附录上程序和PCB文件,希望对有些小伙伴有所帮助
链接:https://pan.baidu.com/s/1YUuVa5GkLel64a2aL8fPOw
提取码:wczd