附件1南华大学微型计算机控制技术课程设计设计题目饮料瓶计数系统学生姓名刘明星专业班级自动化1002班学号***********指导老师目录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<reg52.h>#include<intrins.h>#define uchar unsigned char#define uint unsigned intsbit 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 elsep = 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 modewriteCom(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;//开外部中断0IT0=1;//外部中断0为下降沿触发SPK=1;//关蜂鸣器LED=1;//关LED灯EA=1;//开总中断}//初始化51void 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软件编程,仿真,通过对程序的一些调试,我也学会了一些基本的调试方法,通过实践,能够更加巩固前面学过的一些课本知识,更加深入理解,也深感自己的不足,在实验过程中遇到很多问题,通过翻阅书籍,自己去尝试,以及同学们的帮忙,都得到解决了,也让我发现了做设计的兴致所在。