传送带产品计数器的设计LCD显示.docx
《传送带产品计数器的设计LCD显示.docx》由会员分享,可在线阅读,更多相关《传送带产品计数器的设计LCD显示.docx(13页珍藏版)》请在冰豆网上搜索。
传送带产品计数器的设计LCD显示
摘要
MCS-51系列单片机LCD显示LCM1602
1题目
传送带产品计数器的设计(LCD显示)功能要求:
用MCS-51系列单片机作为控制器;采用LCM1602进行计数显示;采用光电传感器计数;用按键控制传送带电机的起停;用拨码盘预置计数值,计数到预定值时,传送带停止,按键后传送带继续运行。
2电路原理图的设计
2.1传送带产品计数器(LED显示)电路原理图
硬件原理图如下图所示,包括显示模块,按键模块,电机控制模块,置数模块。
2.2LED显示模块
使用4位LED数码管来显示数字,通过NPN管来驱动数码管。
2.3置数模块
使用8位薄码盘和5位薄码盘组合来组成最高13位的二进制数,即8191的最大置数值,很好的利用了4位数码管。
3软件系统设计
3.1软件系统的流程结构
3.2C51程序
/*-----------------------------------------------------------
文件名:
lcd1602.h头文件
功能:
LCD1602驱动函数的声明
-----------------------------------------------------------*/
#ifndef_LCD1602_H_
#define_LCD1602_H_
#include
#defineuintunsignedint
#defineucharunsignedchar
//接口定义
sbitLcdRs=P2^0;
sbitLcdRw=P2^1;
sbitLcdEn=P2^2;
sfrDBPort=0x80;//P0口为LCD数据总线
/*-----------------------------------------------------------
功能:
LCD初始化函数
-----------------------------------------------------------*/
voidLCD_Initial();
/*-----------------------------------------------------------
功能:
LCD显示字符(ASIIC码)函数
参数:
x-列0~15;y-行0~1;str-要显示的字符串指针
-----------------------------------------------------------*/
voidLCD_Prints(ucharx,uchary,uchar*str);#endif
/*-----------------------------------------------------------
文件名:
lcd1602.c
函数功能:
LCD1602的驱动函数
原理:
采用普通IO口方式模拟LCD1602时序,未采用总线方式
-----------------------------------------------------------*/
#include
#include//次头文件中定义有_nop_()函数
#include"lcd1602.h"
/*-----------------------------------------------------------
功能:
内部等待函数
返回参数:
P0数据
-----------------------------------------------------------*/
ucharLCD_Wait(void)
{LcdRs=0;
LcdRw=1;_nop_();
LcdEn=1;_nop_();
//while(DBPort&0x80);
/*在用Proteus仿真时,屏蔽此语句,否则会进入死循环,
实际硬件操作时打开此语句.*/
LcdEn=0;
returnDBPort;}
/*-----------------------------------------------------------
功能:
写LCD命令/数据函数
参数:
style为写命令/数据,0-命令,1-数据;input为写入的8位命令/数据
-----------------------------------------------------------*/
#defineLCD_COMMAND0//命令
#defineLCD_DATA1//数据
#defineLCD_CLEAR_SCREEN0x01//清屏
#defineLCD_HOMING0x02//光标返回原点
voidLCD_Write(bitstyle,ucharinput)
{LcdEn=0;
LcdRs=style;
LcdRw=0;_nop_();
DBPort=input;_nop_();
LcdEn=1;_nop_();
LcdEn=0;_nop_();
LCD_Wait();}
/*-----------------------------------------------------------
功能:
设置LCD显示模式
参数:
DisplayMode见下面的定义
-----------------------------------------------------------*/
//显示模式定义
#defineLCD_SHOW0x04//显示开
#defineLCD_HIDE0x00//显示关
#defineLCD_CURSOR0x02//显示光标
#defineLCD_NO_CURSOR0x00//无光标
#defineLCD_FLASH0x01//光标闪动
#defineLCD_NO_FLASH0x00//光标不闪动
voidLCD_SetDisplay(ucharDisplayMode)
{LCD_Write(LCD_COMMAND,0x08|DisplayMode);}
/*-----------------------------------------------------------
功能:
设置LCD输入模式
参数:
InputMode见下面的定义
-----------------------------------------------------------*/
#defineLCD_AC_UP0x02//地址计数器增加方式
#defineLCD_AC_DOWN0x00//此为缺省设置
#defineLCD_MOVE0x01//画面可平移
#defineLCD_NO_MOVE0x00//画面不可平移
voidLCD_SetInput(ucharInputMode)
{LCD_Write(LCD_COMMAND,0x04|InputMode);}
//初始化LCD详见LCD1602.h中的说明
voidLCD_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-列0~15;y-行0~1;
-----------------------------------------------------------*/
voidLCD_Pos(ucharx,uchary)
{if(y==0)
LCD_Write(LCD_COMMAND,0x80|x);
if(y==1)
LCD_Write(LCD_COMMAND,0x80|(x-0x40));}
//将字符(ASIIC码)输出到液晶显示详见LCD1602.h中的说明
voidLCD_Prints(ucharx,uchary,uchar*str)
{LCD_Pos(x,y);
while(*str!
='\0'){LCD_Write(LCD_DATA,*str);str++;}}
3.3计数程序模块
#include"lcd1602.h"
#defineucharunsignedchar
#defineuintunsignedint
ucharout[6];
sbitSTAR_KEY=P3^2;//定义键与单片机的连接引脚
sbitL0=P1^0;//定义SFR中引脚的位
sbitL1=P1^1;
sbitL2=P1^2;
sbitL3=P1^3;
sbitL4=P1^4;
sbitL5=P1^5;
sbitL6=P1^6;
sbitL7=P1^7;
sbitMOTOR=P3^0;
ucharn[2]={1,0};
voiddelayms(uintx)//延时子程序
{uchary;
while(x--){for(y=0;y<123;y++){;}}
ucharKeynum()//按键子程序1
{ucharkey=0;
STAR_KEY=1;//置初值
if(STAR_KEY==0){delayms(10);if(STAR_KEY==0)n[0]=0;n[1]=1;}//按下STAR键则n[0]=0;n[1]=1returnn[1];//返回n值}
voidxianshi(uintdispbuf)//显示子程序
{out[0]=dispbuf/10000+0x30;
out[1]=((dispbuf%10000)/1000)+0x30;
out[2]=((dispbuf%1000)/100)+0x30;
out[3]=((dispbuf%100)/10)+0x30;
out[4]=dispbuf%10+0x30;
out[5]='\0';
LCD_Initial();//LCD初始化
LCD_Prints(1,0,"TheSpeedIs");//LCD输出
LCD_Prints(10,1,"n/min");
LCD_Prints(4,1,out);}
uintqiuzhi()//求用拨码盘所置数的值的子程序
{uchara;
ucharb;
ucharc;
uchard;
uchare;
ucharf;
ucharg;
ucharh;
uintp=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;
returnp;//返回所求的P值}
voidmain(void)//主程序
{uintq;
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=n[1];}//当电动机关闭时显示用薄码盘所置的数并停止计数,电机启动时则开始计数,并显示计数值
if(TL0==q){TR0=0;MOTOR=1;}else{Keynum();MOTOR=n[0];}}}
//当计数值与所置数相同时关闭电机,停止计数,当计数值不等时则将电机启动与关闭交由按键控制,所以不存在计数值超过置数值的情况voidInt0(void)interrupt0//中断服务程序,工作寄存器用0组
{TL0=0;TR0=1;}//重置计数值,重新开始计数
4仿真及调试
5总论
整个设计通过了软件和硬件上的调试.......................
参考文献
[1]胡汉才.单片机原理及接口技术[M].北京:
清华大学出版社.1996.
[2]张毅刚.MCS-51单片机应用设计[M].哈尔滨:
哈尔滨工业大学出版社,1997.
....................................................................
致谢
............................................................................