找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4902|回复: 0
打印 上一主题 下一主题
收起左侧

51单片机传送带产品计数器程序设计

[复制链接]
跳转到指定楼层
楼主
ID:559602 发表于 2019-6-11 09:07 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
电路原理图的设计
2
.1  传送带产品计数器设计的电路原理图

2.2LCD显示模块[11]


   


2.3计数模块  


2.4 键盘模块
3
  软件系统设计
3.1  软件系统的流程结构

3.2 LCD显示程序模块
/*-----------------------------------------------------------
文件名:lcd1602.h头文件            
功能:LCD1602驱动函数的声明
-----------------------------------------------------------*/
#ifndef _LCD1602_H_
#define _LCD1602_H_
#include <reg52.h>
#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 <REG52.H>
#include <intrins.h>    //次头文件中定义有_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<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;}              //按下STAR键则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;}
                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  仿真及调试

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏3 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表