传送带产品计数器设计(LCD显示).docx
传送带产品计数器设计(LCD显示)传送带产品计数器的设计(LCD显示) 书目 摘要 2 1 题目 3 2 电路原理图的设计 3 2.1 传送带产品计数器(LED显示)电路原理图 3 2.2 LED显示模块 3 2.3 置数模块 4 3 软件系统设计 5 3.1 软件系统的流程结构 5 3.2 C51程序 5 3.3计数程序模块 8 4 仿真及调试 11 5 总论 11 参 考 文 献 13 致 谢 14 摘要 MCS-51系列单片机 LCD显示 LCM1602 1 题目 传送带产品计数器的设计(LCD显示)功能要求: 用MCS-51系列单片机作为限制器;采纳LCM1602进行计数显示;采纳光电传感器计数; 用按键限制传送带电机的起停; 用拨码盘预置计数值,计数到预定值时,传送带停止,按键后传送带接着运行。2 电路原理图的设计 2.1 传送带产品计数器(LED显示)电路原理图 硬件原理图如下图所示,包括显示模块,按键模块,电机限制模块,置数模块。 2.2 LED显示模块 运用4位LED数码管来显示数字,通过NPN管来驱动数码管。 2.3 置数模块 运用8位薄码盘和5位薄码盘组合来组成最高13位的二进制数,即8191的最大置数值,很好的利用了4位数码管。 3 软件系统设计 3.1 软件系统的流程结构 3.2 C51程序 /*- 文件名:lcd1602.h头文件 功能:LCD1602驱动函数的声明 -*/ #ifndef _LCD1602_H_ #define _LCD1602_H_ #include <reg52.h> #define uint unsigned int #define uchar unsigned char /接口定义 sbit LcdRs = P20; sbit LcdRw = P21; sbit LcdEn = P22; sfr DBPort = 0x80; /P0口为LCD数据总线 /*- 功能:LCD初始化函数 -*/ void LCD_Initial(); /*- 功能:LCD显示字符(ASIIC码)函数 参数:x-列015;y-行01;str-要显示的字符串指针 -*/ void LCD_Prints(uchar x, uchar y,uchar *str);#endif /*- 文件名:lcd1602.c 函数功能:LCD1602的驱动函数 原理:采纳一般IO口方式模拟LCD1602时序,未采纳总线方式 -*/ #include <REG52.H> #include <intrins.h> /次头文件中定义有_nop_()函数 #include “lcd1602.h“ /*- 功能:内部等待函数 返回参数:P0数据 -*/ uchar LCD_Wait(void) LcdRs=0; LcdRw=1; _nop_(); LcdEn=1; _nop_(); /while(DBPort0x80); /* 在用Proteus仿真时,屏蔽此语句,否则会进入死循环, 实际硬件操作时打开此语句.*/ LcdEn=0; return DBPort; /*- 功能:写LCD吩咐/数据 函数 参数:style为写吩咐/数据,0-吩咐,1-数据;input为写入的8位吩咐/数据 -*/ #define LCD_COMMAND 0 / 吩咐 #define LCD_DATA 1 / 数据 #define LCD_CLEAR_SCREEN 0x01 / 清屏 #define LCD_HOMING 0x02 / 光标返回原点 void LCD_Write(bit style, uchar input) LcdEn=0; LcdRs=style; LcdRw=0; _nop_(); DBPort=input; _nop_(); LcdEn=1; _nop_(); LcdEn=0; _nop_(); LCD_Wait(); /*- 功能:设置LCD显示模式 参数:DisplayMode 见下面的定义 -*/ /显示模式定义 #define LCD_SHOW 0x04 /显示开 #define LCD_HIDE 0x00 /显示关 #define LCD_CURSOR 0x02 /显示光标 #define LCD_NO_CURSOR 0x00 /无光标 #define LCD_FLASH 0x01 /光标闪动 #define LCD_NO_FLASH 0x00 /光标不闪动 void LCD_SetDisplay(uchar DisplayMode) LCD_Write(LCD_COMMAND, 0x08|DisplayMode); /*- 功能:设置LCD输入模式 参数:InputMode 见下面的定义 -*/ #define LCD_AC_UP 0x02 / 地址计数器增加方式 #define LCD_AC_DOWN 0x00 / 此为缺省设置 #define LCD_MOVE 0x01 / 画面可平移 #define LCD_NO_MOVE 0x00 / 画面不行平移 void LCD_SetInput(uchar InputMode) LCD_Write(LCD_COMMAND, 0x04|InputMode); /初始化LCD 详见LCD1602.h中的说明 void LCD_Initial() LcdEn=0; LCD_Write(LCD_COMMAND,0x38); /8位数据端口,2行显示,5*7点阵 LCD_Write(LCD_COMMAND,0x38); /此句不能省 LCD_SetDisplay(LCD_SHOW|LCD_NO_CURSOR); /开启显示, 无光标 LCD_Write(LCD_COMMAND,LCD_CLEAR_SCREEN); /清屏 LCD_SetInput(LCD_AC_UP|LCD_NO_MOVE); /AC递增, 画面不? /*- 功能:液晶字符显示的位置函数 参数:x-列015;y-行01; -*/ void LCD_Pos(uchar x, uchar y) if(y=0) LCD_Write(LCD_COMMAND,0x80|x); if(y=1) LCD_Write(LCD_COMMAND,0x80|(x-0x40); /将字符(ASIIC码)输出到液晶显示 详见LCD1602.h中的说明 void LCD_Prints(uchar x, uchar y,uchar *str) LCD_Pos(x,y); while(*str!=0) LCD_Write(LCD_DATA,*str); str+; 3.3计数程序模块 #include“lcd1602.h“ #define uchar unsigned char #define uint unsigned int uchar out6; sbit STAR_KEY =P32;/定义键与单片机的连接引脚 sbit L0=P10; /定义SFR中引脚的位 sbit L1=P11; sbit L2=P12; sbit L3=P13; sbit L4=P14; sbit L5=P15; sbit L6=P16; sbit L7=P17; sbit MOTOR=P30; uchar n2=1,0; void delayms(uint x) /延时子程序 uchar y; while(x-)for(y=0;y<123;y+); uchar Keynum() /按键子程序1 uchar key=0; STAR_KEY=1; /置初值 if(STAR_KEY=0)delayms(10);if(STAR_KEY=0)n0=0;n1=1; /按下STAR键则n0=0;n1=1return n1; /返回n值 void xianshi(uint dispbuf) /显示子程序 out0=dispbuf/10000+0x30; out1=(dispbuf%10000)/1000)+0x30; out2=(dispbuf%1000)/100)+0x30; out3=(dispbuf%100)/10)+0x30; out4=dispbuf%10+0x30; out5=0; LCD_Initial(); /LCD初始化 LCD_Prints(1, 0,“The Speed Is“); /LCD输出 LCD_Prints(10, 1,“n/min“); LCD_Prints(4, 1,out); uint qiuzhi() /求用拨码盘所置数的值的子程序 uchar a; uchar b; uchar c; uchar d; uchar e; uchar f; uchar g; uchar h; uint p=0; if (L0=1) a=1; else a=0; /将电平信号变为数字的值 if (L1=1) b=1; else b=0; if (L2=1) c=1; else c=0; if (L3=1) d=1; else d=0; if (L4=1) e=1; else e=0; if (L5=1) f=1; else f=0; if (L6=1) g=1; else g=0; if (L7=1) h=1; else h=0; p=a+b*2+c*2*2+d*2*2*2+e*2*2*2*2+f*2*2*2*2*2+g*2*2*2*2*2*2+h*2*2*2*2*2*2*2; return p; / 返回所求的P值 void main(void) /主程序 uint q; IT0=1; /负跳变触发 EA=1; /开总允许中断 EX0=1; /开INTO中断 TMOD=0X05; /置T0为计数器 方式1 TL0=0; /置计数器初值 TH0=0; while(1) /无限循环 q=qiuzhi(); /调用求值子程序求出所置的数 if (MOTOR=1) xianshi(q); else xianshi(TL0);Keynum();TR0=n1; /当电动机关闭时显示用薄码盘所置的数并停止计数,电机启动时则起先计数,并显示计数值 if (TL0=q) TR0=0;MOTOR=1; else Keynum();MOTOR=n0; /当计数值与所置数相同时关闭电机,停止计数,当计数值不等时则将电机启动与关闭交由按键限制,所以不存在计数值超过置数值的状况 void Int0(void) interrupt 0 /中断服务程序,工作寄存器用0组 TL0=0;TR0=1; /重置计数值,重新起先计数 4 仿真及调试 5 总论 整个设计通过了软件和硬件上的调试. 参 考 文 献 1胡汉才.单片机原理及接口技术M.北京:清华高校出版社.1996. 2张毅刚.MCS-51单片机应用设计M.哈尔滨:哈尔滨工业高校出版社,1997. . 致 谢 .