附件1
南华大学
微型计算机控制技术课程设计
设计题目 饮料瓶计数系统
学生姓名 刘明星
专业班级 自动化1002班
学 号 20104460222
指导老师
目录
1 设计的目的与意义
2 控制系统工艺流程及控制要求
3 总体设计方案
4 软硬件设计
5 课程设计实验(仿真部分)
6 调试或仿真过程中遇到的具体问题和解决办法
7 收获和体会
8 参考文献
1设计目的与意义 中国饮料市场已成为中国食品行业中发展最快的市场之一,我国饮料企业成本、区位优势明显,同时也存在技术落后,创新力不足,企业产品单一,国际贸易能力差等问题。我国人民生活水平的快速发展给饮料企业带来了更加广阔的市场,饮料企业应该加快技术升级和规模扩展以应对来自外资企业的竞争。饮料瓶计数技术系统是一种较为先进的控制技术,能够解放劳动生产力,提高计数的准确度,加快生产,降低成本。
2控制系统工艺流程及控制要求基本要求:(1)对通过计数传感器的饮料瓶数目进行计数显示,当饮料瓶计数器达到9590-9600时,发出溢出报警信号,计满后系统暂停。(2)每24瓶装满一箱,显示包装好的饮料的箱数;(3)每20箱重新启动;(4)系统暂停10分钟后重新启动;(5)记录系统重新启动的次数;(6)记录时间。
3总体设计方案3.1计数传感器的选择 根据流水线的工作实际情况,应该采用光电计数传感器,光电计数器是通过红外线发射和接收进行计数,有直射式和反射式两种,通常用于流水线的工件一车,显示包装好的饮料的车数,同时发出报警信号,显示可以装车;拓展部分(1)系统暂停10分钟后计数。直射式的发射、接收分体,发射器和接收器分别置于流水线两边,中间没有阻挡时发射器的红外线射到接收器,接收器接收到发射来的红外线,经反相处理使之没有信号输出,有工件经过时挡住光路,接收器失去红外线信号便输出一个脉冲信号到运算累加器进行计数;反射式是发射、接收同体,置于流水线一边,前面流水线上没有东西时,发射器发出的红外线直接射出没有反射,接收器没有接收到反射来的红外线信号没有输出,有工件经过时挡住光路使发射器发出的红外线信号反射到接收器,接收器接收到反射来的红外线信号便输出一个脉冲信号到运算累加器进行计数。根据实际情况来选用直射式或者反射式,总之检测到一个信号,就产生一个脉冲,从而对饮料瓶进行计数。仿真时,可以用信号发生器代替即可。 对光电计数器接受的到脉冲信号,进行滤波等处理如图所示(3接输入)3.2显示器与警报装置 显示器选用1602其接线图如下 警报器装置线路图如下3.3控制系统主机可选用单片机电路 本系统的控制主机选用单片机控制,对记录的饮料瓶数进行处理,外接有显示器,报警电路,输入模块,开关,复位电路,电源等3.4控制系统软件 控制系统软件主要包括采样、计数、控制计算、控制输出、中断、计时、显示、报警等功能。
4软硬件设计4.1系统硬件设计 根据系统的总体方案,可以画出控制系统的组成框图如下
图中P1是串口,R5是上拉电阻4.2软件设计 软件设计要求:用1602显示记录数据和时间,上一行显示瓶数A,箱数B,下一行显示车数C,重启次数D。然后在达到一车报警LCD闪烁,箱数达到9590报警SPK响起,达到9600时系统停止,10分钟后重新启动,并记录重启次数D。具体程序:#include
#include
#define uchar unsigned char
#define uint unsigned int
sbit E=P2^3;
sbit RW=P2^4;
sbit RS=P2^5;
sbit SPK=P1^2;
sbit LED=P1^3;
uint a,b,c,d,i;
void delay_ms(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}//毫秒延时
void delay_m(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=60;y>0;y--)
delay_ms(1000);
}//分钟延时
void writeCom (uchar com)
{
RS = 0; //将RS拉低,表示命令
RW = 0; //将RW拉低,表示写操作
E = 1; //芯片使能
P0=com;
delay_ms(1);
E = 0;
}//写入命令函数
void writeData (uchar Data)
{
RS = 1;//将RS拉高,表示数据
RW = 0;//写操作
E = 1;
P0=Data;
delay_ms(1);
E = 0;
}//写入数据函数
void showChar (uchar pos,uchar c)
{
uchar p;
if (pos >= 0x10)
p = pos + 0xb0; //是第二行则命令代码高4位为0xc
else
p = pos + 0x80; //是第一行则命令代码高4位为0x8
writeCom(p);//写命令
writeData(c); //写数据
}//显示字符函数
void showString (uchar line,char *ptr)
{
uchar l,i;
l = line << 4;
for (i = 0; i < 16; i++)
showChar(l++, *(ptr + i)); //循环显示16个字符
}//显示字符串函数
void writeMetre1(uchar add, int date)
{
char qian,bai,shi, ge;
qian=date/1000;
bai=date%1000/100;
shi=date%100/10;
ge=date%10;
writeCom(0x80+add);
writeData(0x30 + qian);
writeData(0x30 + bai);
writeData(0x30 + shi);
writeData(0x30 + ge);
}//在第一行指定位置写入数据
void writeMetre2(uchar add, int date)
{
char qian,bai,shi, ge;
qian=date/1000;
bai=date%1000/100;
shi=date%100/10;
ge=date%10;
writeCom(0x80+0x40+add);
writeData(0x30 + qian);
writeData(0x30 + bai);
writeData(0x30 + shi);
writeData(0x30 + ge);
}//在第二行指定位置写入数据
void initin(void)
{
a=b=c=d=0;
}//初始化输入值
void initLCD (void)
{
writeCom(0x38); //display mode
writeCom(0x06); //显示光标移动位置
writeCom(0x0C); //显示开及光标设置
writeCom(0x01); //显示清屏
delay_ms(5);
showString(0,"A=0000 B=0000 ");
showString(1,"C=0000 D=0000 ");
}//初始化1602函数
void init51 (void)
{
EX0=1;//开外部中断0
IT0=1;//外部中断0为下降沿触发
SPK=1;//关蜂鸣器
LED=1;//关LED灯
EA=1;//开总中断
}//初始化51
void main()
{
init51 ();
initLCD ();
initin();
while(1){
if(i==0&&b!=0)
{
LED=0;
delay_ms(1000);
LED=1;
}
if(a>9590)
{
SPK=0;//溢出报警
delay_ms(5);
}
}
if(a>=9600)
{
SPK=1;
a=b=c=0;
d++;
delay_m(10);*/
}
}
void count() interrupt 0 // using 1
{
EX0=0;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
a++;
b=a/24;
c=b/20;
i=b%20;
writeMetre1(2, a);//写入瓶数
writeMetre1(10, b);//写入箱数
writeMetre2(2, c);//写入车数
writeMetre2(10, d);//写入重启次
if(i==0&&b!=0)
{
LED=0;
delay_ms(100);
LED=1;
}
if(a>9590)
{
SPK=0;//溢出报警
delay_ms(5);
}
if(a>=9600)
{
SPK=1;
a=0;
d++;
delay_m(10);
}
EX0=1;
}
5课程设计实验(仿真部分)
计数过程中
等待重启过程
用脉冲信号代替计数传感器,频率范围在1~100都可较好地实现计数功能,其中A表示瓶数,B表示箱数,C表示车数,D表示重启次数,R7左边的按键可实现整个系统重启,
6调试或仿真过程中遇到的具体问题和解决的办法
6.1 1602液晶无显示
在仿真运行程序后,1602液晶没有显示,程序人在运行,原因是在写数据函数里没有加入数字0的ASCII码值,解决办法将writeData(qian)改为writeData(0x30 + qian)就可以了显示初始化的值了
6.2 1602液晶无动态显示
在仿真运行程序后,1602液晶有显示,但只是显示初始化的值A=0000 B=0000 C=0000 D=0000 ,外部中断0输入有值,但是1602不更新,后者有时候一下子跳到很高的一个值,跟输入不一致,解决办法,将1602液晶处理程序和显示程序都放到外部中断0的程序里面进行处理,1602液晶才开始有跟输入一致的更新显示
6.2 在输入频率为一定的情况下1602液晶跟输入显示不跟濒临相同
在仿真运行程序后,每次变化瓶数A都加25左右,改用按钮控制,每按一次,显示瓶数A变化8左右,长按按钮,瓶数A一直增加,,不按不加,解决办法,外部中断0的触发方式错了,将IT0=1,即可实现一比一变化。
7收获和体会
本设计的目的主要是实现饮料瓶计数功能,能够很好地运用在一些大型饮料生产工厂中,可以大大地减少人员的工作量和人数,可以降低工厂生产成本,本设计还可以在重启过程中,利用一个控制流水线工作停止的数据,控制流水线的停止,更加完善了该系统,通过本次设计,学到了很多东西,首先就是51单片机的一些硬件的基本知识,还有51单片机的一些简单功能,学会了用C51编程,也学会了用KILE软件编程,仿真,通过对程序的一些调试,我也学会了一些基本的调试方法,通过实践,能够更加巩固前面学过的一些课本知识,更加深入理解,也深感自己的不足,在实验过程中遇到很多问题,通过翻阅书籍,自己去尝试,以及同学们的帮忙,都得到解决了,也让我发现了做设计的兴致所在。
8参考文献
[1]、于海生,丁军航,潘松峰,吴贺荣编著,微型计算机控制技术(第2版),清华大学出版社出版;
[2]、郭天祥 编著,51单片机C 语言教程,电子工业出版社出版;
[3]、康华光,邹寿彬,秦臻编著,电子技术基础数字部分(第五版),高等教育出版社出版;
[4]、康华光,陈大钦,张林编著,电子技术基础模拟部分(第五版),高等教育出版社出版;
[5]、张友德,赵志英,涂时亮编著,单片微型机原理、应用与实验(第五版),复旦大学出版社出版
本文来源:https://www.2haoxitong.net/k/doc/316b16b90975f46526d3e151.html
文档为doc格式