摘 要:本文主要介绍模拟复印机生产组装过程中,在TM与IOT组装前设计一个检测装置,对TM的各组件状态及传感器进行检测,确保组装到IOT整机后,TM均为良品.以此解决原生产方式中的弊端.
关 键 词:单片机串口通信TM(TrayModule)IOT(ImageOutputTerminal)
中图分类号:TS261文献标识码:A文章编号:1672-3791(2012)08(c)-0030-02
1设计构想
多功能复印机现有工程生产方式如图1,这种生产方式操作麻烦,且容易造成二次人为故障,生产效率低.基于这种考虑,将生产过程改良如下,可解决原生产方式的弊端(如图2).
2检测器设计
TM与IOT由物理层,数据连接层,虚拟命令层构成.本设计利用虚拟命令层获取相关信息,完成检测目的.综合考虑成本,设计周期,难易度等因素,最终选定单片机+LCD作为设计课题.
检测器系统如图3所示,单片机:采用ATMEGA48单片机完成整个检测器的控制;LCD:显示TM的动态信息,TM内部故障发生时报警;电源控制:当检测器检测到正确连接到TM时,启动按键,延时1秒钟向TM供电,检测过程中,一时发生故障,系统自动供电电源,防止二次故障发生;LED蜂鸣:LED显示数据的发送接收状态,有数据传输时LED闪烁,异常时蜂鸣器报警.
3程序设计
主程序中各子程序通过标识状态作相应处理.串口数据读取利用单片机串口中断函数,非常方便于数据的连续发送与接收.
3.1程序代码
3.1.1主程序
/***************************************************************************************
#include"mon.h"
等等
intmain(void)
{Sys_Init();//系统初始化
等等.
TIMSK0|等于(1< sei(); while(1) {wdt_reset();//喂狗 if(Key_Ctr等于等于1){Key_Control();Key_Ctr等于0;}//按键处理 if(Buzzer_F!等于0){Buzzer_On(Buzzer_F);Buzzer_F等于0;}//蜂鸣 if((Error_F!等于0)&&(Run_F!等于0)){Buzzer_F等于1;}//报警处理 if(Send_F等于等于1){USART_Data_Send();Send_F等于0;}//数据传送 if(rx_buffer.flag等于等于FLAG_RECEIVE_OK)//如果串口接收到完整的数据帧,则进行处理 {USART_CMDProcess(); USART_ClearRXBuffer(); Time_Out等于0;//通信超时计时结束 Time_Out_Sec等于0;} if(tx_buffer.flag等于等于FLAG_SEND_REQUEST)//如果串口发送缓冲区有发送请求,执行发送 {USART_SendString(); tx_buffer.flag等于FLAG_EMPTY; Time_Out等于1;//通信超时计时开始} if(RefreshLCD_F){RefreshLCD();RefreshLCD_F等于0;}//如果LCD有刷新请求,则刷新LCD}} #include"mon.h" 等等 RX_BUFFERrx_buffer;//接收数据结构体实例 TX_BUFFERtx_buffer;//发送数据结构体实例 staticucharNO_CMD_D5[5]等于{0xD5,0x00,0x00,0x00,0x55}; 等等等. /************************************************************************串口初始化 voidUSART_init(uintbaud) {UBRR0H等于baud>>8; UBRR0L等于baud&0x00FF; UCSR0A等于0x00;//U2xn等于0,波特率无倍速 UCSR0B等于(1< UCSR0C等于(1< USART_ClearRXBuffer(); USART_ClearTXBuffer();} /*************************************************************************数组发送 voidUSART_Data_Send(void) {uchari; switch(Data_F) { case1:{for(i等于0;i case6:{for(i等于0;i default:;}} /*******************************************************************TRAY-STS数据处理 voidUSART_CMDProcess(void) {if(rx_buffer.buff[1]等于等于0x03)//本组数据为TM版本数据 {Ver_D等于(rx_buffer.buff[3]>>3)&0x03;;//实验/恒久 Ver_H等于rx_buffer.buff[3]&0x07;//TM版本上位 Ver_L等于rx_buffer.buff[2]&0x3F;//TM版本下位 RefreshLCD_F等于2;} elseif(rx_buffer.buff[1]等于等于0x04)//本组数据为TRAY_STS {TM_No等于rx_buffer.buff[2]&0x03;//取出TRAY编号00->No201->No310->No4 TM_Status等于(rx_buffer.buff[2]>>2)&0x07;//TRAY状态000->准备好001->上升010->Tary拔 出011->无纸100->上升NG101->NC110->上升3次NG111->SizeSensorNG ASize等于(rx_buffer.buff[2]>>5)|(rx_buffer.buff[3]<<2);//SizeSensor模拟电压AD值 DSize等于(rx_buffer.buff[3]>>6)&0x01;//SizeSensor数字位0,1 RefreshLCD_F等于3;} else;} /********************************************************************清空接收缓冲区 voidUSART_ClearRXBuffer(void) {uchari; for(i等于0;i rx_buffer.rxcount等于0;//计数值清零 rx_buffer.flag等于FLAG_EMPTY;} /*******************************************************向接收缓冲区中添加一个字节 ucharUSART_AddToRXBuffer(ucharch) {if(rx_buffer.rxcount>等于RX_MAX){returnERROR_RXBUFFER_FULL;}//缓冲区满 else {rx_buffer.buff[rx_buffer.rxcount]等于ch;//将要添加的字节保存到当前计数值指向的位置 rx_buffer.rxcount++;//缓冲区的长度增加1 wdt_reset();//喂狗 returnADD_CHAR_OK;//返回添加成功信息}} /***********************************************************清空发送缓冲区 voidUSART_ClearTXBuffer(void) {uchari; for(i等于0;i {tx_buffer.buff[i]等于0x00;//缓冲区当前元素清空 wdt_reset();//喂狗} tx_buffer.txcount等于0;//计数值清零 tx_buffer.flag等于FLAG_EMPTY;} /***********************************************************向发送缓冲区中添加一个字节 ucharUSART_AddToTXBuffer(ucharch) {if(tx_buffer.txcount>TX_MAX){returnERROR_TXBUFFER_FULL;}//缓冲区满 else {wdt_reset(); tx_buffer.buff[tx_buffer.txcount]等于ch;//将要添加的字节保存到当前计数值指向的位置 tx_buffer.txcount++;//缓冲区的长度增加1 wdt_reset();//喂狗 if(tx_buffer.txcount等于等于TX_MAX) {tx_buffer.flag等于FLAG_SEND_REQUEST;//填充完毕指定数量数据,设置发送请求} returnADD_CHAR_OK;//返回添加成功信息}} /***************************************************将发送缓冲区的内容一次性发送 voidUSART_SendString(void){UDR0等于tx_buffer.buff[0];//从结构数据的第1个数开始发送 tx_buffer.txcount等于0;} /****************************************************串口发送中断怎么写作函数 SIGNAL(SIG_USART_TRANS) {if(++tx_buffer.txcount elseif(tx_buffer.txcount等于等于TX_MAX) {USART_ClearTXBuffer();//发送完毕 USART_ClearRXBuffer();//作好接收准备} else;} /*****************************************************串口接收完毕中断怎么写作函数 SIGNAL(SIG_USART_RECV) {rx_buffer.buff[rx_buffer.rxcount]等于UDR0; rx_buffer.rxcount++; if(rx_buffer.rxcount>等于RX_MAX){rx_buffer.flag等于FLAG_RECEIVE_OK;}} voidRefreshLCD(void)/*刷新LCD显示*/ {if(RefreshLCD_F等于等于1)//LCD刷新标识0:无效1:框架显示2:版本显示3:数据显示4:刷新机种 {if(TM_Status等于等于2){disp_String(x,y,(uchar*)"已取出");}//纸盒拔出 else{ if((199{disp_String(x,y,(uchar*)"A5SEF");} elseif((184{disp_String(x,y,(uchar*)"B5SEF");} 等等等.. elseif((0{disp_String(x,y,(uchar*)"11x17SEF");} else{disp_String(x,3,(uchar*)"ErrorSize");}//纸型错误}} 4结果测试 只要是TM组件自身的故障都就能检出,如TM纸型感知传感器未安装或接触不良、TM控制器版本错误等.目前为止,没有一件因TM不良而导致整机拆卸的维修事件,提高了生产效率.3.1.2串口中断程序代码
有关论文范文主题研究:
关于数据结构的文章
大学生适用:
在职研究生论文、函授毕业论文
相关参考文献下载数量:
83
写作解决问题:
毕业论文怎么写
毕业论文开题报告:
论文提纲、论文目录
职称论文适用:
职称评定、职称评初级
所属大学生专业类别:
毕业论文怎么写
论文题目推荐度:
经典题目
3.1.3LCD显示程序代码(纸型检出部份)