板子呢,只是燒壞了單片機,程序呢,就是根據板子來寫的,首先就是用AD走下板子的走線和原理圖走線(在壓縮文件里有),還搜查了相關芯片的資料(壓縮文件也有)。感興趣的伙伴,可以看看吧。壓縮包太大了,整個程序工程文件是放不上了,
51hei.png (15.43 KB, 下載次數: 85)
下載附件
2020-2-27 22:21 上傳
熱敏打印機程序.png (255.04 KB, 下載次數: 85)
下載附件
2020-2-27 21:25 上傳
單片機源程序如下:
- /*********************************************************************************************************************
- 打印機的單片機(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, 下載次數: 225)
2020-2-27 21:40 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|