嵌入式系统设计课程设计任务书值班防睡讲解.docx
《嵌入式系统设计课程设计任务书值班防睡讲解.docx》由会员分享,可在线阅读,更多相关《嵌入式系统设计课程设计任务书值班防睡讲解.docx(22页珍藏版)》请在冰豆网上搜索。
嵌入式系统设计课程设计任务书值班防睡讲解
课程设计(论文)任务书
信息工程学院信息工程专业******
一、课程设计(论文)题目题目七-夜班防睡控制/记录器
二、课程设计(论文)工作自2013年6月8日起至2013年6月16日止。
三、课程设计(论文)地点:
5-402单片机实验室
四、课程设计(论文)内容要求:
1.本课程设计的目的
(1)使学生掌握单片机各功能模块的基本工作原理;
(2)培养学生单片机应用系统的设计能力;
(3)使学生能够较熟练地使用proteus工具完成单片机系统仿真。
(4)培养学生分析、解决问题的能力;
(5)提高学生的科技论文写作能力。
2.课程设计的任务及要求
1)基本要求:
(1)分析所设计系统中各功能模块的工作原理;
(2)选用合适的器件(芯片);
(3)提出系统的设计方案(要有系统电路原理图);
(4)对所设计系统进行调试。
2)创新要求:
在基本要求达到后,可进行创新设计,如改善单片机应用系统的性能。
3)课程设计论文编写要求
(1)要按照书稿的规格打印撰写论文。
(2)论文包括目录(自动生成)、摘要、正文、小结、参考文献、附录等。
(3)论文装订按学校的统一要求完成。
4)答辩与评分标准:
(1)完成原理分析:
20分;
(2)完成设计过程:
30分;
(3)完成调试:
20分;
(4)回答问题:
20分;
(5)格式规范性(10分)。
5)参考文献:
(1)董.《》某出版社
(2)张.《》某出版社
(3)http:
//某网址/
6)课程设计进度安排
内容天数地点
构思及收集资料1图书馆
系统设计与调试4实验室
撰写论文2图书馆、实验室
学生签名:
******
2013年6月8日
课程设计(论文)评审意见
(1)完成原理分析(20分):
优()、良()、中()、一般()、差();
(2)设计分析(30分):
优()、良()、中()、一般()、差();
(3)完成调试(20分):
优()、良()、中()、一般()、差();
(4)回答问题(20分):
优()、良()、中()、一般()、差();
(5)格式规范性(10分):
优()、良()、中()、一般()、差();
评阅人:
职称:
2013年6月16日
摘要
本课程设计是利用单片机原理知识设计一个夜班防睡控制/记录器,能够在设定的时间内对夜间值班者进行防睡眠响铃提示。
在值班期间,防睡控制/记录器每隔10秒钟会用较柔和的声音提醒一次值班者,同时绿灯亮起,值班者按下5键后复位,计时重新开始,绿灯熄灭。
若计到13s时无人按复位键,则以较急促的声音报警,黄灯闪烁,并每隔10s继续以较急促的声音报警,黄灯闪烁。
若一直无人到按下5键复位,当计时60s时红灯闪烁,并以尖锐的声音持续报警30s。
同时记录下这个时刻。
管理者可以查看值班记录情况,每按下一次键9,1602液晶会以时、分、秒格式显示出一个值班记录。
本课设涉及到的知识点主要有单片机的定时器的应用、矩阵键盘的使用、1602液晶显示模块的使用、利用74HC595移位寄存器实现8位数码管的显示、proteus仿真软件的使用等软硬件知识。
正文
题目七:
夜班防睡控制/记录器
一、实验目的
利用所学单片机的理论知识进行软硬件整体设计,锻炼学生理论联系实际、综合应用的能力。
二、设计内容
在单片机系统上实现对值夜班人员的防止睡觉控制和记录睡着时间与次数的功能。
三、设备和器材
计算机、YL-32开发板、LED数码管8只,1602液晶显示模块、发光二极管3只(红、黄、绿各一只)。
其他器件任选。
四、设计要求
1、设计接口电路,将这些外设构成一个简单的单片机应用系统,画出接口的连接图。
2、编写下列控制程序
1)每10s用较柔和的声音提醒一次值班者,绿灯D2亮起,值班者按B5键后复位,计时重新开始,绿灯D2熄灭。
2)若计到13s时无人按复位键B5,则以较急促的声音报警,黄灯D3闪烁,并每隔10s继续以较急促的声音报警,黄灯D3闪烁。
3)当到60s时红灯D4闪烁,并以尖锐的声音持续报警。
则记录下这个时刻,以便管理者查看。
按下B9键会以液晶1602显示值班情况。
显示格式:
时、分、秒。
4)按下B6键、B7键可以设定8位数码管的时和分,B8键可以清零时钟。
五、系统电路原理图
5.1单片机89C52电路原理图
5.2红绿黄三只指示灯原理图
5.3矩阵按键原理图
5.48位数码管原理图
利用74HC595移位寄存器来实现数码管的显示,它占用单片机的IO口少,具有锁存功能,而且控制也是相当的容易。
5.5液晶1602显示原理图
六、程序流程图
七、proteus仿真
6.1仿真电路图
6.2proteus仿真结果
小结
因为夜班防睡的重点在于响铃提示值班者及记录值班者的值班信息。
设计本课设的难点和重点在于如何确定时间的正确性,如何确定值班者是否按下复位键及根据按下键值来做出相应的响应,做到实时的响应效果。
要确定值班者是否按下复位键就要设定一个复位标识,以此来明确值班者按下复位键的情况,之后根据此标志来做出响铃和亮灯等动作。
其中蜂鸣器的响铃时间是根据延时长短来区分的,这就要花费些时间调试好适合的延时时间,这样才能得到不同铃声的区分。
通过这次的夜班防睡/记录器的设计和现实,进一步的了解和明白了单片机的工作原理,单片机的资源有限,需要充分合理的利用好各个资源,控制好各I/O空,只有这样才能更好的利用单片机实现更多的功能。
此外,亦学会了如何读取矩阵键盘的键值,学会了利用数码管制作时钟电路,学会了控制液晶1602的显示。
虽然数码管的控制有许多种方式,但限于单片机的资源问题,个人认为利用74HC595移位寄存器来实现数码管的显示是一种不错的选择,因为它占用单片机的IO口少,具有锁存功能,而且控制也是相当的容易。
参考文献
1.张齐、朱宁西、必盛编著《单片机原理与嵌入式系统设计》-电子工业出版社
2.晁阳编著《单片机MCS-51原理及应用开发教程》-清华大学出版社
3.领翔电子-《YL-3251+AVR单片机开发板使用说明》
4.郭天祥-《新概念51单片机C语言教程+入门、提高、开发》-电子工业出版社
5.李丽娟-《C语言教程》-人民邮电出版社
6.
附录C程序代码
#include
#defineucharunsignedchar
#defineuintunsignedint
sbitbuzzer=P1^0;
sbitled_green=P1^1;//green
sbitled_yellow=P1^2;//yellow
sbitled_red=P1^3;///red
sbitled6=P1^6;
sbitled7=P1^7;//程序运行指示灯
sbitkey1=P3^2;//值班人按下的复位键
sbitkey2=P3^3;//时钟设置键:
按下一下,分+1
sbitkey3=P3^4;//时钟设置键:
按下一次,时+1
sbitkey4=P3^5;//时钟复位键
sbitMOSIO=P2^2;//74HC5956移位寄存器的数据线端
sbitR_CLKa=P2^3;//输出存储器锁存时钟线
sbitS_CLKa=P2^4;//数据输入时钟线
//***lcd部分****
sbitWR_lcd=P2^5;//lcd写允许管脚
sbitRS_lcd=P2^6;//lcd寄存器选择管脚
sbitEN_lcd=P2^7;//lcd使能端
voidinit_lcd(void);//lcd初始化函数
voidwrite_com(unsignedchar);//lcd写指令函数
voidwrite_data(unsignedchar);//lcd写数据函数
voidlcdshow(void);
charctable[]={"record:
"};
ucharcounter=0;//定时器步进
ucharhour=0,minute=0,second,m;
ucharr_hour[10],r_min[10],r_sec[10],record;//用于保存记录值
unsignedcharr=0;//记录按键次数
ucharclearFlag;//标志是否已按下复位键
ucharkeyRC;//矩阵键盘按下的按键
unsignedinti=0;
uchartimer0h,timer0l,time;
unsignedinttiptime=0;//提示时间
voidinit(void);
voiddelay500(void);
voiddelay1ms(unsignedint);
voidshowtime(void);//数码管显示时间
voidsdata(void);//数据到寄存器
voidout(void);//数码管输出
voidbcon(void);//矩阵键盘
//数码管显示表
unsignedcharcodefseg[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
unsignedcharcodesegbit[]={0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01};
unsignedchardisbuf[8]={0,0,0,0,0,0,0,0};
voidmain(void)
{ucharj;delay1ms
(2);//等待硬件完成启动
init();init_lcd();//初始化lcd
while
(1)
{showtime();
if(tiptime==10)//10s提示响铃,绿灯亮D2
{led_green=0;
for(i=0;i<20;i++)
{buzzer=~buzzer;delay1ms
(1);}
clearFlag=1;//置响铃标志}
if(clearFlag==1)
{if(tiptime%13==0)//每20s后响鸣,黄灯闪烁D3
{for(i=0;i<20;i++)
{for(j=0;j<50;j++)
{buzzer=~buzzer;delay500();}
led_yellow=~led_yellow;
delay1ms(50);}
led_yellow=0;}
elseif(tiptime==60)//60s后急促警鸣,红灯闪烁D4
{tiptime++;//消去程序运行影响
r_hour[record]=hour;
r_min[record]=minute;
r_sec[record]=second;
for(i=0;i<300;i++)
{for(j=0;j<20;j++)
{buzzer=~buzzer;
delay500();}
led_red=~led_red;
delay1ms(50);
}
led_red=0;
record++;
if(record==10)
{record=0;}
}
}
led7=~led7;//程序运行指示灯D8
}
}
voidinit(void)
{TMOD=0x10;//定时器工作方式
TH1=0xd8;TL1=0xf0;//初值10ms
ET1=1;EA=1;//系统中断
TR1=1;//启动定时器
}
//数码管显示时间
voidshowtime()
{bcon();
sdata();
out();
}
/***函数功能:
键盘控制*/
voidbcon(void)
{ucharrow=0,column=0,temp,tempR,tempC=0;
tempR=0x10;delay500();
P3=0x0f;
temp=P3;
temp=temp&0x0f;
if(temp!
=0x0f)//有按键按下
{delay500();//延时约1ms
P3=0x0f;
temp=P3;
temp=temp&0x0f;
tempR=temp;
P3=0xf7;//第四行
temp=P3;
temp=temp&0xf0;
if(temp!
=0xf0)//有按键按下
{delay1ms
(1);
P3=0xf7;
temp=P3;
temp=temp&0xf0;
if(temp!
=0xf0)
{keyRC=temp|0x07;}
}else
{P3=0xfb;//第三行
temp=P3;
temp=temp&0xf0;
if(temp!
=0xf0)//有按键按下
{delay1ms
(1);
P3=0xfb;
temp=P3;
temp=temp&0xf0;
if(temp!
=0xf0)
{keyRC=temp|0x0b;}
}
else{P3=0xfd;//第二行
temp=P3;
temp=temp&0xf0;
if(temp!
=0xf0)//有按键按下
{delay1ms
(1);
P3=0xfd;
temp=P3;
temp=temp&0xf0;
if(temp!
=0xf0)
{keyRC=temp|0x0d;}
}
else{P3=0xfe;//第一行
temp=P3;
temp=temp&0xf0;
if(temp!
=0xf0)//有按键按下
{delay1ms
(1);
P3=0xfe;
temp=P3;
temp=temp&0xf0;
if(temp!
=0xf0)
{keyRC=temp|0x0e;}
}
}
}
}
}
//按下键后的操作
if(keyRC==0xed)//值班人按下复位键,键5
{keyRC=0;//按键清零
tiptime=0;//计时复位
clearFlag=0;//清楚响铃标志
led_green=1;led_red=1;led_yellow=1;
while((P3&0xf0)!
=0xf0);//按键按着不放}
elseif(keyRC==0xdd)//键6
{keyRC=0;//按键清零
minute++;//分累加1
if(minute==60)
{minute=0;}
while((P3&0xf0)!
=0xf0);//按键按着不放
}
elseif(keyRC==0xbd)//键7
{keyRC=0;//按键清零
hour++;//时累加1
if(hour==24)
{hour=0;}
while((P3&0xf0)!
=0xf0);}
elseif(keyRC==0x7d)//数码管时钟清零,键8
{keyRC=0;//按键清零
second=0;//清零
minute=0;
hour=0;
while((P3&0xf0)!
=0xf0);
}
elseif(keyRC==0xeb)//键9,查看记录
{keyRC=0;//按键清零
lcdshow();
while((P3&0xf0)!
=0xf0);
}
disbuf[0]=second%10;
disbuf[1]=second/10;
disbuf[3]=minute%10;
disbuf[4]=minute/10;
disbuf[6]=hour%10;
disbuf[7]=hour/10;
}
/****函数名称:
sdata(void)函数功能:
数据传输*/
voidsdata(void)
{unsignedcharb,c,num;
if(b==0)
{b++;
num=segbit[m];//位数码管的选择
for(c=0;c<8;c++)
{S_CLKa=0;
MOSIO=num&0x80;
num<<=1;
S_CLKa=1;}
}
if(b==1)
{b--;
if(m==2||m==5)
{num=0xbf;}//2和5显示'-'
else
{num=fseg[disbuf[m]];}//数码管显示的值
for(c=0;c<8;c++)
{S_CLKa=0;
MOSIO=num&0x80;
num<<=1;
S_CLKa=1;
}
}
m++;
if(m==8)
{m=0;}
}
/********函数名称:
out(void)函数功能:
数据输出********/
voidout(void)
{R_CLKa=0;//输出存储器锁存时钟线
delay1ms
(1);
R_CLKa=1;
}
//定时器1定时10ms,晶振11.0592MHz
voidtimer1(void)interrupt3
{EA=0;
TR1=0;
TH1=0xD8;
TL1=0xF0;
counter++;
if(counter==100)//1秒钟
{counter=0;
second++;
tiptime++;
}
elseif(second==60)//1分钟
{second=0;minute++;}
elseif(minute==60)//1小时
{minute=0;hour++;}
elseif(hour==24){hour=0;}
TR1=1;
EA=1;
}
voidlcdshow()//lcd显示
{unsignedchark=0;
for(k=0;k<7;k++)
{write_com(0x80+k);//AC第一行
write_data(ctable[k]);//字符表
}
if(r{k=0;
write_com(0x80+0x40+k);//AC第二行
write_data(r+1+0x30);k++;//编号并转为ASCII码值
write_com(0x80+0x40+k);
write_data(':
');k++;
write_com(0x80+0x40+k);
write_data(r_hour[r]/10+0x30);k++;//显示时
write_com(0x80+0x40+k);
write_data(r_hour[r]%10+0x30);k++;
write_com(0x80+0x40+k);
write_data(':
');k++;
write_com(0x80+0x40+k);
write_data(r_min[r]/10+0x30);k++;//显示分
write_com(0x80+0x40+k);
write_data(r_min[r]%10+0x30);k++;
write_com(0x80+0x40+k);
write_data(':
');k++;
write_com(0x80+0x40+k);
write_data(r_sec[r]/10+0x30);k++;//显示秒
write_com(0x80+0x40+k);
write_data(r_sec[r]%10+0x30);r++;
if(r==record){r=0;}
}
}
voidinit_lcd(void)//lcd初始化函数
{WR_lcd=0;//本程序只写数据或命令
write_com(0x06);//输入方式,AC++、画面不移动
write_com(0x0c);//显示设置,显示开、光标关、不闪烁
write_com(0x38);//功能设置,8位、2行、5*7
}
voidwrite_com(unsignedcharcom)//lcd写命令函数
{RS_lcd=0;
P0=com;
delay500();
EN_lcd=1;
delay500();
EN_lcd=0;
}
voidwrite_data(unsignedcharlcd_data)//lcd写数据函数
{RS_lcd=1;
P0=lcd_data;
delay500();
EN_lcd=1;
delay500();
EN_lcd=0;
delay500();
}
voiddelay500(void)/*****500us延时函数晶振:
11.0592MHz****