硬件课程设计报告.docx
《硬件课程设计报告.docx》由会员分享,可在线阅读,更多相关《硬件课程设计报告.docx(15页珍藏版)》请在冰豆网上搜索。
硬件课程设计报告
淮北师范大学
硬件课程设计
硬件课程设计报告
学院计算机科学与技术
专业计算机科学与技术(非师范)
学号2009120202020091202026
学生姓名胡冰山刘洵
指导教师姓名于雷
2011年10月8日
一、设计目的与内容:
1、熟悉整个电路图,练习一下焊接操作;
2、能够根据原理图焊接电路板,经过调试,保证整个电路板没有虚焊点;
3、熟练掌握C51的编程方法与技巧;
4、能够有效地控制LED、蜂鸣器和键盘的操作(可采用多种形式);
5、编写出一个电子钟,六个数码管每两个一组,分别显示小时、分钟和秒;
硬件设计要求:
1.根据项目要求,去选择相应的电路,比如MCU系统,输入输出驱动电路,电源供电电路。
2.整体布局合理,标注规范、明确、美观、不产生歧义。
3.列出完整的元件清单(标号、型号及大小、封装形式、数量)。
4.估算电路板的功耗,并对供电形式提出要求。
5.根据设计好的原理图,焊接实物。
软件设计要求:
1.简单的用户使用说明书。
2.根据项目要求,设计软件整体规划,人机对话,各模块的关联,底层驱动模块。
3.程序在必要的地方进行注释。
每个函数的出入口要有输入输出参数的说明。
程序必须具有良好的可读性,可重用,容易调试和维护。
4.使用c语言进行编程
二、实验原理:
1、LED灯的控制
由电路图可知,LED灯左侧阳极与电阻相连接高电平,右侧阴极与P1相连。
因此:
当P1为低电平(即P1=0)时,电路连通,LED灯亮,当P1为高电平时(即P1=1)时,电路不通,LED灯不亮。
所以,可以通过控制P1的值控制LED灯的亮与不亮。
而因为八个LED灯与P1口上八个引脚相连,因此可以控制每个接口的值控制每个LED灯的亮灭。
比如当P1=0x04时,第五个灯不亮。
2、蜂鸣器的控制
由电路图可知,蜂鸣器一侧与三极管相连,另一侧与高电平相连,而三极管与电阻相连后接P2_1口。
因此当P2_1=1时,蜂鸣器响;当P2_1=0时,蜂鸣器不响。
3、键盘的控制
(1)由电路图可知,P3_2到P3_5这四个引脚分别与四个开关相连,开关与地相连,所以当开关闭合时,P3_2=0,当开关断开时,P3_2=1,所以可以根据查看P3_2等值的0或1来判断开关是否闭合。
(2)要达到通过键盘控制数码管显示数字的目的,可以将P3_2为0时,表示要修改数字,而用P3_3到P3_5为0时分别对应时分秒等进行数值的加1。
(3)由电路图可知,开关S1闭合时,电路断开。
4、电子钟的显示
(1)电子钟上数字的显示原理
由电路图可知,P2_7到P2_2这六个引脚分别与六个数码管相连,中间有一10k的电阻,还有一三极管,通过三极管的特性可知,当P2_7等接高电平时,电路连通,数码管亮,既可以显示数字。
同样可以看到,P0口的八个引脚都与六个数码管相连,控制数码管中八个的亮灭,以达到显示0—9这10个数字的目的。
(2)电子钟的上显示的数字之间的联系
1、六个数码管每两个一组,分别显示时,分,秒。
判断当显示秒的数字,达到59时,将显示数字变为00,显示分钟的数字加1;当显示分钟的数字,达到59时,将显示的数字变为00,显示小时的数字加1;当显示小时的数字,达到23时,将显示的数字变为00。
2、六个数码管分为三组,前两个显示月份,后两位显示日期,中间两位作为分隔符号。
5、中断函数模块
这个程序运用了两个中断函数,分别为定时器0和定时器1的中断,定时器0是用来计时,定时器1是用来动态扫描,这样使得电子钟的性能更稳定。
6、实验电路图
总电路图:
数码管:
二极管:
蜂鸣器:
按键:
单片机:
7.系统的元器件清单
表2.1系统元器件表
器件
型号
数量
器件
型号
数量
单片机
12C5A60S2
1个
按键
普通
5个
三极管
普通
8个
开关
6脚双路
1个
排阻
A103J,A427J,A102J
1个,1个,
1个
二极管灯
普通
8个
电容
10μF
2个
数码管
CPS056AR
6个
电阻
普通
若干
下载接口
4针接口
1个
蜂鸣器
压电式
1个
单排针
普通
若干
三、主要功能模块流程图:
main函数流程图
四、拓展功能:
(1)LED灯的花样设计:
可根据自己的喜好设计出各种各样的LED灯
(2)利用数码管实现日期的显示:
显示月份与日期,根据月份判断每月天数
五、参考文献:
《新编单片机原理及应用》、《c语言程序设计》、《51单片机C语言教程》、《51实验指导》、《数据结构》、《算法设计与分析》
六、源程序及系统文件使用说明:
#include
#defineucharunsignedchar
ucharnum[]={0xbd,0x90,0xa7,0xb6,0x9a,0x3e,0x3f,0xb0,0xbf,0xbe};//0——9
ucharhour=12,min=0,second=0,flag,time1,month=12,day=1;//给各个数附初值
ucharset_hour=12,set_min=1,set_switch=1,key1_time,function;
ucharbell[]={0x17,0x13,0x2b};//显示开与关,ON,OF
uchartemp;
unsignedcharled[10]={0x00,0xfe,0xfc,0xf8,0xf0,0xe0,0xc0,0x80,0x00,0xaa};
sbitkey1=P3^2;
sbitkey2=P3^3;
sbitkey3=P3^4;
sbitkey4=P3^5;
sbitbell_ring=P2^1;
inti;
#defineuintunsignedint
uintcount=0;
voidtimer()interrupt1using0{//秒表控制函数
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
time1++;
}
voiddelay(uchari)//延迟函数
{
ucharj,k;
for(j=0;j
for(k=0;k<125;k++);
}
voidBeep()//钟表滴答声控制函数
{
P2_1=0;
delay
(1);
P2_1=1;
delay
(1);
}
voidtime(){//时间进行函数
if(time1==20){
time1=0;
for(i=0;i<25;i++)
Beep();
count++;
if(count==10)
count=0;
P1=led[count];
second++;
if(second==60){
second=0;
min++;
}
if(min==60){
min=0;
hour++;
}
if(hour==24){
hour=0;
day++;
//date();//调用日期函数,以便日期变化
}
}
}
voiddate(){//日期函数
if(month==2&&day>=30){
month++;
day=1;
}
elseif(((month==4)||(month==6)||(month==9)||(month==11))&&(day>=31)){
day=1;
month++;
}
elseif(day>=32){
day=1;
month++;
}
if(month>=13){
month=1;
}
}
voidset_time(){//调节时间函数
P3=0xff;
if(key2==0){//调节小时
delay(200);
if(key2==1){
hour++;
if(hour==25){
hour=0;
}
}
}
if(key3==0){//调节分钟
delay(200);
if(key3==1){
min++;
if(min==60)
min=0;
}
}
if(key4==0){//调节秒
delay(200);
if(key4==1){
second++;
if(second==60)
second=0;
}
}
}
voidset_date(){//调节日期
P3=0xff;
if(key2==0){//调节月份
delay(200);
if(key2==1){
month++;
if(month==13)
month=1;
}
}
if(key3==0){//调节日份
delay(200);
if(key3==1){
day++;
if(month==2&&day>=30){
day=1;
}
elseif(((month==4)||(month==6)||(month==9)||(month==11))&&(day>=31)){
day=1;
}
elseif(day>=32){
day=1;
}
}
}
}
voidshow_bell(){//显示设置的闹铃时间
P2=0x04;//显示ON,OF
if(set_switch%2==0){
P0=bell[2];//OF
delay(6);
}
else{
P0=bell[1];//ON
delay(6);
}
P2=0x08;
P0=bell[0];
delay(6);
P2=0x10;
P0=num[set_min%10];
delay(6);
P2=0x20;
P0=num[set_min/10];
delay(6);
P2=0x40;
P0=num[set_hour%10];
delay(6);
P2=0x80;
P0=num[set_hour/10];
delay(6);
}
voidset_bell(){//设置闹铃函数
//P3=0xff;
if(key2==0){
delay(200);
if(key2==1){
set_hour++;
if(set_hour==24)
set_hour=0;
}
}
if(key3==0){
delay(200);
if(key3==1){
set_min++;
if(set_min==60){
set_min=0;
}
}
}
if(key4==0){
delay(200);
if(key4==1){
set_switch++;
}
}
}
voidshow_time(){//显示时间
P2=0x04;
P0=num[second%10];
delay(6);
P2=0x08;
P0=num[second/10];
delay(6);
P2=0x10;
P0=num[min%10];
delay(6);
P2=0x20;
P0=num[min/10];
delay(6);
P2=0x40;
P0=num[hour%10];
delay(6);
P2=0x80;
P0=num[hour/10];
delay(6);
}
voidshow_date(){//日期显示
P2=0x04;
P0=num[day%10];
delay(6);
P2=0x08;
P0=num[day/10];
delay(6);
P2=0x10;
P0=0x02;//显示数码管为"-"
delay(6);
P2=0x20;
P0=0x02;
delay(6);
P2=0x40;
P0=num[month%10];
delay(6);
P2=0x80;
P0=num[month/10];
delay(6);
}
voidwalk_up_bell(){//响铃设置
if((min==set_min)&&(hour==set_hour))
temp=1;
elsetemp=0;
if((temp==1)&&(set_switch%2==1)&&(second<=5))
{
for(i=0;i<2;i++)
Beep();
}
elsebell_ring=0;
}
voidkey_board(){//功能选择
P3=0xff;
if(key1==0){
delay(200);
if(key1==1){
key1_time++;
}
}
function=key1_time%4;
switch(function){
case0:
show_time();break;
case1:
show_time();set_time();break;
case2:
show_date();set_date();break;
case3:
show_bell();set_bell();break;
}
}
voidmain(){
TMOD=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1;
ET0=1;
TR0=1;
while
(1){
key_board();
time();
date();
walk_up_bell();
}
}
七、总结
在组装单片机硬件设备时要细心,要有耐心,在实验时要注意安全。
在编译软件时,程序刚开始没有什么头绪,通过各种资料的搜集后发现调用各种函数来实现比较容易,整个过程中出现了很多小问题,各个函数的调用比较混乱。
通过一系列的梳理后慢慢清晰,发现比较的容易。