虽然说懵懵懂懂,还是把它做出来了。下学期也没这课程了,还是得加油复习~
《单片机与接口技术》课程
设计报告
目录
一、正 文
1 、题目与要求
1.1 问题提出
实现一个“时钟系统设计 ”,具体要求如下。
1)设计一时钟系统,系统具有时钟功能,能在8只数码管准确显示时、分、秒 (00:00:00)。 2)系统还应具有校正功能:能够使用按键修改当前的时间。(功能选择键1、+键、-键)
3)闹钟功能:具备设定闹钟和定时闹钟响功能。(功能选择键2、 +键、-键;蜂鸣器)综合上述,分析功能要求,对单片机资源进行合理选取和分配。
1.2 本系统涉及的知识点
数码管,按键,蜂鸣器。ISIS 7 Professional、Keil uVision3
2、系统硬件设计
2.1 模块图
图0 系统硬件框架图
图0.1 代码框架
图0.2 闹钟函数框架图
图0.3定时器T0中断服务程序流程图
2.2 模块电路图
本时钟系统主要由AT89C51芯片、复位电路,晶振电路,电源等几部分组成。
图1 复位电路 图2 晶振电路
电源:单片机的供电电源是5V的直流电。
键盘控制系统设计:如果设置过多按键,将会占用较多I/O口,浪费按键,不高效,程序繁琐。本次设计适用于按键较少的情况。为了尽量实现按键的高效性,此次设计采用四个独立式按键,其电路如 图3所示:
图3 按键调时电路
通过控制键来控制所要调节的是时、分、还是秒。
显示电路:显示电路图如图4所示:
图4 显示电路图
闹钟部分:闹钟部分通过三极管放大后驱动蜂鸣器工作,单片机I/O接三极管基极。
图5嗡鸣器电路
当单片机的P1^5接口输出为高电平时,蜂鸣器响,当输出为低电平时,蜂鸣器停止。
二、系统软件设计
1、分模块(函数)简述其功能
模块中使用的各变量的类型及作用
主函数
void main(){
TMOD=0x01; //选择单片机内部定时器中断的工作状态为1
// 表示定时器0的计数器从0开始加到50000,其中每加一次的时间为晶振频率的倒数。 1*12/12000000 秒。
TH0=(65535-50000)/256;
TL0=(65535-50000)%256;
ET0=1; //定时器0的中断允许开关
EA=1; //允许中断
TR0=1; //定时器/计数器启动
EX0=1; //外部中断0请求标志
IT0=1;
IT1=1;
while(1){
display1(s,f,m);
if(s==ts&&f==tf&&m==tm){
BEEP=0;
}
if(k4==0){
delay(1);
if(k4==0){
while(k4==0);
BEEP=1;
/* if(s==ts && f==tf+1) //响铃一分钟
{ BEEP=1;} */
} } }}
函数声明
void SetClock();
void SetTime();
void display1(uchar shi,uchar fen,uchar miao);
sbit BEEP=P1^5;
sbit k1=P3^5;
sbit k2=P3^6;
sbit k3=P3^7;
sbit k4=P3^4;
数码管显示表
uchar code wei[8]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};
uchar code duan[11]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40};
定义变量
uchar count=0,flag=0;
对定时中断进行初始化。
void time0_int(void) interrupt 1{
TH0=(65535-50000)/256;
TL0=(65535-50000)%256;
count++;
if(count==20){
count=0;
m++;
if(m==60){
m=0;
f++;
if(f==60){
f=0;
s++;
if(s==24){
s=0;
} } }}}
定义正常显示时间、闹钟初始化时间
uchar s=0,f=0,m=0;
uchar ts=0,tf=0,tm=0;
定义调整时间、调整闹钟时间
void naozhong(void) interrupt 0{
delay(1);
if(INT0==0){
flag=0;
if(INT0==0)
SetClock();
while(INT0==0);
}
flag=0;
}
void tiaoshi(void) interrupt 2{
delay(1);
if(INT1==0){
TR0=0;
SetTime();
while(INT1==0);
}
TR0=1;
flag=0;
}
void SetClock(){
while(1){
if(k1==1){
display1(ts,tf,tm);
}
else if(k1==0){
delay(1);
if(k1==0){
flag++;
}
while(!k1)
display1(ts,tf,tm);
}
if(flag==0){
display1(ts,tf,tm);
}
else if(flag==1){
if(k2==0){
delay(1);
if(k2==0){
while(!k2);
tm++;
if(tm==60){
tm=0;
}
}
}
if(k3==0){
delay(1);
if(k3==0){
while(!k3);
tm--;
if(tm==-1){
tm=59;
}
}
}
}
else if(flag==2){
if(k2==0){
delay(1);
if(k2==0){
while(!k2);
tf++;
if(tf==60){
tf=0;
}
}
}
if(k3==0){
delay(1);
if(k3==0){
while(!k3);
tf--;
if(tf==-1){
tf=59;
}
}
}
}
else if(flag==3){
if(k2==0){
delay(1);
if(k2==0){
while(!k2);
ts++;
if(ts==24){
ts=0;
}
}
}
if(k3==0){
delay(1);
if(k3==0){
while(!k3);
ts--;
if(ts==-1){
ts=23;
}
}
}
}
else if(flag==4){
break;
}
}
}
void SetTime(){
while(1){
if(k1==1){
display1(s,f,m);
}
else if(k1==0){
delay(1);
if(k1==0){
flag++;
}
while(!k1)
display1(s,f,m);
}
if(flag==0){
display1(s,f,m);
}
else if(flag==1){
if(k2==1||k3==1){
display1(s,f,m);
}
if(k2==0){
delay(1);
if(k2==0){
while(!k2);
m++;
if(m==60){
m=0;
}
}
}
if(k3==0){
delay(1);
if(k3==0){
while(!k3);
m--;
if(m==-1){
m=59;
}
}
}
}
else if(flag==2){
if(k2==1||k3==1){
display1(s,f,m);
}
if(k2==0){
delay(1);
if(k2==0){
while(!k2);
f++;
if(f==60){
f=0;
}
}
}
if(k3==0){
delay(1);
if(k3==0){
while(!k3);
f--;
if(f==-1){
f=59;
}
}
}
}
else if(flag==3){
if(k2==1||k3==1){
display1(s,f,m);
}
if(k2==0){
delay(1);
if(k2==0){
while(!k2);
s++;
if(s==24){
s=0;
} } }
if(k3==0){
delay(1);
if(k3==0){
while(!k3);
s--;
if(s==-1){
s=23;
}}}}
else if(flag==4){
break;
} }}
将时间送显
void display1(uchar shi,uchar fen,uchar miao){
P2=wei[7];
P0=duan[shi/10];
delay(1);
P2=wei[6];
P0=duan[shi%10];
delay(1);
P2=wei[5];
P0=duan[10];
delay(1);
P2=wei[4];
P0=duan[fen/10];
delay(1);
P2=wei[3];
P0=duan[fen%10];
delay(1);
P2=wei[2];
P0=duan[10];
delay(1);
P2=wei[1];
P0=duan[miao/10];
delay(1);
P2=wei[0];
P0=duan[miao%10];
delay(1);
}
延时
void delay(uchar x)
{ uchar i,j,k;
for(i=x;i>0;i--)
for(j=10;j>0;j--)
for(k=100;k>0;k--)
2、仿真运行效果图:
三 、总结
4.1程序调试情况
调试所遇到的问题:从程序设计开始,对于整体的框架不是很熟悉,虽然这些代码都之前分段实验做过的。但是还是有些不熟悉。单片机部分连线松动或异常导致仿真失败;出现闹铃不响或者是不显示的情况。
4.2本人在程序设计中感想
由于我班人数多,实训的机器不够,我就想到使用Proteus软件进行仿真,虽然老师课堂上没有教过这样的软件,但是通过自学也较为熟悉了这款软件,提升了自己的自学能力。
刚开始在调试程序的时候,有很多功能没有做到位。在不断的修改程序之后,系统逐渐变得完善。从中发现许多知识点学的并不牢固,只有去请教其他同学,最终完成了本次实训。也加强了对数码管,按键,蜂鸣器等知识点的掌握,为以后深入学习打下了基础。
四、参考文献
[1] 谭浩强,C程序设计(第二版),北京:清华大学出版社,2001.1
[2] archeng504,Proteus入门教程,日期:2006-1-2