山东大学威海单片机实验报告.docx
《山东大学威海单片机实验报告.docx》由会员分享,可在线阅读,更多相关《山东大学威海单片机实验报告.docx(9页珍藏版)》请在冰豆网上搜索。
![山东大学威海单片机实验报告.docx](https://file1.bdocx.com/fileroot1/2022-11/19/b069c7fb-aac0-40ac-b77f-f5b9c623f8fb/b069c7fb-aac0-40ac-b77f-f5b9c623f8fb1.gif)
山东大学威海单片机实验报告
单片机课程设计报告
电子贺卡
姓名:
学院:
机电与信息工程学院
专业:
通信工程
班级:
2010级一班
日期
2012-2013第一学期
目录
一、课程设计任务及目的3
二、整体设计思路3
三、各部分实验设计思路3
1、电子发声部分4
2、流水灯部分5
3、中断部分的实现5
4、电子钟部分5
四、实验连线图7
五、实验程序及其分析8
六、实验总结14
1.设计任务及目的
任务:
本次课程设计的任务是设计一个简易的电子贺卡。
实现简易的电子钟功能。
(利用8051单片机设计出具有时、分、秒显示的电子表)
歌曲演奏功能
流水灯功能
目的:
了解中断工作原理,定时计数原理。
加深对单片机课程的理解。
提高动手能力和团队协作能力。
二、整体设计思路
三.实验各部分设计思路
【电子发声部分】
根据实验提供额的音乐频率表和时间表,编写程序控制单片机,使其连到扬声器上能发出相应的乐曲。
一个音符对应一个频率,将对应一个音符的方波通到扬声器上,就可以发出这个音符的声音。
将一段乐曲的一个音符对应频率的方波依次送到扬声器,就可以演奏乐曲。
利用定时器控制单片机的I/O引脚输出方波,将相应的频率的计数初值写入计数器,就可以产生对应频率的方波。
计数初值计算如下
计数初值=输入时钟/输入频率
音符与频率对照表如下:
【流水灯部分】
通过循环实现灯的亮灭
【中断部分的实现】
通过外部脉冲实现中断,由k++控制电子钟的时间的加。
【电子钟部分】
原理:
在单片机内部存储器设三个字节分别存放时钟的时、分、秒信息。
利用定时器与软件结合实现1秒定时中断,每产生一次中断,存储器内相应的秒值加1;若秒值达到60,则将其清零,并将相应的分字节值加1;若分值达到60,则清零分字节,并将时字节值加1;若时值达到24,则将十字节清零。
该方案具有硬件电路简单的特点。
但由于每次执行程序时,定时器都要重新赋初值,所以该时钟精度不高。
而且,由于是软件实现,当单片机不上电,程序不执行时,时钟将不工作。
采用动态显示。
所谓动态显示就是一位一位的轮流点亮各个位,对于显示器的每一位来说,每隔一段时间点亮一次。
利用人的视觉暂留功能可以看到整个显示,但必须保证扫描速度足够快,字符才不闪烁。
显示器的亮度既与导通电流有关,也于点亮时间与间隔时间的比例有关。
调整参数可以实现较高稳定度的显示。
动态显示节省了I/O口,降低了能耗。
四.实验连线图
五.实验程序
#include"SST89x5x4.h"
#include"intrins.h"
sbitPOUT=P3^5;//扬声器控制引脚
#defineClk0x070000
unsignedcharcodeseg7[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
unsignedcharact[6]={0xDF,0xEF,0xf7,0xFB,0xFD,0XFE};
unsignedcharcounter=0;
unsignedcharsec,min,hour=0,week=1;
unsignedcharcnt;
unsignedcharlight;
unsignedcharcount=0x01;
unsignedchardataval_H;//计数器高字节
unsignedchardataval_L;//计数器低字节
unsignedintcodefreq_list[]={589,882,786,661,700,661,525,441,525,
350,441,525,589,350,441,525,589,350,441,525,589,
350,350,350,350,262,441,393,441,393,441,525,
393,441,393,441,393,441,525,393,441,393,
441,661,525,525,525,467,441,350,393,350,350,
350,525,525,525,393,441,350,350,525,525,589,
589,393,393,0};
//时间表
unsignedcharcodetime_list[]={8,8,8,8,2,2,2,4,4,
8,2,2,2,8,2,2,2,8,2,2,2,
8,8,8,8,2,2,2,2,2,2,2,
2,2,2,2,2,2,2,2,2,2,
2,2,2,8,2,2,2,2,2,2,2,
2,2,2,2,2,2,2,4,4,4,4,
4,4,8};
voidDelay(unsignedcharcnt)//单位延时
{
unsignedchari;
unsignedintj;
for(i=0;i{
for(j=0;j<0x3600;j++);
}
}
voidinit_timer(void)
{
TMOD=0x11;
ET0=1;
TH1=-(1000/256);
TL1=-(1000%256);
ET1=1;
EA=1;
TR0=1;
TR1=1;
}
voidint_init(void)
{
EA=1;//全局中断开
EX0=1;//外部中断0开
IT0=1;//边沿触发
}
voidconv(void)
{
if(counter>=200){counter=0;sec++;}
if(sec>=60){sec=0;min++;}
if(min>=60){min=0;hour++;}
if(hour>=24){hour=0;week++;}
if(week>=7){week=1;}
}
voidmain(void)
{
unsignedintval;
unsignedchari;
unsignedcharlight=0x01;
int_init();
init_timer();
while
(1)
{
i=0;
while(freq_list[i])//频率为0重新开始
{
val=Clk/(freq_list[i]);
val=0xFFFF-val;//计算计数值
val_H=(val>>8)&0xff;
val_L=val&0xff;
TH0=val_H;
TL0=val_L;
Delay(time_list[i]);
i++;
}
}
}
voidISR_Key(void)interrupt0外部中断
{
min++;
}
voidt0_isr()interrupt1//定时器0中断处理程序
{counter++;
POUT=~POUT;//产生方波
TH0=val_H;//重新装入计数值
TL0=val_L;
conv();
}
voidtime1(void)interrupt3
{
TH1=-(1000/256);
TL1=-(1000%256);
if(++cnt>7)cnt=0;
count++;
if(count==250)
{
light=light<<1;
count=0;
if(light==0x00)
{
light=0x01;
}
}
P2=light;
switch(cnt)
{
case0:
P0=seg7[sec%10];P1=act[0];break;
case1:
P0=seg7[sec/10];P1=act[1];break;
case2:
P0=seg7[min%10];P1=act[2];break;
case3:
P0=seg7[min/10];P1=act[3];break;;
case4:
P0=seg7[hour%10];P1=act[4];break;
case5:
P0=seg7[hour/10];P1=act[5];break;
//case6:
P0=0xFF;P0=0xFF;break;
default:
break;
}
}
六、设计总结以及心得体会
通过学习《单片机的原理与应用》这门课程,并且利用其的知识制作实物的过程,我们收获很多。
接口技术中很多的知识既是要点又同样是难点。
比如“中断”概念,既是重点又是难点,如果不懂中断技术,就不能算是搞懂了接口技术。
在本次事件的过程中,我们就通过实物制作来学习和深入了解这些难点内容。
这是只在书本中学习所体验不到的,许多概念很相近,为了更好地掌握,将一些容易混淆的概念集中在一起进行分析,比较它们之间的异同点。
《单片机》作为我专业来说,是一门很重要的基础课之一,对于它的重要性和有用性,在这次大实验设计中也有所体会。
这次接口设计课程设计花费了我们很长的时间。
这段期间我们在从中学到很多很多的的东西,同时不仅可以巩固了以前所学过的知识,而且学到了很多在书本上所没有学到过的知识。
以前在上课的时候,老师经常强调在写一个程序的时候,一定要事先把程序原理方框图化出来,但是我开始总觉得这样做没必要,很浪费时间。
但是,这次课程设计完全改变了我以前的那种错误的认识,以前我接触的那些程序都是很短、很基础的,但是在课程设计中碰到的那些需要很多代码才能完成的任务,画程序方框图是很有必要的。
因为通过程序方框图,在做设计的过程中,我们每一步要做什么,每一步要完成什么任务都有一个很清楚的思路,而且在程序测试的过程中也有利于查错。
其次,以前对于编程工具的使用还处于一知半解的状态上,但是经过一段上机的实践,对于怎么去排错、查错,怎么去看每一步的运行结果,怎么去了解每个寄存器的内容以确保程序的正确性上都有了很大程度的提高。
通过这次课程设计使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正为社会服务,从而提高自己的实际动手能力和独立思考的能力。
在设计的过程中遇到问题,可以说得是困难重重,这毕竟第一次做的,难免会遇到过各种各样的问题,同时在设计的过程中发现了自己的不足之处,对以前所学过的知识理解得不够深刻,掌握得不够牢固。
这次的课程设计在经历很多次失败的调试后,终于以成功实现数字时钟的
那功能而告终。
我们在欣慰的同时又觉得这门课程在今后的学习工作生涯中,我们还需要认真地更加深入的学习和研究。