目录
摘要 ................................................................................................................................................................................................................................ 1 1 题目 ........................................................................................................................................................................................................................... 2 2 电路原理图的设计 ............................................................................................................................................................................................. 2 2.1 传送带产品计数器(LED显示)电路原理图 ................................................................................................................................... 2 2.2 LED显示模块 .................................................................................................................................................................................................. 3 2.3 置数模块 .......................................................................................................................................................................................................... 4 3 软件系统设计 ...................................................................................................................................................................................................... 4 3.1 软件系统的流程结构 ................................................................................................................................................................................. 5 3.2 C51程序 ........................................................................................................................................................................................................ 5 3.3计数程序模块 ............................................................................................................................................................................................... 13 4 仿真及调试 ........................................................................................................................................................................................................ 19 5 总论 ........................................................................................................................................................................................................................ 19 参 考 文 献 ............................................................................................................................................................................................................. 21 致 谢 ...................................................................................................................................................................................................................... 22
摘要
MCS-51系列单片机 LCD显示 LCM1602
1
1 题目
传送带产品计数器的设计(LCD显示)功能要求:
用MCS-51系列单片机作为控制器;采用LCM1602进行计数显示;采用光电传感器计数; 用按键控制传送带电机的起停; 用拨码盘预置计数值,计数到预定值时,传送带停止,按键后传送带继续运行。
2 电路原理图的设计
2.1 传送带产品计数器(LED显示)电路原理图
硬件原理图如下图所示,包括显示模块,按键模块,电机控制模块,置数模块。
2
LCD1LM016LVCCRV11kVSSVDDVEERSRWE456D0D1D2D3D4D5D6D771011121314RP110*8VCC1U119XTAL1P0.0/AD0P0.1/AD1P0.2/AD2P0.3/AD3P0.4/AD4P0.5/AD5P0.6/AD6P0.7/AD7P2.0/A8P2.1/A9P2.2/A10P2.3/A11P2.4/A12P2.5/A13P2.6/A14P2.7/A15P3.0/RXDP3.1/TXDP3.2/INT0P3.3/INT1P3.4/T0P3.5/T1P3.6/WRP3.7/RD39383736353433322122232425262728101112131415161718XTAL29RST234567123+12V+12v计数值设定DSW1161514131211109OFFON293031PSENALEEAVCCRL112V电机急停1234567812345678R1100P1.0P1.1P1.2P1.3P1.4P1.5P1.6P1.7ATC51U21652VCC4OPTOCOUPLER-NPNR310kD11N4001R22kQ5NPNDIPSW_8计数R410kU1(P3.4/T0)重启动R55k 2.2 LED显示模块
使用4位LED数码管来显示数字,通过NPN管来驱动数码管。
3
LCD1LM016LVSSVDDVEERSRWE45612371011121314D0D1D2D3D4D5D6D7 2.3 置数模块 使用8位薄码盘和5位薄码盘组合来组成最高13位的二进制数,即8191的最大置数值,很好的利用了4位数码管。 VCC计数值设定DSW1161514131211109OFFON12345678U21652VCC4OPTOCOUPLER-NPNDIPSW_8 3 软件系统设计
4
3.1 软件系统的流程结构
3.2 C51程序
/*-----------------------------------------------------------
文件名:lcd1602.h头文件
功能:LCD1602驱动函数的声明
5
-----------------------------------------------------------*/
#ifndef _LCD1602_H_
#define _LCD1602_H_
#include #define uint unsigned int #define uchar unsigned char //接口定义 sbit LcdRs = P2^0; sbit LcdRw = P2^1; sbit LcdEn = P2^2; sfr DBPort = 0x80; //P0口为LCD数据总线 /*----------------------------------------------------------- 功能:LCD初始化函数 6 -----------------------------------------------------------*/ void LCD_Initial(); /*----------------------------------------------------------- 功能:LCD显示字符(ASIIC码)函数 参数:x-列0~15;y-行0~1;str-要显示的字符串指针 -----------------------------------------------------------*/ void LCD_Prints(uchar x, uchar y,uchar *str);#endif /*----------------------------------------------------------- 文件名:lcd1602.c 函数功能:LCD1602的驱动函数 原理:采用普通IO口方式模拟LCD1602时序,未采用总线方式 -----------------------------------------------------------*/ #include 7 #include #include \"lcd1602.h\" /*----------------------------------------------------------- 功能:内部等待函数 返回参数:P0数据 -----------------------------------------------------------*/ uchar LCD_Wait(void) {LcdRs=0; LcdRw=1; _nop_(); LcdEn=1; _nop_(); //while(DBPort&0x80); /* 在用Proteus仿真时,屏蔽此语句,否则会进入死循环, 实际硬件操作时打开此语句.*/ 8 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; 9 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 //显示光标 10 #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 // 画面不可平移 11 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-列0~15;y-行0~1; 12 -----------------------------------------------------------*/ 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 13 #define uint unsigned int uchar out[6]; sbit STAR_KEY =P3^2;//定义键与单片机的连接引脚 sbit L0=P1^0; //定义SFR中引脚的位 sbit L1=P1^1; sbit L2=P1^2; sbit L3=P1^3; sbit L4=P1^4; sbit L5=P1^5; sbit L6=P1^6; sbit L7=P1^7; sbit MOTOR=P3^0; uchar n[2]={1,0}; 14 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)n[0]=0;n[1]=1;} n[0]=0;n[1]=1return n[1]; //返回n值} void xianshi(uint dispbuf) //显示子程序 {out[0]=dispbuf/10000+0x30; out[1]=((dispbuf%10000)/1000)+0x30; out[2]=((dispbuf%1000)/100)+0x30; out[3]=((dispbuf%100)/10)+0x30; 15 //按下STAR键则 out[4]=dispbuf%10+0x30; out[5]='\\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; 16 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; 17 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=n[1];} //当电动机关闭时显示用薄码盘所置的数并停止计数,电机启动时则开始计数,并显示计数值 18 if (TL0==q) {TR0=0;MOTOR=1;} else {Keynum();MOTOR=n[0];} }} //当计数值与所置数相同时关闭电机,停止计数,当计数值不等时则将电机启动与关闭交由按键控制,所以不存在计数值超过置数值的情况 void Int0(void) interrupt 0 //中断服务程序,工作寄存器用0组 { TL0=0;TR0=1; }//重置计数值,重新开始计数 4 仿真及调试 LCD1LM016LVCCRV11kVSSVDDVEERSRWE456D0D1D2D3D4D5D6D771011121314RP110*8VCC1U119XTAL1P0.0/AD0P0.1/AD1P0.2/AD2P0.3/AD3P0.4/AD4P0.5/AD5P0.6/AD6P0.7/AD7P2.0/A8P2.1/A9P2.2/A10P2.3/A11P2.4/A12P2.5/A13P2.6/A14P2.7/A15P3.0/RXDP3.1/TXDP3.2/INT0P3.3/INT1P3.4/T0P3.5/T1P3.6/WRP3.7/RD39383736353433322122232425262728101112131415161718XTAL29RST234567123+12V+12v计数值设定DSW1161514131211109OFFON293031PSENALEEAVCCRL112V电机急停1234567812345678R1100P1.0P1.1P1.2P1.3P1.4P1.5P1.6P1.7ATC51U21652VCC4OPTOCOUPLER-NPNR310kD11N4001R22kQ5NPNDIPSW_8计数R410kU1(P3.4/T0)重启动R55k 5 总论 整个设计通过了软件和硬件上的调试....................... 19 20 参 考 文 献 [1]胡汉才.单片机原理及接口技术[M].北京:清华大学出版社.1996. [2]张毅刚.MCS-51单片机应用设计[M].哈尔滨:哈尔滨工业大学出版社,1997. .................................................................... 21 致 谢 ............................................................................ 22 因篇幅问题不能全部显示,请点此查看更多更全内容
Copyright © 2019- howto234.com 版权所有 湘ICP备2022005869号-3
违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务