板子呢,只是烧坏了单片机,程序呢,就是根据板子来写的,首先就是用AD走下板子的走线和原理图走线(在压缩文件里有),还搜查了相关芯片的资料(压缩文件也有)。感兴趣的伙伴,可以看看吧。压缩包太大了,整个程序工程文件是放不上了,
单片机源程序如下:
- /*********************************************************************************************************************
- 打印机的单片机(GD32)烧坏了,更换为(stm32f103c8t6)实现基本的打印功能
- 程序总体说明:打印机头控制(步进电机+热头加热+SPI通信+温度检测)+stm32f103c8t6(串口+ADC)
- 就一个烧坏单片机的热敏打印机,搜查相关资料,实现打印基本功能
- 打包资料有写程序过程中用到的资料
- *********************************************************************************************************************/
- #include "motor.h" //步进电机的控制
- #include "Systick.h" //延时
- #include "myrmspi.h" //热头加热
- #include "powerled.h" //指示灯
- #include "myspii.h" //SPI通信(stm32与打印机头)
- #include "yjspi.h" //SPI通信(stm32与字库)
- #include "myadc.h" //电源电压检测,打印机温度检测
- #include "usart.h" //串口通信
- /************************************************************************************************************************
- 变量定义
- ************************************************************************************************************************/
- u8 yyy=0; //初始化TIM4一次用
- u16 huancun[128]={0}; //存储接收数据
- extern u16 ADC_ConvertedValue[2]; //存储AD采集电压
- extern u8 dayinbiaoz;
- /************************************************************************************************************************
- 函数声明
- ************************************************************************************************************************/
- void Key_Zou(void);
- void SPI_Writerm(void);
- u16 ISN_Conversion(u16 isn);
- /************************************************************************************************************************
- 主函数
- ************************************************************************************************************************/
- int main(void)
- {
- Myrmspi_Init();
- Hotlead_Init();
- Powerled_Init();
- PBtim4_init();
- SPI_Configuration();
- SPI2_Configuration();
- ADC_Configuration();
- USART_Configuration();
- while(1)
- {
- if(dayinbiaoz==2){ //开始打印
- if(yyy==0){
- TIM4_PWM_Init4();
- yyy=1;
- }
- SPI_Writerm();
- dayinbiaoz=0; //准备接收判断起始数据1
- USART_Cmd(USART3, ENABLE); //使能串口中断
- }
- Key_Zou();
- }
- }
- /************************************************************************************************************************
- 说明:就是找对应关系
- 已知:一组数据0,1,2,3.......。另一组数据GB18030里的字对应的编码从8140开始(具体看GB18030_54936.html文件,不是以1递增的)。
- 0对应8140开始,后面数据都是对应关系。
- 求:一个对应函数能满足以上关系。
- 很明显初中的知识
- ************************************************************************************************************************/
- u16 ISN_Conversion(u16 isn) //GB18030,字编码转换为SPI存储地址
- {
- u16 conn=0;
- conn=((isn-0x8140)-66*(((isn-0x8140)-((isn-0x8140)%256))/256));
- if(((((isn-0x8140)%256)+1)>0)&&(((isn-0x8140)%256)<63)){
- return conn;
- }else{
- if((((isn-0x8140)%256)>63)&&(((isn-0x8140)%256)<191)){
- return (conn-1);
- }else{
- return 0;
- }
- }
- }
- /************************************************************************************************************************
- 说明:下面程序关键在“字库中存储的数据”和“发送给打印机头的数据”要实现数据的重组。目的是为了让字体打印出的效果符合预期
- 看打包的资料吧。“字库中存储的数据”参考相关图片文件
- “发送给打印机头的数据”参考热敏打印机头说明书.txt
- 先有个概念,再找对应关系,和上面的初中题差不多,就是比较繁琐
- ************************************************************************************************************************/
- void SPI_Writerm(void)
- {
- u8 bian=0,y,fanhui=0,cached; //bian存储重新组合的8位数据,y保存下一行开头数据在缓存中的位置,fanhui结束符变量,cached存储字库中读取的数据
- u8 i,j,k,l,p; //用于for循环体的变量
- u8 m=1,d=0; //m用于一字行(分成3段,以一点行为单位),d用于字行(单位为字行)
- u32 iscn; //存储SPI字库的起始地址
- do
- {
- //-------------------------------------------------------------------------------------
- //先判断特殊情况
- //以huancun[p]为起始共16个数据为一组,判断有没有换行符或者结束符
- for(p=d;p<(16+d);p++){ //搜寻换行符(0x0D0A)位置
- if((huancun[p]==0x0D0A)||(huancun[p]==0x0002)){
- if(huancun[p]==0x0002){ //碰到结束符
- fanhui=127; //fanhui=127:跳出while的条件
- }
- // p++;
- break; //得到变量P,跳出
- }
- }
- //--------------------------------------------------------------------------------------
- //“字库里读取出的数据”和“发送给打印机的数据要转换”,最终得到正确的字体打印效果
- //字库存储数据和发送给打印机的数据参考打包的资料
- // y=p-1-d;
- y=p-d;
- for(j=0;j<3;j++){ //3层循环
- for(k=0;k<8;k++){ //8层循环
- Power_Pulse(); //电源脉冲(HOTLEAD引脚,高低电平在for循环里变化实现脉冲)
- for(p=16;p>y;p--){ //不用打字的部分,(16-y)个字填空
- for(l=0;l<3;l++){ //一个字宽24位,所以给3层循环
- SPI_WriteByte(0x00); //直接发送给打印机头数据0x00
- }
- }
- for(;p>0;p--){
- iscn=(ISN_Conversion(huancun[p-1+d])*72); //从尾部数据开始重组发送打印机头数据
- for(l=m;l<(m+3);l++){
- GPIO_ResetBits(PORT_SPI_CS, PIN_SPI_CS); //通信时序必要,可参考打包资料W25Q16
- SPI2_WriteByte(0x03); //读指令
- SPI2_WriteByte((u8)((72-(8*l)+iscn)>>16)); //24位地址(以下3行)
- SPI2_WriteByte((u8)((72-(8*l)+iscn)>>8));
- SPI2_WriteByte((u8)(72-(8*l)+iscn));
- for(i=0;i<8;i++){
- cached=SPI2_WriteByte(0x00); //读数据
- bian|=(((cached&(0x01<<k))>>k)<<i); //重新组合的8位数据
- }
- SPI_WriteByte(bian); //发送给打印机头
- bian=0; //存储数据变量清零
- GPIO_SetBits(PORT_SPI_CS, PIN_SPI_CS); //通信时序必要,可参考打包资料W25Q16
- }
- } //上面j的3层、k的8层、p的16层,是一点行384个点,细分p层,l是3层、i是8层,是24位一个字宽
- //--------------------------------------------------------------------------------------------------------------------------------------------------------------
- //打印部分程序
- //打印一点行为一个单位
- Tim4_Pwm(); //设置PWM输出引脚为复用功能输出(这是输出PWM的条件,让步进电机转)
- delayms(10); //电机转一点行需要4ms,这里延迟10ms,让转一点行这一过程完成,再执行下面的程序
- Scintillation(); //打印纸检测
- Hold_Enable(); //热头分组加热
- while(ADC_ConvertedValue[0]<1750) //判断采集的热敏处电压是否过低,即打印机温度是否过大,当温度过高时,程序停在此while里,直到温度上升到一定程度跳出
- {
- GPIO_SetBits(PORT_POWERLED, POWERLED);//指示灯灭
- }
- //--------------------------------------------------------------------------------------------------------------------------------------------------------------
- }
- m+=3; //m对应点行,m=1时,是字的三分之一段8行。m+3后,是字的三分之一中间段8行。再+3后,是剩下的8行。
- }
- m=1; //准备下一行字打印(一行字等于24行点行)
- d+=y+1;
- // d+=(y+1);
- //------------------------------------
- //一行字与一行字之间的间隔(空白)
- //不打印,只走纸
- for(i=0;i<24;i++){
- Tim4_Pwm();
- delayms(8);
- }
- //------------------------------------
- }while(((fanhui!=127)&&(d!=128)));
- //清空缓存
- for(i=0;i<128;i++){
- huancun[i]=0;
- }
- //----------------------------------------------------------------------------------------
- GPIO_ResetBits(PORT_HOTLEAD, HOTLEAD); //关闭5V电源
- }
- /************************************************************************************************************************/
- /*************************************************************************
- 说明:短按按键走一点行,按住按键1.5秒以上持续走纸
- *************************************************************************/
- void Key_Zou(void)
- {
- u8 i,t=0; //计时变量t=0,循环变量i
- if(dayinbiaoz==0){ //打印不走纸
- if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_3)==RESET){ //判断引脚
- USART_Cmd(USART3, DISABLE); //关串口,走纸不打印
- delayms(20); //去抖
- while(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_3)==RESET){ //再次判断,按键松开跳出循环
- if((t==0)||(t>100)){ //短按按键走一点行,按住按键1.5秒以上持续走纸
- if(yyy==0){
- TIM4_PWM_Init4();
- yyy=1;
- }
- for(i=0;i<4;i++){ //电源脉冲
- Power_Pulse();
- delayms(2);
- }
- Tim4_Pwm(); //PWM输出
- delayms(8);
- }
- if(t<101){ //计时变量t累加
- t++;
- delayms(15);
- }
- }
- USART_Cmd(USART3, ENABLE); //开串口
- }
- }
- }
复制代码
所有资料51hei提供下载:
热敏打印机.rar
(18.83 MB, 下载次数: 193)
|