传送带产品计数器的设计(LCD)

目 录

1 题目 .................................................................. 1

2 电路原理图的设计 . ...................................................... 1

2.1 传送带产品计数器设计的电路原理图 ................................. 1

2.2 LCD显示模块 . ..................................................... 3

2.3 计数模块 ......................................................... 3

2.4 键盘模块 ......................................................... 3

3 软件系统设计 . .......................................................... 3

3.1 软件系统的流程结构 ............................................... 3

3.2 LCD显示程序模块 . ................................ 错误!未定义书签。

3.3 计数程序模块 .................................... 错误!未定义书签。

4 仿真及调试 . ............................................................ 7

5 总论 . .................................................................. 8

参 考 文 献 . .............................................................. 8

致 谢 . .................................................................. 9

1 题目

2 电路原理图的设计

2.1 传送带产品计数器设计的电路原理图

2.2 LCD显示模块[11] 图2.1 电路原理图

2.4 键盘模块

3 软件系统设计

3.1 软件系统的流程结构

3.2 LCD显示程序模块

/*-----------------------------------------------------------

文件名:lcd1602.h 头文件

功能:LCD1602驱动函数的声明

-----------------------------------------------------------*/

#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 初始化函数

-----------------------------------------------------------*/

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

#include //次头文件中定义有_nop_()函数

#include "lcd1602.h"

/*-----------------------------------------------------------

功能:内部等待函数

返回参数:P0数据

-----------------------------------------------------------*/

uchar LCD_Wait(void)

{LcdRs=0;

LcdRw=1; _nop_();

LcdEn=1; _nop_();

//while(DBPort&0x80);

/* 在用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-列0~15;y-行0~1;

-----------------------------------------------------------*/

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 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};

void delayms(uint x) //延时子程序

{uchar y;

while(x--){for(y=0;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;

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;

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;}

//按下STAR 键则

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=n[1];} //当电动机关闭时显示用薄码盘所置的数并停止计数,电机启动时则开始计数,并显示计数值 if (TL0==q) {TR0=0;MOTOR=1;} else {Keynum();MOTOR=n[0];} }}

//当计数值与所置数相同时关闭电机,停止计数,当计数值不等时则将电机启动与关闭交由按键控制,所以不存在计数值超过置数值的情况 void Int0(void) interrupt 0 //中断服务程序,工作寄存器用0组

{ TL0=0;TR0=1; }//重置计数值,重新开始计数

4 仿真及调试

5 总论 参 考 文 献

致 谢

9

目 录

1 题目 .................................................................. 1

2 电路原理图的设计 . ...................................................... 1

2.1 传送带产品计数器设计的电路原理图 ................................. 1

2.2 LCD显示模块 . ..................................................... 3

2.3 计数模块 ......................................................... 3

2.4 键盘模块 ......................................................... 3

3 软件系统设计 . .......................................................... 3

3.1 软件系统的流程结构 ............................................... 3

3.2 LCD显示程序模块 . ................................ 错误!未定义书签。

3.3 计数程序模块 .................................... 错误!未定义书签。

4 仿真及调试 . ............................................................ 7

5 总论 . .................................................................. 8

参 考 文 献 . .............................................................. 8

致 谢 . .................................................................. 9

1 题目

2 电路原理图的设计

2.1 传送带产品计数器设计的电路原理图

2.2 LCD显示模块[11] 图2.1 电路原理图

2.4 键盘模块

3 软件系统设计

3.1 软件系统的流程结构

3.2 LCD显示程序模块

/*-----------------------------------------------------------

文件名:lcd1602.h 头文件

功能:LCD1602驱动函数的声明

-----------------------------------------------------------*/

#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 初始化函数

-----------------------------------------------------------*/

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

#include //次头文件中定义有_nop_()函数

#include "lcd1602.h"

/*-----------------------------------------------------------

功能:内部等待函数

返回参数:P0数据

-----------------------------------------------------------*/

uchar LCD_Wait(void)

{LcdRs=0;

LcdRw=1; _nop_();

LcdEn=1; _nop_();

//while(DBPort&0x80);

/* 在用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-列0~15;y-行0~1;

-----------------------------------------------------------*/

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 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};

void delayms(uint x) //延时子程序

{uchar y;

while(x--){for(y=0;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;

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;

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;}

//按下STAR 键则

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=n[1];} //当电动机关闭时显示用薄码盘所置的数并停止计数,电机启动时则开始计数,并显示计数值 if (TL0==q) {TR0=0;MOTOR=1;} else {Keynum();MOTOR=n[0];} }}

//当计数值与所置数相同时关闭电机,停止计数,当计数值不等时则将电机启动与关闭交由按键控制,所以不存在计数值超过置数值的情况 void Int0(void) interrupt 0 //中断服务程序,工作寄存器用0组

{ TL0=0;TR0=1; }//重置计数值,重新开始计数

4 仿真及调试

5 总论 参 考 文 献

致 谢

9


相关内容

  • 电子综合设计总结报告
  • 电子综合设计总结报告 课题:多功能电子数字时钟 成员:岳雪凌.闫蕾芳.周天琪 二零一三年六月二十日 于单片机的万年历设计 摘 要 随着科技的快速发展,时间的流逝,从观太阳.摆钟到现在电子钟,人类不断研究,不断创新纪录.目前,单片机技术的应用产品已经走进了千家万户.电子万年历的出现给人们的生活带来了诸 ...

  • 毕业设计读书笔记
  • 读书笔记 笔记一 51系列单片机的基本结构 单片机的基本结构有中央处理器(CPU).程序存储器(ROM).数据存储器(RAM).并行I/O接口.定时器/计数器.中断系统等几大单元,以及地址总线和控制总线组成. 1.中央处理器(CPU) 中央处理器(CPU)是整个单片机的核心部件.CPU主要由控制器和 ...

  • 基于单片机的多功能数字时钟设计
  • 河南农业大学 本科生毕业论文(设计) 题 目:基于单片机的多功能数字时钟设计 学 院: 专业班级: 学生姓名: 指导教师: 完成日期:2014年5月20号 摘 要 本文介绍了多功能数字时钟[1]的系统设计.系统具有时间设置及显示.闹钟.报时的功能.系统采用AT89C51和时钟芯片DS1302,实现L ...

  • 嵌入式-课后答案---11页版本
  • 第1章 概述 1.嵌入式系统的基本含义是什么?为什么说单片机是典型的嵌入式系统? 一种计算机硬件和软件的组合,也许还有机械装置,用于实现一个特定功能. 在某些特定情况下,嵌入式系统是一个大系统或产品的一部分. MCU 的含义是:在一块芯片上集成了中央处理单元(CPU ).存储器(RAM/ROM等). ...

  • 基于蓝牙遥控的智能小车设计
  • 摘要 无线遥控的小车,可以在危险的环境作业,人员搜索,可以在 各类领域中发挥着它特殊的作用,本次设计是选择基于蓝牙遥控的多功能智能小车为对象.控制系统以C51单片机为主控芯片,采用L298N为电机驱动芯片.HC-06蓝牙无线模块.12864液晶显示模块.四路循迹模块等构成外围扩展电路.将自制的控制电 ...

  • 温度传感器电路
  • DS18B20温度传感器电路设计 默认分类 2010-06-29 12:08:49 阅读393 评论0 字号:大中 小 订阅 <单片机原理及应用>---项目设计 DS18B20温度传感器电路设计 一. 项目设计方案概述 温度是一种最基本的环境参数,人民的生活与环境的温度息息相关,在工业生 ...

  • 温度上下限可调报警器
  • 单片机课程设计 题 目: 专 业: 测控技术与仪器 姓 名: 学 号: 指导教师: 2015 年 1 月 6日 [内容摘要] 随着时代的进步和发展,单片机技术已经普及到我们生活,工作,科研,各个领域,已经成为一种比较成熟的技术, 单片机具有体积小.功耗低.控制功能强.扩展灵活.微型化和使用方便等优点 ...

  • 电子秒表课程设计报告
  • 电子信息工程专业10级学生单片机原理课程设计任务书 电子秒表的设计 一.设计要求 设计一个电子秒表,与通用秒表功能类似,有启动,暂停.复位等键.计时长长度为300秒,需显示百分秒. 二. 设计方案分析 1.方案设计 数字电子秒表具有显示直观.读取方便.精度高等优点,在计时中广泛使用.本设计用单片机组 ...

  • 光电计数器毕业论文
  • 合肥财经学院 毕业论文(实践)报告 系 别 工 程 学 院 专 业年 级 学 制 学 号 姓 名 2010 年 12 月 光电计数器设计 摘 要 本文所设计的计数器抗干扰性好,可靠性高.可用于测量商场.电影院.博物馆.展览观.车站.码头.银行等公共场所的人员数量及人员流通数量,同时丝毫不会侵犯到被测 ...