找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4522|回复: 3
收起左侧

stm32103c8t6单片机热敏打印机驱动程序与资料下载

  [复制链接]
ID:633559 发表于 2020-2-27 21:40 | 显示全部楼层 |阅读模式
板子呢,只是烧坏了单片机,程序呢,就是根据板子来写的,首先就是用AD走下板子的走线和原理图走线(在压缩文件里有),还搜查了相关芯片的资料(压缩文件也有)。感兴趣的伙伴,可以看看吧。压缩包太大了,整个程序工程文件是放不上了,
51hei.png
热敏打印机程序.png

单片机源程序如下:
  1. /*********************************************************************************************************************
  2. 打印机的单片机(GD32)烧坏了,更换为(stm32f103c8t6)实现基本的打印功能
  3. 程序总体说明:打印机头控制(步进电机+热头加热+SPI通信+温度检测)+stm32f103c8t6(串口+ADC)
  4. 就一个烧坏单片机的热敏打印机,搜查相关资料,实现打印基本功能
  5. 打包资料有写程序过程中用到的资料
  6. *********************************************************************************************************************/
  7. #include "motor.h"               //步进电机的控制
  8. #include "Systick.h"             //延时
  9. #include "myrmspi.h"             //热头加热
  10. #include "powerled.h"            //指示灯
  11. #include "myspii.h"              //SPI通信(stm32与打印机头)
  12. #include "yjspi.h"               //SPI通信(stm32与字库)
  13. #include "myadc.h"               //电源电压检测,打印机温度检测
  14. #include "usart.h"               //串口通信

  15. /************************************************************************************************************************
  16. 变量定义
  17. ************************************************************************************************************************/
  18. u8 yyy=0;                             //初始化TIM4一次用
  19. u16 huancun[128]={0};                 //存储接收数据
  20. extern u16 ADC_ConvertedValue[2];     //存储AD采集电压
  21. extern u8 dayinbiaoz;                 

  22. /************************************************************************************************************************
  23. 函数声明
  24. ************************************************************************************************************************/
  25. void Key_Zou(void);
  26. void SPI_Writerm(void);
  27. u16 ISN_Conversion(u16 isn);

  28. /************************************************************************************************************************
  29. 主函数
  30. ************************************************************************************************************************/
  31. int main(void)
  32. {
  33.         Myrmspi_Init();                     
  34.         Hotlead_Init();
  35.         Powerled_Init();
  36.         PBtim4_init();
  37.         SPI_Configuration();
  38.         SPI2_Configuration();
  39.         ADC_Configuration();
  40.         USART_Configuration();
  41.         while(1)
  42.   {
  43.                 if(dayinbiaoz==2){            //开始打印
  44.                         if(yyy==0){
  45.                           TIM4_PWM_Init4();
  46.                                 yyy=1;
  47.                         }
  48.       SPI_Writerm();              
  49.                   dayinbiaoz=0;               //准备接收判断起始数据1
  50.                         USART_Cmd(USART3, ENABLE);  //使能串口中断
  51.                 }
  52.                 Key_Zou();
  53.         }
  54. }

  55. /************************************************************************************************************************
  56. 说明:就是找对应关系
  57.       已知:一组数据0,1,2,3.......。另一组数据GB18030里的字对应的编码从8140开始(具体看GB18030_54936.html文件,不是以1递增的)。
  58.             0对应8140开始,后面数据都是对应关系。
  59.       求:一个对应函数能满足以上关系。
  60.       很明显初中的知识        
  61. ************************************************************************************************************************/
  62. u16 ISN_Conversion(u16 isn)     //GB18030,字编码转换为SPI存储地址
  63. {
  64.     u16 conn=0;
  65.     conn=((isn-0x8140)-66*(((isn-0x8140)-((isn-0x8140)%256))/256));       
  66.           if(((((isn-0x8140)%256)+1)>0)&&(((isn-0x8140)%256)<63)){
  67.        return conn;
  68.                 }else{
  69.                    if((((isn-0x8140)%256)>63)&&(((isn-0x8140)%256)<191)){
  70.                            return (conn-1);
  71.                          }else{
  72.                             return 0;
  73.                           }
  74.                  }
  75. }

  76. /************************************************************************************************************************
  77. 说明:下面程序关键在“字库中存储的数据”和“发送给打印机头的数据”要实现数据的重组。目的是为了让字体打印出的效果符合预期
  78.       看打包的资料吧。“字库中存储的数据”参考相关图片文件
  79.                       “发送给打印机头的数据”参考热敏打印机头说明书.txt
  80.       先有个概念,再找对应关系,和上面的初中题差不多,就是比较繁琐
  81. ************************************************************************************************************************/
  82. void SPI_Writerm(void)
  83. {
  84.         u8 bian=0,y,fanhui=0,cached;                  //bian存储重新组合的8位数据,y保存下一行开头数据在缓存中的位置,fanhui结束符变量,cached存储字库中读取的数据
  85.         u8 i,j,k,l,p;                                 //用于for循环体的变量
  86.         u8 m=1,d=0;                                   //m用于一字行(分成3段,以一点行为单位),d用于字行(单位为字行)
  87.         u32 iscn;                                     //存储SPI字库的起始地址
  88.         do
  89.         {
  90. //-------------------------------------------------------------------------------------
  91.     //先判断特殊情况       
  92.     //以huancun[p]为起始共16个数据为一组,判断有没有换行符或者结束符       
  93.           for(p=d;p<(16+d);p++){                                 //搜寻换行符(0x0D0A)位置
  94.                         if((huancun[p]==0x0D0A)||(huancun[p]==0x0002)){
  95.                                 if(huancun[p]==0x0002){                            //碰到结束符
  96.                                         fanhui=127;                                                   //fanhui=127:跳出while的条件
  97.                                 }
  98. //                                p++;                                                            
  99.                                 break;                                             //得到变量P,跳出
  100.                   }
  101.                 }
  102. //--------------------------------------------------------------------------------------
  103.                 //“字库里读取出的数据”和“发送给打印机的数据要转换”,最终得到正确的字体打印效果
  104.                 //字库存储数据和发送给打印机的数据参考打包的资料
  105. //                y=p-1-d;
  106.                 y=p-d;
  107.                 for(j=0;j<3;j++){                                   //3层循环
  108.                         for(k=0;k<8;k++){                                                    //8层循环
  109.                                 Power_Pulse();                                  //电源脉冲(HOTLEAD引脚,高低电平在for循环里变化实现脉冲)
  110.                                 for(p=16;p>y;p--){                              //不用打字的部分,(16-y)个字填空
  111.                                         for(l=0;l<3;l++){                             //一个字宽24位,所以给3层循环
  112.                                           SPI_WriteByte(0x00);                        //直接发送给打印机头数据0x00
  113.                                         }
  114.                                 }
  115.                                 for(;p>0;p--){
  116.                                         iscn=(ISN_Conversion(huancun[p-1+d])*72);     //从尾部数据开始重组发送打印机头数据
  117.                                   for(l=m;l<(m+3);l++){
  118.                                     GPIO_ResetBits(PORT_SPI_CS, PIN_SPI_CS);    //通信时序必要,可参考打包资料W25Q16
  119.                   SPI2_WriteByte(0x03);                       //读指令
  120.                               SPI2_WriteByte((u8)((72-(8*l)+iscn)>>16));  //24位地址(以下3行)
  121.                                     SPI2_WriteByte((u8)((72-(8*l)+iscn)>>8));
  122.                                     SPI2_WriteByte((u8)(72-(8*l)+iscn));
  123.             for(i=0;i<8;i++){
  124.                                       cached=SPI2_WriteByte(0x00);                    //读数据
  125.                                             bian|=(((cached&(0x01<<k))>>k)<<i);       //重新组合的8位数据
  126.                                     }
  127.                                     SPI_WriteByte(bian);                        //发送给打印机头
  128.                                     bian=0;                                     //存储数据变量清零
  129.                                     GPIO_SetBits(PORT_SPI_CS, PIN_SPI_CS);      //通信时序必要,可参考打包资料W25Q16
  130.                             }
  131.                           }                                               //上面j的3层、k的8层、p的16层,是一点行384个点,细分p层,l是3层、i是8层,是24位一个字宽
  132. //--------------------------------------------------------------------------------------------------------------------------------------------------------------                               
  133.         //打印部分程序
  134.                                 //打印一点行为一个单位
  135.                                 Tim4_Pwm();                             //设置PWM输出引脚为复用功能输出(这是输出PWM的条件,让步进电机转)
  136.                                 delayms(10);                                                    //电机转一点行需要4ms,这里延迟10ms,让转一点行这一过程完成,再执行下面的程序
  137.                                 Scintillation();                        //打印纸检测                                 
  138.                           Hold_Enable();                          //热头分组加热
  139.                                 while(ADC_ConvertedValue[0]<1750)       //判断采集的热敏处电压是否过低,即打印机温度是否过大,当温度过高时,程序停在此while里,直到温度上升到一定程度跳出
  140.                                 {
  141.                                   GPIO_SetBits(PORT_POWERLED, POWERLED);//指示灯灭
  142.                                 }
  143. //--------------------------------------------------------------------------------------------------------------------------------------------------------------                               
  144.                         }
  145.                    m+=3;                                                   //m对应点行,m=1时,是字的三分之一段8行。m+3后,是字的三分之一中间段8行。再+3后,是剩下的8行。
  146.           }       
  147.     m=1;                                                                 //准备下一行字打印(一行字等于24行点行)
  148.                 d+=y+1;
  149. //                d+=(y+1);                                          
  150. //------------------------------------
  151.                 //一行字与一行字之间的间隔(空白)
  152.                 //不打印,只走纸
  153.                 for(i=0;i<24;i++){
  154.              Tim4_Pwm();
  155.                         delayms(8);
  156.           }
  157. //------------------------------------
  158.         }while(((fanhui!=127)&&(d!=128)));
  159.         //清空缓存
  160.   for(i=0;i<128;i++){
  161.            huancun[i]=0;
  162.         }
  163. //----------------------------------------------------------------------------------------       
  164.   GPIO_ResetBits(PORT_HOTLEAD, HOTLEAD);                         //关闭5V电源
  165. }

  166. /************************************************************************************************************************/

  167. /*************************************************************************
  168. 说明:短按按键走一点行,按住按键1.5秒以上持续走纸
  169. *************************************************************************/
  170. void Key_Zou(void)
  171. {
  172.   u8 i,t=0;                                                    //计时变量t=0,循环变量i
  173.         if(dayinbiaoz==0){                                           //打印不走纸
  174.           if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_3)==RESET){        //判断引脚
  175.                         USART_Cmd(USART3, DISABLE);                              //关串口,走纸不打印
  176.             delayms(20);                                             //去抖
  177.                   while(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_3)==RESET){   //再次判断,按键松开跳出循环
  178.                                 if((t==0)||(t>100)){                                   //短按按键走一点行,按住按键1.5秒以上持续走纸
  179.                       if(yyy==0){
  180.                               TIM4_PWM_Init4();
  181.                                     yyy=1;
  182.                             }
  183.                       for(i=0;i<4;i++){                                    //电源脉冲
  184.                               Power_Pulse();
  185.                         delayms(2);
  186.                             }                  
  187.                       Tim4_Pwm();                                          //PWM输出
  188.                       delayms(8);
  189.                                 }
  190.                                 if(t<101){                                             //计时变量t累加
  191.                                         t++;
  192.                                         delayms(15);
  193.                                 }
  194.                   }
  195.                         USART_Cmd(USART3, ENABLE);                               //开串口
  196.     }
  197.   }
  198. }
复制代码

所有资料51hei提供下载:
热敏打印机.rar (18.83 MB, 下载次数: 193)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:690045 发表于 2020-2-28 13:38 | 显示全部楼层
谢谢分享
回复

使用道具 举报

ID:82944 发表于 2022-9-17 14:02 | 显示全部楼层
没接触过打印机,但也要学习,感觉热心人士
回复

使用道具 举报

ID:812749 发表于 2022-10-11 20:29 | 显示全部楼层
谢谢分享,手头有二手的热敏打印机,可以试验一下
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表