久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 6474|回復: 5
打印 上一主題 下一主題
收起左側

stm32103c8t6單片機熱敏打印機驅動程序與資料下載

  [復制鏈接]
跳轉到指定樓層
樓主
板子呢,只是燒壞了單片機,程序呢,就是根據板子來寫的,首先就是用AD走下板子的走線和原理圖走線(在壓縮文件里有),還搜查了相關芯片的資料(壓縮文件也有)。感興趣的伙伴,可以看看吧。壓縮包太大了,整個程序工程文件是放不上了,



單片機源程序如下:
  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, 下載次數: 225)



評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏5 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:690045 發表于 2020-2-28 13:38 | 只看該作者
謝謝分享
回復

使用道具 舉報

板凳
ID:82944 發表于 2022-9-17 14:02 | 只看該作者
沒接觸過打印機,但也要學習,感覺熱心人士
回復

使用道具 舉報

地板
ID:812749 發表于 2022-10-11 20:29 | 只看該作者
謝謝分享,手頭有二手的熱敏打印機,可以試驗一下
回復

使用道具 舉報

5#
ID:65369 發表于 2024-9-28 00:44 | 只看該作者

謝謝分享,手頭正需要者寶貴的資料的
回復

使用道具 舉報

6#
ID:277290 發表于 2024-9-28 08:01 | 只看該作者
謝謝分享,手頭有熱敏打印機,試驗一下
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 毛片网络| 国产免费黄网 | 成人在线精品 | 中文字幕精品视频 | 久久精品亚洲精品 | 成人一区二区三区 | 综合另类 | 欧美一级在线免费观看 | 国产精品夜色一区二区三区 | 成人自拍视频网站 | 日韩中文字幕一区二区三区 | 91精品国产综合久久久久久漫画 | 狠狠操在线| 久久久久久久国产精品 | 亚洲综合色丁香婷婷六月图片 | 国产精品一区二区三区免费观看 | 久久久精彩视频 | 特级毛片爽www免费版 | 国产精品激情小视频 | 久久精品一区二区三区四区 | 国产激情第一页 | 99精品免费视频 | 无毛av | 欧美精品欧美精品系列 | 91久久精品国产免费一区 | 欧美日韩亚洲一区二区 | 手机av免费在线 | 国产1区2区3区 | 欧美日韩亚洲视频 | 一区二区三区av | 粉嫩粉嫩芽的虎白女18在线视频 | 91精品国产综合久久婷婷香蕉 | 亚洲成人久久久 | 不卡的av在线 | 国内精品一区二区 | 国产成人精品区一区二区不卡 | 中国黄色在线视频 | 在线播放精品视频 | 国产激情在线观看 | 视频一区 国产精品 | 中文字幕男人的天堂 |