单片机课程设计 -可调数字钟 (来自河北大学)(通用3篇)
单片机课程设计 -可调数字钟 (来自河北大学) 篇1
单片机课程设计 201244xxxx xx 12xx
一、绪论
单片机正朝着高性能和多品种的方向发展,下一步的趋势将是继续向着CMOS化、低功耗、小体积、大容量、高性能、低价格和外围电路内装化等几个方面发展。单片机应用的重要意义还在于,它从根本上改变了传统控制系统的设计思想和设计方法。以前必须由模拟电路或数字电路实现的大部分功能,现在已经能用单片机通过软件方法来实现了。
用单片机设计制作数字钟是单片机的一个典型应用。通过设计制作一个数字钟,我们可以充分了解单片机的工作原理,学会如何用单片机实现数据的处理以及设备的控制等。设计制作一个数字钟虽然简单,但涉及到的内容却十分广博。
本课程设计是基于单片机时钟的LED显示,通过单片机产生计数功能,经由LED数码管显示,显示时间时、分、秒,并用按键进行时间调整,同时带有整点报时功能。
本课程设计只是设计制作一个功能简单的数字钟,旨在通过对简单的硬件和软件的操作和应用以实现用数码管显示的数字钟,尝试基本的电路设计和单片机的C语言编程以及锻炼实践动手能力。
二、整体设计
本设计采用51单片机内部定时器产生时钟来进行准确计时,时分秒由3个变量来记录,定义按键功能,来实现时钟的调节,最终是由LED数码管来动态显示时间。
三、硬件电路设计
3.1 总体电路设计
单片机课程设计 201244xxxx xx 12xx
3.2信号处理电路
3.3单片机最小系统电路
单片机课程设计 201244xxxx xx 12xx
单片机外围电路有时钟电路和复位电路等,时钟电路采用的是内部时钟方式,在单片机内部有一振荡电路,在外部的XTAL1和XTAL2引脚外接石英石英晶体(晶振)就构成了自激振荡器课在单片机内部产生时钟脉冲信号,两电容作用是稳定频率和快速起振,晶振的振荡频率我们采用的是经典值12MHz。
复位电路采用的是上电复位和按键复位均有效的方式,单片机执行复位操作后进入初始化状态。
主要功能引脚能能如下:
P0的8位引脚产生8位段选信号,用于数码管显示;
P1.0口控制着电路板上的绿色指示灯的亮灭,其中1为灭,0为亮; P2口各引脚功能:
P2.0~ P2.2分别连接3-8译码器的A、B、C输入端,编程时需要写P2.0~ P2.2口来实现控制六个数码管的逐个显示;
P2.3连接3-8译码器的使能端,编程时需要对P2.3写入0;
P2.7~ P2.4分别连接K1~K4按键,编程时,需要通过读取P2.7~ P2.4的值获取按键状态;
3.4 显示电路设计
单片机课程设计 201244xxxx xx 12xx
3.5 串口通信电路设计
3.6 电源电路设计
单片机课程设计 201244xxxx xx 12xx
3.7 按键控制电路设计
本次设计采用了4个独立的按键K1,K2,K3,K4用于后期时间的调整,其分别与单片机的P2.7~ P2.4引脚连接,编程时,需要通过读取P2.7~ P2.4的值获取按键状态。各按键经由上拉电阻与VCC相连,当按键按下时,与按键相连接的引脚为低电平,按键弹起时是高电平,即一次按键按下,为一个下降沿和一个上升沿。
单片机课程设计 201244xxxx xx 12xx
四、软件设计
4.1 程序设计总体思路
本次设计要实现数字钟的可调功能,我把程序分化为五个模块分别进行编写,分别为时间处理子程序、显示子程序、按键扫描子程序、整点报时子程序以及中断子程序。
4.2 各模块程序设计
4.2.1 时间处理子程序
在此模块中把秒sec设置为六十进制,分钟min设置为六十进制,小时hour设置为二十四进制,即当时间增加1s时,将显示部分的“秒”位加一,加到60以后进位为“分”,“秒”位清零;当“分”累加到60后进位为 “时”,“分” 位清零;当“时”位为24以后,所有位清零后重新开始记时。时间处理子程序如下:
void proc()
//时间处理子程序 { if(sec==60)
//秒变量满60进一 {sec=0;min++;if(min==60)//分变量满60进一 {min=0;hour++;if(hour==24)//时变量满24进一
{hour=0;} } } }
4.2.2 时钟显示子程序
此段子程序用于实现数码管的动态显示,分为段选和片选。当系统处于正常计时状态时,数码管正常显示时钟,时与分之间和分与秒之间的小数点以1Hz的频率闪烁;当调节按键按下时,adjust_flag==1,小数点停止闪烁,当调节哪一位时(时、分、秒),哪一位的个位的小数点常亮,便于显示哪一位正在处于调节
单片机课程设计 201244xxxx xx 12xx 状态。
时钟显示子程序如下:
void display()
//时钟显示子程序 { a=0;b=0;c=0;//位选,刷新小时的十位
P0=zixing[hour/10];//段选,将小时的十位数的字形赋给P0输出显示 delay(3);//延时3ms
a=1;b=0;c=0;
//位选,刷新小时的个位
if(adjust_flag==0&TR0==1)//正常计时时,时的个位的小数点闪烁 {if(dot==1)P0=(zixing[(hour%10)]);else P0=(zixing[(hour%10)])|0X80;} //字形码的
单片机课程设计 201244xxxx xx 12xx P0=(zixing[(sec%10)])|0X80;//秒的个位小数点常亮 else P0=(zixing[(sec%10)]);//正常计数和调节其他位时,小数点都不亮 delay(3);}
4.2.3 检测按键子程序
按键扫描子程序即扫描读取K1、K2、K3、K4,如果有按键按下,则做相应的处理。规定按键的功能如下:
K4(P2.4):调节按键,当按一下K4时,由时间状态进入调节状态,调节标志变量adjust_flag=1,此时若adjust_selc==1,调秒;再按一下,adjust_selc==2,则调分;再按一下,adjust_selc==3,则调时;再按一下,adjust_selc==4,adjust_selc=0,按一下K3或K2,由调节状态便成为时钟显示状态。
K3(P2.5):加1按键,在调节状态下即adjust_flag=1,按一下K3按键则相应的调节位加1;
K2(P2.6):减1按键,在调节状态下即adjust_flag=1,按一下K2按键则相应的调节位减1。
检测按键子程序如下:
void testkey()
//检测按键子程序 {
if(P2_4==0)
//K4键按下时 {display();display();display();display();display();
//用延时进行消抖处理 if(P2_4==0){TR0=0;
//调时按键按下时,关闭定时器,停止计时 adjust_flag=1;
//调节标志置1,进入调时状态 if(adjust_selc<4)adjust_selc++;//更改调节位置 else adjust_selc=1;}
} if(P2_5==0&&adjust_flag==1)//K3加1键功能定义 {display();display();
单片机课程设计 201244xxxx xx 12xx display();display();display();
//用延时进行防抖处理 if(P2_5==0){switch(adjust_selc)//定义各调节模式下的按键功能 {
case 1:
//调秒 if(sec<59)sec++;else sec=0;break;case 2:
//调分 if(min<59)min++;else min=0;break;case 3:
//调时 if(hour<23)hour++;else hour=0;break;case 4:adjust_flag=0;//确认状态时,按一下K3则进入时钟计时模式 TH0=0x3c;
//定时器重新赋初值,开始计时 TL0=0xb0;TR0=1;display();break;default:break;}}} if(P2_6==0&&adjust_flag==1)
//K2减1键功能定义 {display();display();display();display();display();
//用延时进行按键防抖 if(P2_6==0){switch(adjust_selc)//定义各调节模式下的按键功能 {
case 1:
//调秒 if(sec>0)sec--;else sec=59;break;
单片机课程设计 201244xxxx xx 12xx case 2:
//调分 if(min>0)min--;else min=59;break;case 3:
//调时 if(hour>0)hour--;else hour=23;break;case 4:adjust_flag=0;
//确认状态时,按一下K2则进入时钟计时模式 TH0=0x3c;
//定时器重新赋初值,开始计时 TL0=0xb0;TR0=1;display();break;default:break;}}} }
4.2.4整点时绿灯点亮子程序
绿灯与P1.0相连,通过P2.7口控制P1.0的电平,用标志变量clock_flag记录按键K1的状态,K1按一次整点绿灯点亮功能开启,在分和秒都为0时,即整点时,绿灯亮一下;K1再按一次,定时功能关闭,整点时绿灯不再点亮。
整点时绿灯点亮子程序:
void clock()
//整点绿灯亮子程序,此功能开启后,遇整点时绿灯亮一下 { if(P2_7==0){display();display();display();display();display();//延时使按键去抖动
if(P2_7==0)//P2_7对应K1按键,按一次开启整点报时功能,再按一下关闭 clock_flag=~clock_flag;}
if(clock_flag==1&&sec==0&&min==0)green=0;
//整点到来时,绿灯亮一下
单片机课程设计 201244xxxx xx 12xx else green=1;//否则,绿灯常灭 }
4.2.5 中断子程序
利用定时器0方式1,50ms中断一次。计数初值为65536-50000=15536=3cb0,则TH0=0x3c,TL0=0xb0,工作方式设置:TMOD=0x01,即定时器0,方式1,计时方式。在中断程序中,定义两个记录中断次数的变量count1和count2,其中count1满10清零,用来产生小数点的闪烁频率,dot为1Hz,count2满20清零,即50ms溢出一次,20次共是1s,此时秒变量sec自加1.中断服务子程序:
void int_T0()interrupt 1 //定义中断子程序,采用T0方式1,50ms中断一次 { TH0=0x3c;//设置定时初值 TL0=0xb0;TMOD=0x01;//设置工作模式 if(count1<9)count1++;
//定义频率为1Hz的小数点闪烁变量 else {count1=0;dot=~dot;}
if(count2<19)//中断计时 count2++;else {count2=0;sec++;}
//中断次数满20时,即满一秒,秒位自加1,count2清零重新计数
}
4.2.6 主程序
主程序中设置定时初值以及定时器的工作方式,开中断,然后利用while(1)语句,反复执行各个子程序。
主程序如下:
void main()
//主函数 { P2=0xff;
//初始化P2口,全设为1 TMOD = 0x01;//time0为定时器,方式1
单片机课程设计 201244xxxx xx 12xx TH0=0x3c;
//赋计时初值 TL0=0xb0;EA=1;//开总中断
ET0=1;
//T0中断允许 TR0=1;//T0开中断
en=0;
//3-8译码器处于工作状态 while(1)//时时检测 { testkey();
//检测按键 proc();//时间处理程序调用 display();
//显示时间
clock();
//整点报时
} }
五、收获与总结
通过本次的单片机课程设计,我本人收获很大。
首先,以前在学习单片机原理及应用时,老师所讲授的是汇编语言,而此次课程设计需要使用C语言,因此通过自己课下学习相关单片机教学视频以及教学资料了解了基于51单片机的C语言程序的编写以及相关软件使用。
其次,通过此次单片机课程设计,更加深入掌握了51单片机的结构与原理,包括51单片机内部定时系统的开启与设置、中断调用和如何使用单片机内部时钟实现精确计时以及如何对单片机的双向口进行读写操作等。除此之外,也更加深入理解了数码管动态扫描显示原理。
最后,通过连续几天以来不断地编程、下载和调试,自己形成了一定的编程逻辑思维。
附:单片机设计完整程序
#include
uchar code zixing[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};//定义共阴数码管的数字字形数组 uchar sec;//定义秒变量 uchar min;
//定义分变量 uchar hour;//定义时变量
uchar count1;//记录中断次数,满10归零,产生1Hz频率,用于小数点闪烁 uchar count2;
//记录中断次数,满20归零,用于秒自加1 uchar adjust_selc=4;
//记录调节按键按下次数的变量,用于选择调节位置
单片机课程设计 201244xxxx xx 12xx bit adjust_flag;
//定义按键调节标志
bit clock_flag;
//定义整点时绿灯闪烁标志
bit dot;
//定义小数点闪烁频率变量,以1Hz的频率亮暗变化 sbit a=P2^0;sbit b=P2^1;
//定义3-8译码器输入端口a,b,c sbit c=P2^2;sbit en=P2^3;
//使能端
sbit P2_4=P2^4;
// 调时按键K4,根据按键的次数来确定调节模式 sbit P2_5=P2^5;
//加按键K3 sbit P2_6=P2^6;
//减按键K2 sbit P2_7=P2^7;
//整点时绿灯闪烁功能按键K1 sbit green=P1^0;
//整点时绿灯亮一下
void proc()
//时间处理子程序 { if(sec==60)
//秒设为60进制 {sec=0;min++;if(min==60)//分设为60进制 {min=0;hour++;if(hour==24)//时设为24进制 {hour=0;} } } }
void delay(uchar xms)
// 延时子程序 { uint i,j;for(i=0;i //x毫秒延时 for(j=0;j<125;j++);} void display() //时钟显示子程序 { a=0;b=0;c=0;//位选,刷新小时的十位 P0=zixing[hour/10];//段选,将小时的十位数的字形赋给P0输出显示 delay(3);//延时3ms a=1;b=0;c=0; //位选,刷新小时的个位 if(adjust_flag==0&TR0==1)//正常计时时,时的个位的小数点闪烁 {if(dot==1)P0=(zixing[(hour%10)]);else P0=(zixing[(hour%10)])|0X80;} //字形码的 单片机课程设计 201244xxxx xx 12xx else if(adjust_selc==3)//如果处于调节状态下的调时模式 P0=(zixing[(hour%10)])|0X80;//时的个位,小数点常亮 else P0=(zixing[(hour%10)]);//调节其他位时,小数点则不亮 delay(3); a=0;b=1;c=0; //位选,刷新分的十位 P0=zixing[min/10];delay(3); a=1;b=1;c=0;//位选,刷新分的个位 if(adjust_flag==0&TR0==1)//正常计时时,分的个位的小数点闪烁 {if(dot==1)P0=(zixing[(min%10)]);else P0=(zixing[(min%10)])|0X80;} else if(adjust_selc==2) //如果处于调节状态下的调分模式 P0=(zixing[(min%10)])|0X80; //分的小数点常亮 else P0=(zixing[(min%10)]);//调节其他位时小数点则不亮 delay(3); a=0;b=0;c=1;//位选,刷新秒的十位 P0=zixing[sec/10];delay(3); a=1;b=0;c=1;//位选,刷新秒的个位 if(adjust_selc==1) //如果处于调节状态下的调秒模式 P0=(zixing[(sec%10)])|0X80;//秒的个位小数点常亮 else P0=(zixing[(sec%10)]);//正常计数和调节其他位时,小数点都不亮 delay(3);} void testkey() //检测按键子程序 { if(P2_4==0) //K4键按下时 {display();display();display();display();display(); //用延时进行消抖处理 if(P2_4==0) 单片机课程设计 201244xxxx xx 12xx {TR0=0; //调时按键按下时,关闭定时器,停止计时 adjust_flag=1; //调节标志置1,进入调时状态 if(adjust_selc<4)adjust_selc++; //更改调节位置 else adjust_selc=1;} } if(P2_5==0&&adjust_flag==1)//K3加1键功能定义 {display();display();display();display();display();//用延时进行防抖处理 if(P2_5==0){switch(adjust_selc)//定义各调节模式下的按键功能 { case 1: //调秒 if(sec<59)sec++;else sec=0;break;case 2: //调分 if(min<59)min++;else min=0;break;case 3: //调时 if(hour<23)hour++;else hour=0;break;case 4:adjust_flag=0; //确认状态时,按一下K3则进入时钟计时模式 TH0=0x3c; //定时器重新赋初值,开始计时 TL0=0xb0;TR0=1;display();break;default:break;}}} if(P2_6==0&&adjust_flag==1) //K2减1键功能定义 {display();display();display();display(); 单片机课程设计 201244xxxx xx 12xx display(); //用延时进行按键防抖 if(P2_6==0){switch(adjust_selc)//定义各调节模式下的按键功能 { case 1: //调秒 if(sec>0)sec--;else sec=59;break;case 2: //调分 if(min>0)min--;else min=59;break;case 3: //调时 if(hour>0)hour--;else hour=23;break;case 4:adjust_flag=0;//确认状态时,按一下K2则进入时钟计时模式 TH0=0x3c; //定时器重新赋初值,开始计时 TL0=0xb0;TR0=1;display();break;default:break;}}} } void clock() //整点绿灯亮子程序,此功能开启后,遇整点时绿灯亮一下 { if(P2_7==0){display();display();display();display();display();//延时使按键去抖动 if(P2_7==0)//P2_7对应K1按键,按一次开启整点报时功能,再按一下关闭 clock_flag=~clock_flag;} if(clock_flag==1&&sec==0&&min==0)green=0; //整点到来时,绿灯亮一下 单片机课程设计 201244xxxx xx 12xx else green=1;//否则,绿灯常灭 } void int_T0()interrupt 1 //定义中断子程序,采用定时器0方式1,50ms中断一次 { TH0=0x3c;//设置定时初值 TL0=0xb0;TMOD=0x01;//设置工作模式 if(count1<9)count1++; //定义频率为1Hz的小数点闪烁变量 else {count1=0;dot=~dot;} if(count2<19)//中断计时 count2++;else {count2=0;sec++;} //中断次数满20时,即满一秒,秒位自加1,count2清零重新计数 } void main() //主函数 { P2=0xff; //初始化P2口,全设为1 TMOD = 0x01;//time0为定时器,方式1 TH0=0x3c; //赋计时初值 TL0=0xb0;EA=1;//开总中断 ET0=1; //T0中断允许 TR0=1;//T0开中断 en=0; //3-8译码器处于工作状态 while(1)//时时检测 { testkey(); //检测按键 proc();//时间处理程序调用 display(); //显示时间 clock(); //整点报时 } } 2011年7月底,本刊特约记者就远程学习资源课程设计与开发中所关心的问题,与阿萨巴斯卡大学的课程设计开发部主任兼学术代理副校长Cindy Ives女士和课程设计师闫洪新先生进行了交流。Cindy博士从事教学及课程研发工作16年,在远程教育及课程设计方面很有研究。闫洪新先生毕业于康科迪亚大学(Concordia University)的教育技术专业,在网络课程及教育多媒体设计方面拥有丰富的经验,曾参加过十几门远程教学课程的设计与开发工作。 提问:能否先介绍一下阿萨巴斯卡大学目前的情况和已经取得的成绩? 回答:阿萨巴斯卡大学成立于1970年,是加拿大阿尔伯塔省的四所公立综合性大学之一,得到加拿大阿尔伯塔省政府的承认,并向阿尔伯塔省政府汇报。阿萨巴斯卡大学的质量保证机制和学科的建立是由阿尔伯塔省质量理事会审查通过的。省政府授权阿萨巴斯卡大学理事会执掌大学事务,并负责授予学位。 我们学校现有教职员工1,200名,学生38,000名,其中超过7,300名是全日制学生。教职员工分布在阿萨巴斯卡本部、圣阿尔伯特、埃德蒙顿和卡尔加里城四个校区。 阿萨巴斯卡大学招生有最低年龄限制,年满16周岁才可以申请入学。但我们招生没有地域限制,目前,我们的学生遍布加拿大本土各个省份和世界84个国家。我们的本科学生平均年龄是29岁,研究生平均年龄是37岁。其中,81%的学生是在职的学习者。从性别来看,我们的学生中67%为女性。74%的毕业生是家中第一个获得大学学历的人。此外,阿萨巴斯卡大学有完善的学分转换系统,允许已在其他高等院校注册的学生任意选择阿萨巴斯卡大学开设的课程和提供的教学服务,这些学生在阿萨巴斯卡大学被称为访问生(visiting student)。访问生可以将在阿萨巴斯卡大学获得的学分转换为自己所在校的学分,从而完成在自己所在校的学习。 2004年,在美国《金融时报(Financial Times)》发布的远程教育网络课程排名榜上,阿萨巴斯卡大学的MBA课程排名第75位。2006年,经由中部州郡高等教育委员会(Middle States Commission on Higher Education,MSCHE)审核, AU成为第一个在美国接受认证的加拿大公立大学。2011年,AU受到加拿大商务部会计专业学士学位CMA的认可,这表明我们大学的管理会计教学具有极高的水准。 提问:阿萨巴斯卡大学已经开发出多少专业、多少门远程学习课程? 回答:目前阿萨巴斯卡大学向社会提供文科、理科和个人培训三大类共90多个专业的750门课程。所有这些课程都是多媒体的,其中有70%是网络课程。 提问:您所说的“网络课程”,具体是指什么样的课程?这些网络课程包括哪些活动内容? 回答:在AU,网络课程是指以网络为主要授课平台的课程,大体上包括了导引和入门(Orientation)、交流及协作(Communication and Collaboration)、教学(Instruction)、学习支持(Learner Support) 和学习考核(Assessment)五大部分。学生在这个平台上进行各种学习活动,这些活动包括:对整门课的简单介绍,对学习目标、学习日程、作业和考试的了解;对每一章节的学习目标和知识点的掌握;各种练习和交互的完成;多媒体的浏览;规定的电子文档的阅读;对课本阅读要求的了解;完成及提交作业,查阅作业所得分数;师生或学生之间的交流或讨论;学生之间的合作;学生的学习日志;查阅参考资源,比如Moodle的介绍,如何进行学术写作,如何查阅参考文献,等等;寻求正确理解课程内容的帮助;寻求课程平台使用技术的支持。课程制作和使用当中涉及的技术形式和教学策略有:静态文本内容;多媒体,包括图像、音频、视频;交互;动画;模拟;Web2.0,如论坛、维基、博客、微博;会议,如音频会议、视频会议,等等。 提问:我们很想进一步了解,阿萨巴斯卡大学的课程设计与开发由什么部门负责,以及其组织机构与人员的构成情况。请做一些介绍。 回答:阿萨巴斯卡大学课程设计与开发主要由课程设计开发部负责。课程设计开发部的职责是向教师(个人)、项目组、教学系部,提供设计、制作与评价的全方位的服务,以及教学设计、网络学习技能、有效使用媒体技术教学、提供开放教育资源等具体的支持和指导。 目前,我们的课程设计开发部由主任、课程设计经理、课程编辑经理、 课程制作经理、课程设计师和教学媒体分析师、课程外观设计、程序员、编辑、版权人员、制作人员等组成。这些人员分为课程设计、编辑和制作三个大组。课程设计师和教学媒体分析师 (13人)、课程外观设计师(3人)和程序员(1人)组成第一大组,由课程设计经理(1人)负责管理;编辑(13人)是第二大组,由课程编辑经理(1人)负责管理;课程制作经理(1人)则负责管理由版权室(4人)和制作团队(9人)组成的第三大组。部主任(1人)则通过三个经理指导全部门的工作。 从以上人员构成和比例可以清晰地看出,AU非常注重强调教学设计和媒体设计。自2004年起,阿萨巴斯卡大学要求所有的课程开发必须经过教学设计和媒体设计,这是我们的课程质量不断提高的要诀。此外,将版权室划归在制作组是网络课程开发的新需要所带来的新变化。 提问:您所提到的课程设计师和媒体设计师的工作职责包括哪些内容? 回答:课程设计师和媒体设计师的工作职责是分析课程并提出教学设计方案,建议教学技术的应用,协助需求分析及教学考核,设计及制作多媒体等。他们通常是和教学系部的学科教师、学科领域专家(SME),及其他课程开发人员一起协调工作的。这些设计师在学校享受与学术教师相同的待遇,在管理上归属课程设计开发部,但在工作中,他们和学科教师一起工作的时间与和本部门内其他团队成员一起工作的时间是对半的,因此能起到很好的桥梁作用。 在课程设计开发过程中,这些设计师不是凌驾于教学系部的学科教师之上的“专家”,而是处在协作和配合教学系部的学科教师的地位。目前在阿萨巴斯卡大学,学科教师似乎更具有决定权。从这个意义上讲,课程设计师则更具有“服务”的性质。课程质量的高低与设计师的工作业绩是相关的,这也是评判设计师工作业绩的一个考量标准。但同时还需要考虑设计的外部和环境因素。比如,有的学科教授不太关心课程设计,或者有的课程由于特殊原因,没有太多的设计成分。 提问:阿萨巴斯卡大学是如何确定课程开发模型的? 回答:课程模型的正确与否,决定着课程开发的成败。在阿萨巴斯卡大学,我们开发课程时,先要从以下8个要素去考虑和确定课程设计模型:①课程授课方式,即以什么方式讲授课程;②课程的学习成果,这是从学生角度来谈的教学目标;③学科内容领域,如文科、理科;④课程的水平等级;⑤学习支持服务的水平和类型,也即用什么方式给学生提供帮助;⑥课程教授的教学和学习的理念,如行为主义、认知主义和建构主义等;⑦适当的教学技术的具备性,比如学生上网的网速可以决定是否要使用视频教学;⑧学生的情况,如背景、原有知识、学习的动机与目的等。这些要素之间没有纵向层级关系,每一个都能直接影响课程开发模型的建立。因此必须对每个方面有清晰的描述和判断之后,才能向下进行。 提问:我们还想请您详细介绍一下阿萨巴斯卡大学的课程设计方法与步骤。 回答:虽然不同的课程有不同的特点,但每个课程开发都要就以下问题做有层次的思考与讨论。首先,要明确教学目标,教学目标是课程设计的起点,每个课程开发都要有明确的教学目标。其次,要确定学习成果,这里的“学习成果”是指课程学完之后,学生可以获得什么,是知识点、概念,还是理论、技能?再次,要分析学习成功的外部因素,学习的发生是内因通过外因而起作用的过程,因此,我们要清楚地分析出促进课程学习成功的外因是什么,这对于课程开发是十分重要的。然后,还要分析学习成功的内部因素,促使学习成功的内部因素是指学生的学习动机和需求。远程学习者的多元化、多样化使得远程教育课程开发必须强调对学习者的了解与分析,只有弄清楚学生为什么要学、学了之后要去做什么等等内心需要,我们的课程设计和开发才会有依据。同时,还要分析学习成功的环境因素,环境因素是指大背景因素,比如,设计的教学策略是否具备实施的环境条件,教授和辅导员自身网络教学的理念和技术的差异等。最后,还要思考是否满足了多方利益人的意愿,一门课程从计划、设计到开发,直至用于教学,前后涉及很多利益方,比如:校方,学生,教授,辅导员,设计开发人员,技术及注册服务人员等,所有这些人的利益和意愿都需要我们去综合考虑和权衡。 在对以上问题进行了周密的思考与论证之后,课程开发便沿着“计划(Plan)→设计(Design)→制作(Development)→执行(Implement )→评价(Evaluate)→修正/完善(Adapt/Improve)”的路线展开,直到课程开发完成才终止。在阿萨巴斯卡大学,设计和开发一门课程平均需要半年到一年的时间,这很大程度上取决于学科专家(SME)对内容的组织进度。 提问:如果课程开发的教师是新手怎么办?阿萨巴斯卡大学是如何在课程开发当中帮助新手教师的? 回答:阿萨巴斯卡大学有模版和样例课程提供给教师做参考。新手教师可以通过参考样例课程了解课程开发的要求。此外,阿萨巴斯卡大学在课程开发前还会要求教师详细填写计划书。说到教师培训,阿萨巴斯卡大学正在实施,但这个培训是针对教师当中普遍存在的问题的,而不单单是针对新手教师。由于课程和课程不一样,所以每个课程采取什么样的教学形式和学习策略也会有区别。这就是为什么课程设计师需要和教授进行讨论和商议的原因,有时候,他们还需要反复多次地协商。顺便说一下,阿萨巴斯卡大学的模板和样例课程是由课程设计开发部开发制作的,模版和样例课程的学习指导由课程设计师合作完成,整体上由课程设计经理负责。 提问:在阿萨巴斯卡大学,多媒体开发(Multimedia Development)是一个什么样的概念? 回答:在阿萨巴斯卡大学,多媒体开发通常指多媒体课件或者组件的开发,我们并不是把整个课程看作是一个多媒体来开发。因为,在一个课程里面,多媒体也许只是很小的一个组成部分,此外还有诸如学习指导、电子阅读文献、讨论、学习日志、人机交互式练习反馈、作业等等其他组成部分。在AU的课程中,多媒体通常用在一些比较复杂和困难的概念或技能的理解与掌握上,比如:图片、动画、模拟;也可以用于教学的人格化方面,比如:教师的口述、访谈;还可以用于同步交流,比如视频或音频会议等。而这些都是针对学习目标、教学策略、教学内容和学生对象的需求来设计的。需要经过和学科教授的讨论,确定有这样的需求之后才能开发。我们不赞成为了使用媒体而在课程中肆意开发多媒体。 提问:在阿萨巴斯卡大学,多媒体课件开发的一般过程是什么? 回答:阿萨巴斯卡大学多媒体课件开发的过程一般要经过七个步骤。 第一步,提出多媒体方案。多媒体方案是由课程的教授和课程设计师依据课程的对象、目标和学科特点在教学设计会上提出的。 第二步,评价和调查。在这里,要对现有的开放学习资源(OER)、开放资源工具(Open Source tools)、校内可复用的工具(AU reusable tools)逐一评价和调查,看是否有必要开发新的多媒体课程。 第三步,做计划。这一步要确定课程呈现的样式或格式、开发周期、内容、活动、考核评价方式,等等。 第四步,制作工作流程图。在此,需要将课程开发的内容、形式、时间要求等清晰地呈现出来。课程设计师需要提供一个流程图,并交给教授审核,再由开发人员来执行。如果执行中需要做一些改变,则由教授提出申请,再由课程设计师来调整。 第五步,实施开发制作。这是将想法变成现实的过程。在阿萨巴斯卡大学,这是由课程设计开发部的教学媒体分析师和程序员完成的。 第六步,评价。这里的评价是对所开发的多媒体课件的评价。评价者可以是其他课程设计师或学生,当然也要包括教授。 第七步,整合。这里的“整合”是指把开发完成的多媒体组件整合进教学管理系统(Learning Management System)之中。在阿萨巴斯卡大学,教学管理系统是Moodle。整合是按照计划书中预先计划好的方案来实施的。 提问:在阿萨巴斯卡大学,多媒体开发中需要考虑哪些要素? 回答:在AU,我们开发多媒体需要考虑5个方面的问题:①媒体理论,如:多媒体原则,时近原则,模态原则,冗余原则,一致性原则,个性化原则,等等;②可用性,如:导航,优化图像,尺寸,程序,一致性主题;③可接受性,如:要为屏幕阅读设计字体字号合理的标题;④标准化,如:单位、数据、速率、颜色、字体等的使用要符合标准;⑤版权清理和许可,在阿萨巴斯卡大学,我们一直鼓励使用开放资源,同时也十分严肃地对待版权问题。 提问:能否进一步解释一下,阿萨巴斯卡大学是如何处理教学资源开发中的版权问题的? 回答:在阿萨巴斯卡大学远程学习资源开发中,版权是一个自始至终都受到重视的问题。SME (学科领域专家),有时包括课程设计师和课程外观设计师,在组织课程内容的时候,要将所选用的课件、图片、软件、阅读文献等的内容和出处开列清单交给编辑人员。编辑人员根据资料出处,按照格式要求,将作者信息等加上,并发给版权工作人员,进入处理过程。对可以免费使用的版权内容 (如开放资源、公共资源、免费资源),需要根据版权说明进行使用和引用。举个例子来说,有的图片允许缩放但不能编辑,我们就要尊重版权所有人的要求。对不能免费使用的资源,则由版权室办理版权购买。待课程开发完成,如果课程中所有版权问题已清理,版权人员要签字确认的。 远程教学资源课程设计与开发涉及的问题很多,我们相信中国的同行也会遇到许多类似的问题,我们愿意与中国远程教育系统加强交流,真诚合作,相互帮助,共同提高远程教学资源课程设计与开发的质量。 收稿日期: 2011-11-15 作者简介:刘臣,中央广播电视大学出版社社长(100039)。 王跃,中央广播电视大学出版社学习资源研究中心主任(100039)。 引言 随着现代信息技术的飞速发展和传统工业改造的逐步实现.能够独立工作的温度检测和显示系统应用于诸多领域。传统的温度检测以热敏电阻为温度敏感元件。热敏电阻的成本低,但需后续信号处理电路,而且可靠性相对较差,测温准确度低,检测系统也有一定的误差。与传统的温度计相比,这里设计的数字温度计具有读数方便,测温范围广,测温精确,数字显示,适用范围宽等特点。选用AT89C51型单片机作为主控制器件,DSl8B20作为测温传感器通过4位共阳极LED数码管串口传送数据,实现温度显示。通过DSl8B20直接读取被测温度值,进行数据转换,该器件的物理化学性能稳定,线性度较好,在0℃~100℃最大线性偏差小于0.1℃。该器件可直接向单片机传输数字信号,便于单片机处理及控制。另外,该温度计还能直接采用测温器件测量温度,从而简化数据传输与处理过程。 系统硬件设计方案 根据系统功能要求,构造图1所示的系统原理结构框图。 图1 系统原理结构框图 2.1 单片机的选择 AT89C51作为温度测试系统设计的核心器件。该器件是INTEL公司生产的MCS一5l系列单片机中的基础产品,采用了可靠的CMOS工艺制造技术,具有高性能的8位单片机,属于标准的MCS—51的CMOS产品。不仅结合了HMOS的高速和高密度技术及CHMOS的低功耗特征,而且继承和扩展了MCS—48单片机的体系结构和指令系统。单片机小系统的电路图如图2所示。 图2 单片机小系统电路 AT89C51单片机的主要特性: (1)与MCS-51 兼容,4K字节可编程闪烁存储器; (2)灵活的在线系统编程,掉电标识和快速编程特性; (3)寿命为1000次写/擦周期,数据保留时间可10年以上; (4)全静态工作模式:0Hz-33Hz; (5)三级程序存储器锁定; (6)128*8位内部RAM,32可编程I/O线; (7)两个16位定时器/计数器,6个中断源; (8)全双工串行UART通道,低功耗的闲置和掉电模式; (9)看门狗(WDT)及双数据指针; (9)片内振荡器和时钟电路; 2.2 温度传感器介绍 DS18B20可以程序设定9~12位的分辨率,精度为±0.5°C。可选更小的封装方式,更宽的电压适用范围。分辨率设定,及用户设定的报警温度存储在EPROM中,掉电后依然保存。 温度传感器DS18B20引脚如图3所示。 8引脚封装 TO-92封装 图3 温度传感器 引脚功能说明: NC :空引脚,悬空不使用; VDD :可选电源脚,电源电压范围3~5.5V。当工作于寄生电源时,此引脚必须接地。 DQ :数据输入/输出脚。漏极开路,常态下高电平。 GND :为电源地 DS18B20内部结构主要由四部分组成:64位光刻ROM、温度传感器、非挥发的温度报警触发器TH和TL、配置寄存器。 光刻ROM中的64位序列号是出厂前被光刻好的,它可以看作是该DS18B20的地址序列码。64位光刻ROM的排列是:开始8位(28H)是产品类型标号,接着的48位是该DS18B20自身的序列号,最后8位是前面56位的循环冗余校验码(CRC=X8+X5+X4+1)。光刻ROM的作用是使每一个DS18B20都各不相同,这样就可以实现一根总线上挂接多个DS18B20的目的。 DS18B20中的温度传感器可完成对温度的测量,以12位转化为例:用16位符号扩展的二进制补码读数形式提供,以0.0625℃/LSB形式表达,其中S为符号位。 这是12位转化后得到的12位数据,存储在18B20的两个8比特的RAM中,二进制中的前面5位是符号位,如果测得的温度大于0,这5位为0,只要将测到的数值乘于0.0625即可得到实际温度;如果温度小于0,这5位为1,测到的数值需要取反加1再乘于0.0625即可得到实际温度。 例如+125℃的数字输出为07D0H,+25.0625℃的数字输出为0191H,-25.0625℃的数字输出为FF6FH,-55℃的数字输出为FC90H。 DS18B20温度传感器的内部存储器包括一个高速暂存RAM和一个非易失性的可电擦除的E2RAM,后者存放高温度和低温度触发器TH、TL和结构寄存器。 暂存存储器包含了8个连续字节,前两个字节是测得的温度信息,第一个字节的内容是温度的低八位,第二个字节是温度的高八位。第三个和第四个字节是TH、TL的易失性拷贝,第五个字节是结构寄存器的易失性拷贝,这三个字节的内容在每一次上电复位时被刷新。第六、七、八个字节用于内部计算。第九个字节是冗余检验字节。 该字节各位的意义如下: TM R1 R0 低五位一直都是1,TM是测试模式位,用于设置DS18B20在工作模式还是在测试模式。在DS18B20出厂时该位被设置为0,用户不要去改动。R1和R0用来设置分辨率,如表1所示:(DS18B20出厂时被设置为12位) 表1 DS18B20温度转换时间表 R1 R0 分辨率/位 温度最大转向时间 0 0 93.75 0 187.5 0 375 750 根据DS18B20的通讯协议,主机控制DS18B20完成温度转换必须经过三个步骤:每一次读写之前都要对DS18B20进行复位,复位成功后发送一条ROM指令,最后发送RAM指令,这样才能对DS18B20进行预定的操作。复位要求主CPU将数据线下拉500微秒,然后释放,DS18B20收到信号后等待16~60微秒左右,后发出60~240微秒的存在低脉冲,主CPU收到此信号表示复位成功。 2.3 温度传感器与单片机的连接 温度传感器的单总线(1-Wire)与单片机的P2.0连接,P2.0是单片机的高位地址线A8。P2端口是一个带内部上拉电阻的8位双向I/O,其输出缓冲级可驱动(吸收或输出电流)4个TTL逻辑门电路。对该端口写“1”,可通过内部上拉电阻将其端口拉至高电平,此时可作为输入口使用,这是因为内部存在上拉电阻,某一引脚被外部信号拉低时会输出一个电流。在访问外部程序存储器或16位地址的外部数据存储器时。如执行MOVX DPTR指令,则表示P2端口送出高8位的地址数据。在访问8位地址的外部数据存储器时,可执行MOVX RI指令,P2端口内容即为特殊功能寄存器(SFR)区中R2寄存器内容,整个访问期间不改变。在Flash编程和程序校验时,P2端口也接收高位地址和其他控制信号。图4为DSl8820内部结构。图5为DSl8820与单片机的接口电路。 图4 DS18B20内部结构图 图5 DS18B20和单片机的接口连接 2.4 复位信号及外部复位电路 单片机的P1.6端口是MAX813看门狗电路中喂狗信号的输入端,即单片机每执行一次程序就设置一次喂狗信号,清零看门狗器件。若程序出现异常,单片机引脚RST将出现两个机器周期以上的高电平,使其复位。该复位信号高电平有效,其有效时间应持续24个振荡脉冲周期即两个机器周期以上。若使用频率为12 MHz的晶体振荡器,则复位信号持续时间应超过2μs才完成复位操作。 2.5 单片机与报警电路 系统中的报警电路是由发光二极管和限流电阻组成,并与单片机的P1.2端口连接。P1端口的作用和接法与P2端口相同,不同的是在Flash编程和程序校验期间,P1接收低8位地址数据。 2.6 电源电路 由于该系统需要稳定的5 V电源,因此设计时必须采用能满足电压、电流和稳定性要求的电源。该电源采用三端集成稳压器LM7805。它仅有输入端、输出端及公共端3个引脚,其内部设有过流保护、过热保护及调整管安全保护电路.由于所需外接元件少,使用方便、可靠,因此可作为稳压电源。图6为电源电路连接图。 图6 电源电路连接图 2.7 显示电路 采用技术成熟的74HCl64实现串并转换。LED显示分为静态显示和动态显示。这里采用静态显示,系统通过单片机的串行口来实现静态显示。串行口为方式零状态,即工作在移位寄存器方式,波特率为振荡频率的1/12。当器件执行任何一条将SBUF作为目的寄存器的命令时,数据便开始从RXD端发送。在写信号有效时,相隔一个机器周期后发送控制端SEND有效,即允许RXD发送数据,同时允许从TXD端输出移位脉冲。图7为显示电路的连接图。 图7 显示电路的连接图 2.8 看门狗电路 系统中把P1.6作为看门狗的“喂狗”信号;将MAX813的RESET与单片机的复位信号RST连接。由于单片机每执行一次程序,就会给看门狗器件一个复位信号,这样也可以用手工方式实现复位。当按键按下时,SW—SPST就会在MAX813引脚产生一个超过200 ms的低电平,其实看门狗器件在1.6 s时间内没有复位,使7引脚输出一个复位信号的作用是相同的,其连接图如图8所示。 图8 看门狗器件的MAX813的连接图 软件设计 DSl8820的主要数据元件有:64位激光Lasered ROM,温度灵敏元件和非易失性温度告警触发器TH和TL。DSBl820可以从单总线获取电源,当信号线为高电平时,将能量贮存在内部电容器中;当单信号线为低电平时,将该电源断开,直到信号线变为高电平重新接上寄生(电容)电源为止。此外,还可外接5 V电源,给DSl8820供电。DSl8820的供电方式灵活,利用外接电源还可增加系统的稳定性和可靠性。图9为读取数据流程图。 开始 DS18B20的初始化 启动温度转换 读取温度寄存器 跳过读序列号的操作 跳过读序列号的操作 DS18B20的初始化 RET LOW-低八位 HIGH-高八位 图9 读取数据的流程图 读出温度数据后,LOW的低四位为温度的小数部分,可以精确到0.0625℃,LOW的高四位和HIGH的低四位为温度的整数部分,HIGH的高四位全部为1表示负数,全为0表示正数。所以先将数据提取出来,分为三个部分:小数部分、整数部分和符号部分。小数部分进行四舍五入处理:大于0.5℃的话,向个位进1;小于0.5℃的时候,舍去不要。当数据是个负数的时候,显示之前要进行数据转换,将其整数部分取反加一。还因为DS18B20最低温度只能为-55℃,所以可以将整数部分的最高位换成一个“-”,表示为负数。图10为温度数据处理程序的流程图。 开始 提取整数部分存入HT 提取小数部分存入LT LT右移三位,将精度降低到0.5摄氏度 HT++ 将小数部分整数化 提取符号部分存入sign LT是否大于5 Sign=?0XF0 RET 负数表示flag=1 HT=~HT+1 Y N N Y 图10 温度数据处理流程图 数据测试 将温度传感器与冰水混合物接触,经过充分搅拌达到热平衡后调节系统,使显示读数为0.00(标定0℃);利用气压计读出当时当地的大气压强,并根据大气压强和当地重力加速度计算出当时的实际压强;根据沸点与压强的关系查出沸点温度。把温度传感器放入沸水中,待显示读数稳定后重新调节,使显示器显示读数等于当地当时沸点温度后工作结束。该温度计的量程为-50℃~150℃,读数精度为0.1℃,实际使用一般在0℃~100℃。采用0℃~50℃和50℃~100℃的精密水银温度计作检验标准,对设计的温度计进行测试,其结果表明能达到该精度要求。 总结与体会 作为一名电子信息工程的大四学生,我觉得做单片机课程设计是很有意义的,而且也是必要的。在做这次课程设计的过程中,我感触最深的当属查阅大量的设计资料了。为了让自己的设计更加完善,查阅这方面的实际资料是十分必要的,也是必不可少的。 其次,在这次课程设计中,我们运用了以前学过的专业课知识,如:proteus仿真、汇编语言、模拟和数字电路知识等。虽然过去我从未独立应用过他们,但在学习的过程中带着问题去学我发现效率很高,这是我做这次课程设计的又一收获。 最后,要做好一个课程设计,就必须做到:在设计程序之前,对所用单片机的内部结构有一个系统的了解,知道该单片机有哪些资源;要有一个清晰的思路和一个完整的软件流程图;在设计程序时,不能妄想一次将整个程序设计好,反复修改、不断改进是程序设计的必经之路;要养成注释程序的好习惯,这样为资料的保留和交流提供了方便;在设计中遇到的问题要记录,以免下次遇到同样的问题。 在这次的课程设计中,我真正的意识到,在以后的学习中,要理论联系实际,把我们所学的理论知识用到实际当中,学习单片机更是如此,程序只有在经常写与读的过程中才能提高,这就是这次课程设计的最大收获。 附录1 仿真图 附录2 程序源代码 DATA_BUS BIT P3.3 FLAG BIT 00H ;标志位 TEMP_L EQU 30H ;温度值低字节 TEMP_H EQU 31H ;温度值高字节 TEMP_DP EQU 32H ;温度小数 TEMP_INT EQU 33H ;温度值整数 TEMP_BAI EQU 34H ;温度百位数 TEMP_SHI EQU 35H ;温度十位数 TEMP_GE EQU 36H ;温度个位数 DIS_BAI EQU 37H ;显示百位数 DIS_SHI EQU 38H ;显示十位数 DIS_GE EQU 39H ;显示个位数 DIS_DP EQU 3AH ;显示小数位 DIS_ADD EQU 3BH ;显示地址 ORG 0000H AJMP START ORG 0050H ;初始化 START: MOV SP,#40H MAIN: LCALL READ_TEMP ;调读温度程序 LCALL PROCESS ;调数据处理程序 AJMP MAIN ;读温度程序 READ_TEMP: LCALL RESET_PULSE ;调用复位脉冲程序 MOV A,#0CCH ;跳过ROM命令 LCALL WRITE MOV A,#44H ;读温度 LCALL WRITE LCALL DISPLAY ;显示温度 LCALL RESET_PULSE ;调用复位脉冲程序 MOV A,#0CCH ;跳过ROM命令 LCALL WRITE MOV A,#0BEH ;读缓存命令 LCALL WRITE LCALL READ RET ;复位脉冲程序 RESET_PULSE: RESET: SETB DATA_BUS NOP NOP CLR DATA_BUS MOV R7,#255 DJNZ R7,$ SETB DATA_BUS MOV R7,#30 DJNZ R7,$ JNB DATA_BUS,SETB_FLAG CLR FLAG AJMP NEXT SETB_FLAG: SETB FLAG NEXT: MOV R7,#120 DJNZ R7,$ SETB DATA_BUS JNB FLAG,RESET RET ;写命令 WRITE: SETB DATA_BUS MOV R6,#8 CLR C WRITING: CLR DATA_BUS MOV R7,#5 DJNZ R7,$ RRC A MOV DATA_BUS,C MOV R7,#30H DJNZ R7,$ SETB DATA_BUS NOP DJNZ R6,WRITING RET ;循环显示段位 DISPLAY: MOV R4,#200 DIS_LOOP: MOV A,DIS_DP MOV P2,#0FFH MOV P0,A CLR P2.7 LCALL DELAY2MS MOV A,DIS_GE MOV P2,#0FFH MOV P0,A SETB P0.7 CLR P2.6 LCALL DELAY2MS MOV A,DIS_SHI MOV P2,#0FFH MOV P0,A CLR P2.5 LCALL DELAY2MS MOV A,DIS_BAI MOV P2,#0FFH MOV P0,A MOV A,TEMP_BAI CJNE A,#0,SKIP AJMP NEXTT SKIP: CLR P2.4 LCALL DELAY2MS NEXTT: NOP DJNZ R4,DIS_LOOP RET ;读命令 READ: SETB DATA_BUS MOV R0,#TEMP_L MOV R6,#8 MOV R5,#2 CLR C READING: CLR DATA_BUS NOP NOP SETB DATA_BUS NOP NOP NOP NOP MOV C,DATA_BUS RRC A MOV R7,#30H DJNZ R7,$ SETB DATA_BUS DJNZ R6,READING MOV @R0,A INC R0 MOV R6,#8 SETB DATA_BUS DJNZ R5,READING RET ;数据处理 PROCESS: MOV R7,TEMP_L MOV A,#0FH ANL A,R7 MOV TEMP_DP,A MOV R7,TEMP_L MOV A,#0F0H ANL A,R7 SWAP A MOV TEMP_L,A MOV R7,TEMP_H MOV A,#0FH ANL A,R7 SWAP A ORL A,TEMP_L MOV B,#64H DIV AB MOV TEMP_BAI,A MOV A,#0AH XCH A,B DIV AB MOV TEMP_SHI,A MOV TEMP_GE,B MOV A,TEMP_DP MOV DPTR,#TABLE_DP MOVC A,@A+DPTR MOV DPTR,#TABLE_INTER MOVC A,@A+DPTR MOV DIS_DP,A MOV A,TEMP_GE MOV DPTR,#TABLE_INTER MOVC A,@A+DPTR MOV DIS_GE,A MOV A,TEMP_SHI MOV DPTR,#TABLE_INTER MOVC A,@A+DPTR MOV DIS_SHI,A MOV A,TEMP_BAI MOV DPTR,#TABLE_INTER MOVC A,@A+DPTR MOV DIS_BAI,A RET DELAY2MS: MOV R6,#3 LOOP3: MOV R5,#250 DJNZ R5,$ DJNZ R6,LOOP3 RET TABLE_DP: DB 00H,01H,01H,02H,03H,03H,04H,04H,05H,06H DB 06H,07H,08H,08H,09H,09H TABLE_INTER: DB 03FH,006H,05BH,04FH,066H DB 06DH,07DH,07H,07FH,06FH 【单片机课程设计 -可调数字钟 (来自河北大学)】推荐阅读: 单片机课程设计05-11 单片机原理课程设计05-14 单片机课程设计学生07-07 11级单片机课程设计任务书06-08 单片机课程08-04 单片机原理课程06-18 单片机课程实践教学05-12 单片机课程教学研究论文05-13 单片机课程学习总结报告05-21单片机课程设计 -可调数字钟 (来自河北大学) 篇2
单片机课程设计 -可调数字钟 (来自河北大学) 篇3