打印

微型打印机流程及讲解

[复制链接]
2876|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 拿起书本 于 2012-4-2 22:36 编辑

在51单片机应用系统中,微型打印机是主要的硬拷贝输出设备,目前国内流行的微型打印机心要有GP16,TPuP16/40A,PP40等。下面介绍一下以GP16为例介绍打印机在51单片机系统中的扩展设计。
下面是51单片机与GP16微型打印机的连接示意图。

C语言程序及讲解
*****************************************************************************
本程序的主要功能是分三行实现打印内存缓冲区存储的三个温度数据:
打印格式为:
一T:  ×   ×   ×   ×   .×   ×   ℃
二T:  ×   ×   ×   ×   .×   ×   ℃
三T:  ×   ×   ×   ×   .×   ×   ℃
******************************************************************************
uchar  table1[3]= {0x54; 0x 3a; 0x 20}          行开头数据
uchar  table2[4]= {0x43; 0x 20; 0x 20; 0x 20}    行结尾数据
uvhsr  dbuf[9]={12,13,14,15,16,17,18,19,20}     内存9位数据
uchar  hanzi[3]={0x81;0x82;0x83}             表头汉字表
uchar  t=0x00
#define  PNTER  XBYTE[0x7fff]        //打印机端口地址  
void main()
{  
  IE=0x00;                            //关闭中断
  do
{temp=PNTER;}                     //读取打印机状态
  while((temp&&0x81)=0)              //一直到打印机可以响应单片机的新命令
  do
{
PNTER=0x91;              //送打印命令:送打印命令:打印字符串,点行数为0x0a
temp=PNTER;
}
while(( (temp&&0x80)=0) )        //一直等到打印机收到正确的打印命令
  if( (temp&&0x01)!=0))
    {
do{temp=PNTER}
while((temp&&0x01h)=0))      //读取打印机状态,一直到打印机空闲
}
PNTER=0x03;              //送打印行数:3行
  do
{temp=PNTER;}
while(( (temp&&0x01)=0)      //读取打印机状态,一直到打印机空闲
//以下为打印三行数据程序段
for{i=0,i<3,i++}
{
PNTER=hanzi;             //打印行开头汉字
do{temp=PNTER}
while((temp&&0x01h)=0))
  for(m=0;m<3;m++)
    {
PNTER=table1[m];
do{temp=PNTER}
while((temp&&0x01h)=0))     //打印行开头T:
}
    PNTER=DBUF[t++]
do{temp=PNTER}
while((temp&&0x01h)=0))     //打印前两位整数
PNTER=DBUF[t++]
   do{temp=PNTER}
while((temp&&0x01h)=0))
PNTER=0x2e;
do{temp=PNTER}
while((temp&&0x01h)=0))     //打印小数点
PNTER=DBUF[t++]
   do{temp=PNTER}
while((temp&&0x01h)=0))     //打印小数位
for(m=0;m<4;m++)
      {
PNTER=table2[m];
do{temp=PNTER}
while((temp&&0x01h)=0))    //打印行结尾℃
}
}
}                              //主程序结束

[localimg=171,150]1[/localimg]

相关帖子

沙发
lirfv| | 2012-4-2 22:44 | 只看该作者
这要是用430
效果如何

使用特权

评论回复
板凳
拿起书本|  楼主 | 2012-4-2 22:47 | 只看该作者
实现过程和上面说的相似,具体看所用芯片的手册。:)

使用特权

评论回复
地板
huangfeng33| | 2012-4-3 22:52 | 只看该作者
好想了解一下汇编程序,LZ是否也能赐教?:handshake

使用特权

评论回复
5
拿起书本|  楼主 | 2012-4-6 08:17 | 只看该作者
4# huangfeng33
试试看吧
*****************************************************************************
本程序的主要功能是分三行实现打印内存缓冲区存储的三个温度数据:
打印格式为:
一T:  ×   ×   ×   ×   .×   ×   ℃
二T:  ×   ×   ×   ×   .×   ×   ℃
三T:  ×   ×   ×   ×   .×   ×   ℃
******************************************************************************
DBUF    DATA    30H
ORG  0000H
LJMP  MAIN
ORG  0030H
MAIN: MOV  SP,#70H
        MOV   IE,#00H                    ;关闭中断
PRINT:MOV   DPTR,#7FFFH
LP0:   MOVX  A,@DPTR                 //读取打印机状态
        ANL    A,#81H
        JNZ   LP0                        //一直到打印机可以响应单片机的新命令
LOOP1:MOV  A,#91H       // 送打印命令:送打印命令:打印字符串,点行数为0AH
        MOVX  @DPTR,A         
LP2:   MOVX  A,@DPTR
        JB   ACC.7,LOOP1        //一直等到打印机收到正确的打印命令
        JB   ACC.0,LP2           //读取打印机状态,一直到打印机空闲
        MOV   A,#03H           //送打印行数:3行
        MOVX  @DPTR,A
LPP:   MOVX  A,@DPTR         
        JB  ACC.0,LPP           //读取打印机状态,一直到打印机空闲
        MOV    R1,#DBUF
        MOV   R7,#00H
LP12:  MOV   A,R7
        ADD    A,#81H         //发送打印行开头汉字‘一’
        MOVX  @DPTR,A
LPP1: MOVX  A,@DPTR        //查询打印机状态
        JB  ACC.0,LPP1
MOV   R4,#00H
LOOP3:MOV   A,R4           //打印行开头T:
        MOV  DPTR,#TABLE1
        MOVC  A,@A+DPTR     //查表得到T的ASCII码
MOV    DPTR,#7FFFH
        MOVX  @DPTR,A
LPP2: MOVX  A,@DPTR        //查询打印机状态
        JB  ACC.0,LPP
        INC  R4   
        MOV  A,R4               
        CJNE  A,#03H,LOOP3  //打印完T:
LOOP4:LCALL   SUBI           //打印前两位整数
         MOV   A,R7
        ADD   A,R7
        ADD   A,R7
        ADD   A,#32H          //整数部分打印完?
XRL   A,R1
JNZ    LOOP4             //为打印完,继续打印   
LPP3:MOV  DPTR,#7FFFH        //查询打印机状态
       MOVX  A,@DPTR
      JB  ACC.0,LPP3
      MOV   A,#2EH            // 打印小数点
      MOVX  @DPTR,A
LPP4:MOVX  A,@DPTR        //查询打印机状态
      JB  ACC.0,LPP4
      LCALL    SUBI            //打印小数位
      MOV    R6,#05H
MOV    R4,#00H         
LPP8:MOV  DPTR,#7FFFH
       MOVX  A,@DPTR        //查询打印机状态
      JB  ACC.0,LPP8
      MOV   A,R4
      MOV  DPTR,#TABLE2     //打印行结尾℃
      MOVC  A,@A+DPTR      //查表,取打印代码
      MOV   DPTR,#7FFFH   
      MOV   @DPTR,A        //送打印代码
      INC   R4
      DJNZ  R6,LPP8           //打印完℃?   
      INC   R7  
MOV  A,R7
XRL   A,#03H           //3行打印完
JNZ   A,LP12            //没有打印完,继续打印下一行
RET
//取缓冲区数据,转换为ASCII码,打印字程序        
SUBI:MOV DPTR,#7FFFH                  
      MOVX  @DPTR,A                   //查询打印机状态
      JB  ACC.0,SUBI      
      MOV  A,@R1                      //读取缓冲区数据
      ANL   A,#0F0H
      SWAP  A                           //字节分离转换为ASCII码
      LCALL  ASCII
      MOVX  @DPTR,A                 //发送ASCII码打印数据
LST:MOVX  A,@DPTR                  //查询打印机状态
      JB  ACC.0,LST
MOV  A,@R1                    //取打印数据
      ANL   A,#0F0H
LCALL  ASCII                     //查询ASCII码
      MOVX  @DPTR,A                //发送ASCII打印数据
INC   R1   
RET
//ASCII码转换程序
ASCII:ADD   A,#90H                  //分离的BCD码转换为ASCII码           
       DA  A
       ADDC  A,#40H                //
       DA   A
       RET
TABLE1:  DB    54H,3AH,20H           ;T: 行开头数据
TABLE2:  DB    43H,20H,20H,20H      ;℃  行结尾数据

使用特权

评论回复
6
liqaz| | 2012-4-6 08:30 | 只看该作者
用汇编写的代码啊              
够厉害的            
      学习

使用特权

评论回复
7
jxmzzr| | 2012-4-14 13:24 | 只看该作者
学习了。
还可以采用单片机中断的方式及时向打印机发送打印命令和数据。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:好好学习,天天向上!

519

主题

4194

帖子

31

粉丝