|
板子呢,只是燒壞了單片機(jī),程序呢,就是根據(jù)板子來寫的,首先就是用AD走下板子的走線和原理圖走線(在壓縮文件里有),還搜查了相關(guān)芯片的資料(壓縮文件也有)。感興趣的伙伴,可以看看吧。壓縮包太大了,整個(gè)程序工程文件是放不上了,
51hei.png (15.43 KB, 下載次數(shù): 85)
下載附件
2020-2-27 22:21 上傳
熱敏打印機(jī)程序.png (255.04 KB, 下載次數(shù): 85)
下載附件
2020-2-27 21:25 上傳
單片機(jī)源程序如下:
- /*********************************************************************************************************************
- 打印機(jī)的單片機(jī)(GD32)燒壞了,更換為(stm32f103c8t6)實(shí)現(xiàn)基本的打印功能
- 程序總體說明:打印機(jī)頭控制(步進(jìn)電機(jī)+熱頭加熱+SPI通信+溫度檢測(cè))+stm32f103c8t6(串口+ADC)
- 就一個(gè)燒壞單片機(jī)的熱敏打印機(jī),搜查相關(guān)資料,實(shí)現(xiàn)打印基本功能
- 打包資料有寫程序過程中用到的資料
- *********************************************************************************************************************/
- #include "motor.h" //步進(jìn)電機(jī)的控制
- #include "Systick.h" //延時(shí)
- #include "myrmspi.h" //熱頭加熱
- #include "powerled.h" //指示燈
- #include "myspii.h" //SPI通信(stm32與打印機(jī)頭)
- #include "yjspi.h" //SPI通信(stm32與字庫)
- #include "myadc.h" //電源電壓檢測(cè),打印機(jī)溫度檢測(cè)
- #include "usart.h" //串口通信
- /************************************************************************************************************************
- 變量定義
- ************************************************************************************************************************/
- u8 yyy=0; //初始化TIM4一次用
- u16 huancun[128]={0}; //存儲(chǔ)接收數(shù)據(jù)
- extern u16 ADC_ConvertedValue[2]; //存儲(chǔ)AD采集電壓
- extern u8 dayinbiaoz;
- /************************************************************************************************************************
- 函數(shù)聲明
- ************************************************************************************************************************/
- void Key_Zou(void);
- void SPI_Writerm(void);
- u16 ISN_Conversion(u16 isn);
- /************************************************************************************************************************
- 主函數(shù)
- ************************************************************************************************************************/
- 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; //準(zhǔn)備接收判斷起始數(shù)據(jù)1
- USART_Cmd(USART3, ENABLE); //使能串口中斷
- }
- Key_Zou();
- }
- }
- /************************************************************************************************************************
- 說明:就是找對(duì)應(yīng)關(guān)系
- 已知:一組數(shù)據(jù)0,1,2,3.......。另一組數(shù)據(jù)GB18030里的字對(duì)應(yīng)的編碼從8140開始(具體看GB18030_54936.html文件,不是以1遞增的)。
- 0對(duì)應(yīng)8140開始,后面數(shù)據(jù)都是對(duì)應(yīng)關(guān)系。
- 求:一個(gè)對(duì)應(yīng)函數(shù)能滿足以上關(guān)系。
- 很明顯初中的知識(shí)
- ************************************************************************************************************************/
- u16 ISN_Conversion(u16 isn) //GB18030,字編碼轉(zhuǎn)換為SPI存儲(chǔ)地址
- {
- 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;
- }
- }
- }
- /************************************************************************************************************************
- 說明:下面程序關(guān)鍵在“字庫中存儲(chǔ)的數(shù)據(jù)”和“發(fā)送給打印機(jī)頭的數(shù)據(jù)”要實(shí)現(xiàn)數(shù)據(jù)的重組。目的是為了讓字體打印出的效果符合預(yù)期
- 看打包的資料吧。“字庫中存儲(chǔ)的數(shù)據(jù)”參考相關(guān)圖片文件
- “發(fā)送給打印機(jī)頭的數(shù)據(jù)”參考熱敏打印機(jī)頭說明書.txt
- 先有個(gè)概念,再找對(duì)應(yīng)關(guān)系,和上面的初中題差不多,就是比較繁瑣
- ************************************************************************************************************************/
- void SPI_Writerm(void)
- {
- u8 bian=0,y,fanhui=0,cached; //bian存儲(chǔ)重新組合的8位數(shù)據(jù),y保存下一行開頭數(shù)據(jù)在緩存中的位置,fanhui結(jié)束符變量,cached存儲(chǔ)字庫中讀取的數(shù)據(jù)
- u8 i,j,k,l,p; //用于for循環(huán)體的變量
- u8 m=1,d=0; //m用于一字行(分成3段,以一點(diǎn)行為單位),d用于字行(單位為字行)
- u32 iscn; //存儲(chǔ)SPI字庫的起始地址
- do
- {
- //-------------------------------------------------------------------------------------
- //先判斷特殊情況
- //以huancun[p]為起始共16個(gè)數(shù)據(jù)為一組,判斷有沒有換行符或者結(jié)束符
- for(p=d;p<(16+d);p++){ //搜尋換行符(0x0D0A)位置
- if((huancun[p]==0x0D0A)||(huancun[p]==0x0002)){
- if(huancun[p]==0x0002){ //碰到結(jié)束符
- fanhui=127; //fanhui=127:跳出while的條件
- }
- // p++;
- break; //得到變量P,跳出
- }
- }
- //--------------------------------------------------------------------------------------
- //“字庫里讀取出的數(shù)據(jù)”和“發(fā)送給打印機(jī)的數(shù)據(jù)要轉(zhuǎn)換”,最終得到正確的字體打印效果
- //字庫存儲(chǔ)數(shù)據(jù)和發(fā)送給打印機(jī)的數(shù)據(jù)參考打包的資料
- // y=p-1-d;
- y=p-d;
- for(j=0;j<3;j++){ //3層循環(huán)
- for(k=0;k<8;k++){ //8層循環(huán)
- Power_Pulse(); //電源脈沖(HOTLEAD引腳,高低電平在for循環(huán)里變化實(shí)現(xiàn)脈沖)
- for(p=16;p>y;p--){ //不用打字的部分,(16-y)個(gè)字填空
- for(l=0;l<3;l++){ //一個(gè)字寬24位,所以給3層循環(huán)
- SPI_WriteByte(0x00); //直接發(fā)送給打印機(jī)頭數(shù)據(jù)0x00
- }
- }
- for(;p>0;p--){
- iscn=(ISN_Conversion(huancun[p-1+d])*72); //從尾部數(shù)據(jù)開始重組發(fā)送打印機(jī)頭數(shù)據(jù)
- for(l=m;l<(m+3);l++){
- GPIO_ResetBits(PORT_SPI_CS, PIN_SPI_CS); //通信時(shí)序必要,可參考打包資料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); //讀數(shù)據(jù)
- bian|=(((cached&(0x01<<k))>>k)<<i); //重新組合的8位數(shù)據(jù)
- }
- SPI_WriteByte(bian); //發(fā)送給打印機(jī)頭
- bian=0; //存儲(chǔ)數(shù)據(jù)變量清零
- GPIO_SetBits(PORT_SPI_CS, PIN_SPI_CS); //通信時(shí)序必要,可參考打包資料W25Q16
- }
- } //上面j的3層、k的8層、p的16層,是一點(diǎn)行384個(gè)點(diǎn),細(xì)分p層,l是3層、i是8層,是24位一個(gè)字寬
- //--------------------------------------------------------------------------------------------------------------------------------------------------------------
- //打印部分程序
- //打印一點(diǎn)行為一個(gè)單位
- Tim4_Pwm(); //設(shè)置PWM輸出引腳為復(fù)用功能輸出(這是輸出PWM的條件,讓步進(jìn)電機(jī)轉(zhuǎn))
- delayms(10); //電機(jī)轉(zhuǎn)一點(diǎn)行需要4ms,這里延遲10ms,讓轉(zhuǎn)一點(diǎn)行這一過程完成,再執(zhí)行下面的程序
- Scintillation(); //打印紙檢測(cè)
- Hold_Enable(); //熱頭分組加熱
- while(ADC_ConvertedValue[0]<1750) //判斷采集的熱敏處電壓是否過低,即打印機(jī)溫度是否過大,當(dāng)溫度過高時(shí),程序停在此while里,直到溫度上升到一定程度跳出
- {
- GPIO_SetBits(PORT_POWERLED, POWERLED);//指示燈滅
- }
- //--------------------------------------------------------------------------------------------------------------------------------------------------------------
- }
- m+=3; //m對(duì)應(yīng)點(diǎn)行,m=1時(shí),是字的三分之一段8行。m+3后,是字的三分之一中間段8行。再+3后,是剩下的8行。
- }
- m=1; //準(zhǔn)備下一行字打印(一行字等于24行點(diǎn)行)
- 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); //關(guān)閉5V電源
- }
- /************************************************************************************************************************/
- /*************************************************************************
- 說明:短按按鍵走一點(diǎn)行,按住按鍵1.5秒以上持續(xù)走紙
- *************************************************************************/
- void Key_Zou(void)
- {
- u8 i,t=0; //計(jì)時(shí)變量t=0,循環(huán)變量i
- if(dayinbiaoz==0){ //打印不走紙
- if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_3)==RESET){ //判斷引腳
- USART_Cmd(USART3, DISABLE); //關(guān)串口,走紙不打印
- delayms(20); //去抖
- while(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_3)==RESET){ //再次判斷,按鍵松開跳出循環(huán)
- if((t==0)||(t>100)){ //短按按鍵走一點(diǎn)行,按住按鍵1.5秒以上持續(xù)走紙
- 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){ //計(jì)時(shí)變量t累加
- t++;
- delayms(15);
- }
- }
- USART_Cmd(USART3, ENABLE); //開串口
- }
- }
- }
復(fù)制代碼
所有資料51hei提供下載:
熱敏打印機(jī).rar
(18.83 MB, 下載次數(shù): 225)
2020-2-27 21:40 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
|
評(píng)分
-
查看全部評(píng)分
|