这两年开始毕业设计和毕业答辩的要求和难度不断提升,传统的毕设题目缺少创新和亮点,往往达不到毕业答辩的要求,这两年不断有学弟学妹告诉学长自己做的项目系统达不到老师的要求。
为了大家能够顺利以及最少的精力通过毕设,学长分享优质毕业设计项目,今天要分享的是
毕业设计 单片机的自动售货机设计与实现(源码+硬件+论文)
学长这里给一个题目综合评分(每项满分5分)
项目分享:
https://gitee.com/sinonfin/sharing
主要功能: 一款自动售货机设计,能够实现自动售货功能,使用STC89C52RC单片机做控制,LCD12864做显示,按键做货物的选择,步进电机做出货口的控制,蜂鸣器做报警提示。当选择好货物后,会提示投币付款,付款成功后,蜂鸣器会响一声,并伴随着电机转动,自动出货。
1.使用STC89C52RC单片机做主控制器件。
2.使用LCD12864做显示屏,12864可显示汉字、数字、字母等。显示屏显示欢迎界面、货物信息等。
3.使用按键做货物选择、投币、确实、返回等选择。
4.使用步进电机做出货口的控制,出货完成后,步进电机自动归位。
5.使用蜂鸣器做报警提示,当付款完成后,蜂鸣器会自动响一下,伴随电机转动,自动出货。
PCB图
仿真效果
在程序层次结构方面,当系统上电之后,应先对其进行相关初始化(如对每种饮料价格的设定和商品原始库存数量的设定等)。然后程序应当进入无限循环,再根据相应的触发条件进入相应的子程序,完成相应的状态下的工作。由于系统在多个状态间跳转切换,所以在程序编写时比较适合应用循环结构实现。自动售货机工作的整个流程图如图
关键代码
main()
{
TMOD=0x01; //T0 工作在方式1 16位计数器
TH0=(65536-50000)/256; //预先 设定定时器 初值,50毫秒
TL0=(65536-50000)%256;
EA=1; //开启 总中断
ET0=1; //开启定时器 0 中断
TR0=1; //定时器 0 启动计数
init_lcd();
clrram_lcd();
while(1)
{
show();
key();
}
}
void time0(void) interrupt 1
{
TH0=(65536-50000)/256; //重新设置定时器 初值,产生50MS定时中断
TL0=(65536-50000)%256;
count++; //50ms太短,闪烁频率太快
if(count==10)
{
if(n==0)
{
// Time[0]=m%1000/100+'0';
Time[0]=m/10+'0';
Time[1]=m%10+'0';
Time[2]='\0';
Time[3]='\0';
}
if(n==1)
{
if(money<=900)
{Time[0]=money/100+'0';
Time[1]=money%100/10+'0';
Time[2]='.';
Time[3]=money%10+'0';
}
else {money=900;
Time[0]=money/100+'0';
Time[1]=money%100/10+'0';
Time[2]='.';
Time[3]=money%10+'0';
}
}
Time[4]='\0';
Time[5]='\0';
count=0;
//if(m==0)m=30;
n++;
if(n==2 && m > 0)
{
if(m==6)beep=0;
if(m==5)beep=1;
m--;
n=0;
}
nn++;
if(nn==20)
{
nn=0;
}
}
}
4、液晶显示主程序模块
void show()
{
if(nn<10)
{
gotoxy(1,0);
print("按键选择货物:");
mdelay(10);
gotoxy(2,0);
print("①矿泉水(1.5元)");
mdelay(10); //扫描延时
gotoxy(3,0);
print("②红茶(3元) ");
mdelay(10); //扫描延时
gotoxy(4,0);
print("③绿茶(4元)");
mdelay(10); //扫描延时
}
if(nn==10)clrram_lcd ();
if(nn>=11)
{
gotoxy(1,0);
print("④啤酒(5元)");
mdelay(10) ;
gotoxy(2,0);
print("⑤红牛(6元)");
mdelay(10); //扫描延时
gotoxy(3,0);
print("选定后投入硬币");
mdelay(10); //扫描延时
}
}
包含内容
项目分享:
https://gitee.com/sinonfin/sharing