最新西安交通大学电子系统设计c51单片机数字钟实验.docx
- 文档编号:28275318
- 上传时间:2023-07-10
- 格式:DOCX
- 页数:16
- 大小:43.05KB
最新西安交通大学电子系统设计c51单片机数字钟实验.docx
《最新西安交通大学电子系统设计c51单片机数字钟实验.docx》由会员分享,可在线阅读,更多相关《最新西安交通大学电子系统设计c51单片机数字钟实验.docx(16页珍藏版)》请在冰豆网上搜索。
最新西安交通大学电子系统设计c51单片机数字钟实验
n
单片机数字钟
实验报告
姓名:
高航
班级:
信息43
学号:
2140502058
PART1实验目的
在单片机c51实验板上编程实现2017年日历和实时时钟:
1.时-分-秒(2位-2位-2位)显示;
2.可通过按键置入时间值(参照电子表设置时间工作模式);
3.可通过按键控制在LED上从右向左滚动显示年_月_日3次,如:
2013_01_20空空2013_01_20;
4.实现每日闹铃提醒功能,闹铃时间可用按键设置。
闹铃采用提示音表示;
5.实现秒表功能;
6.实现定时器功能(预置定时时间,按键启动,倒计时,计到0响提示音;
7.设计实现音乐提示音;
8.能够在短时间按要求修改。
PART2实验流程图
1.总流程图
2.设置时间/日期/闹钟模块dis()
3.音乐模块music()
PART3实验代码
代码使用资源:
ProgramSize:
data=102.0xdata=0code=2420
#include
#include
#defineuintunsignedint
#defineucharunsignedchar
uchart0h,t0l,timeaaa;
ucharcodeFREQH[]={0x01,//0的时候没有音符
0xF2,0xF3,0xF5,0xF5,0xF6,0xF7,0xF8,//低音1234567
0xF9,0xF9,0xFA,0xFA,0xFB,0xFB,0xFC,0xFC,//1,2,3,4,5,6,7,i
0xFC,0xFD,0xFD,0xFD,0xFD,0xFE,//高音234567
0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFF};//超高音1234567
ucharcodeFREQL[]={0x01,//0的时候没有音符
0x42,0xC1,0x17,0xB6,0xD0,0xD1,0xB6,//低音1234567
0x21,0xE1,0x8C,0xD8,0x68,0xE9,0x5B,0x8F,//1,2,3,4,5,6,7,i
0xEE,0x44,0x6B,0xB4,0xF4,0x2D,//高音234567
0x47,0x77,0xA2,0xB6,0xDA,0xFA,0x16};//超高音1234567
ucharcodetiger[]={
3,2,2,6,2,2,7,2,2,5,2,2,
3,2,2,6,2,2,7,2,2,5,2,2,
7,2,2,1,3,2,2,3,4,
7,2,2,1,3,2,2,3,4,
2,3,1,3,3,1,2,3,1,1,3,1,7,2,2,5,2,2,
2,3,1,3,3,1,2,3,1,1,3,1,7,2,2,5,2,2,
6,2,2,2,2,2,5,2,4,6,2,2,2,2,2,5,2,4,
0,0,0};
sbitaa=P1^6;
unsignedchartime[]={0,0,0x08,0,0,0x08,0,0};//时间显示数组
unsignedchartimeZ[]={0,0,0x08,0,0,0x08,0,0};//闹钟显示数组
unsignedchartimeD[]={0,0,0x08,0,0,0x08,0,0};//倒计时显示数组
unsignedchartimeN[]={0,0,0x08,0,0,0x08,0,0};//秒表显示数组
unsignedchardateset[]={0,0,0x08,0,0,0x08,0,0};//riqishezhi显示数组
unsignedcharcodenum[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};//数字
unsignedchardate[]={0,0,0,0,0,0,0,0,0,0,0,0,0x08,0,0,0x08,0,0,0,0,0,0,0,0};//日期显示
unsignedcharsec=0,min=0,hour=0,day=24,mon=10,j,t,a,p;
intyear=2017;
unsignedcharsecZ=0,minZ=1,hourZ=0;
unsignedcharsecD,minD,hourD;
unsignedchartsec,secN,minN,tsecm;
*****************************LED显示延时函数********************************
voiddelay(unsignedcharp){
unsignedchari,j;
for(;p>0;p--)
for(i=5;i>0;i--)
for(j=120;j>0;j--);}
*******************************获取按键函数***********************************
unsignedchargetkeycode(void){
unsignedcharline=0x00;/*行码*/
unsignedcharcol=0x00;/*列码*/
unsignedcharscancode=0x01;/*行扫描码*/
unsignedcharkeycode;/*键号*/
XBYTE[0x8000]=0xff;
col=XBYTE[0x8000]&0x0f;/*从列端口读入四位列码*/
if(col==0x00)
keycode=0x00;
else
{
while((scancode&0x0f)!
=0)/*取scancode的低四位,没变为全0,循环*/
{
line=scancode;/*行号*/
XBYTE[0x8000]=scancode;/*给行赋扫描码,第一行为0x01*/
if((XBYTE[0x8000]&0x0f)==col)/*检测按键所在的行跳出循环*/
break;
scancode=scancode<<1;/*行扫描码左移一位,转下一行*/
}
col=col<<4;/*把列码移到高四位*/
keycode=col|line;
}
returnkeycode;
}
*******************************时间显示函数***********************************
voidtimedis(){
XBYTE[0X9000]=0;
for(j=0;j<8;j++)
{
time[0]=num[sec%10];
time[1]=num[sec/10];
time[3]=num[min%10];
time[4]=num[min/10];
time[6]=num[hour%10];
time[7]=num[hour/10];
delay
(1);
XBYTE[0X8000]=0x01< XBYTE[0X9000]=time[j]; }}//timeshow *******************************闹钟显示函数*********************************** voidtimedisZ(){ XBYTE[0X9000]=0; for(j=0;j<8;j++) { timeZ[0]=num[secZ%10]; timeZ[1]=num[secZ/10]; timeZ[3]=num[minZ%10]; timeZ[4]=num[minZ/10]; timeZ[6]=num[hourZ%10]; timeZ[7]=num[hourZ/10]; delay (1); XBYTE[0X8000]=0x01< XBYTE[0X9000]=timeZ[j]; }} *******************************秒表显示函数*********************************** voidtimedisN(){ while (1){ for(;tsec==20;){tsec=0;secN++; if(secN==60){minN++;secN=0;} } if(getkeycode()==0x84)break; XBYTE[0X9000]=0; for(j=0;j<8;j++) { timeN[0]=num[tsec%10]; timeN[1]=num[tsec/10]; timeN[3]=num[secN%10]; timeN[4]=num[secN/10]; timeN[6]=num[minN%10]; timeN[7]=num[minN/10]; delay (1); XBYTE[0X8000]=0x01< XBYTE[0X9000]=timeN[j]; //if(getkeycode()==0x84)break; }}}//秒表 *****************************倒计时显示函数*********************************** voidtimedisD(){while (1){ if(minD==0&&secD==0)break; XBYTE[0X9000]=0; for(j=0;j<8;j++) { timeD[0]=num[secD%10]; timeD[1]=num[secD/10]; timeD[3]=num[minD%10]; timeD[4]=num[minD/10]; timeD[6]=num[hourD%10]; timeD[7]=num[hourD/10]; delay (1); XBYTE[0X8000]=0x01< XBYTE[0X9000]=timeD[j];} }} *******************************日期显示函数*********************************** voiddatedis() { unsignedchari,j,k; for(i=0;i<17;i++) {for(k=0;k<20;k++) for(j=0;j<8;j++) {date[13]=num[day/10]; date[14]=num[day%10]; date[16]=num[mon/10]; date[17]=num[mon%10]; date[11]=num[year%10]; date[10]=num[(year%100)/10]; date[9]=num[(year%1000)/100]; date[8]=num[year/1000]; XBYTE[0X8000]=0x80>>j; XBYTE[0X9000]=date[i+j]; delay (1);}}}//dateshow//downtozerobibii ****************************年月日设置显示函数******************************* voiddatedis1(){ XBYTE[0X9000]=0; for(j=0;j<8;j++) { dateset[6]=num[year%10]; dateset[7]=num[(year%100)/10]; dateset[3]=num[mon%10]; dateset[4]=num[mon/10]; dateset[0]=num[day%10]; dateset[1]=num[day/10]; delay (1); XBYTE[0X8000]=0x01< XBYTE[0X9000]=dateset[j]; }} *******************************时间设置函数*********************************** voidset(){unsignedchari=0; {for(i=0;i<3;){timedis(); if(getkeycode()==0x11){delay(100);i++;} if(getkeycode()==0x21){delay(100); switch(i){ case0: sec++;if(sec==60){sec=0;}break; case1: min++;if(min==60){min=0;}break; case2: hour++;if(hour==24){hour=0;}break; default: break; }} }} }//时间设置//timeset *******************************闹钟设置函数*********************************** voidsetZ(){unsignedchari=0; {for(i=0;i<3;) {timedisZ(); if(getkeycode()==0x11){delay(100);i++;} if(getkeycode()==0x21){delay(100); switch(i){ case0: secZ++;if(secZ==60){secZ=0;}break; case1: minZ++;if(minZ==60){minZ=0;}break; case2: hourZ++;if(hourZ==24){hourZ=0;}break; default: break; }} }} }//alarmset *******************************日期设置函数*********************************** voidsetdate(){unsignedchari=0; {for(i=0;i<3;){datedis1(); if(getkeycode()==0x11){delay(100);i++;} if(getkeycode()==0x21){delay(100); switch(i){ case0: day++;if(day==32){day=0;}break; case1: mon++;if(mon==13){mon=0;}break; case2: year++;break; default: break; }} }} } *****************************定时器0中断函数********************************* voidtimer()interrupt1{ t++;//计数溢出后t++ if(getkeycode()==0x82){tsec=0;secN=0;minN=0;} if(getkeycode()! =0x22){tsec++;} if(t==20)//1s { if(getkeycode()==0x48){while (1){set();break;}}//进入时间设置 if(getkeycode()==0x14){while (1){setdate();break;}}//日期设置 sec++;t=0; secD--;if(secD==(-1)){secD=59;minD--;} if(minD==(-1)){minD=59;} if(sec==60){sec=0;min++;} if(min==60){min=0;hour++;} if(hour==24){hour=0;day++;} if((day==32)&&(mon==1||mon==3||mon==5||mon==7||mon==8||mon==10||mon==12)){day=1;mon++;} if((day==31)&&(mon==4||mon==6||mon==9||mon==11)){day=1;mon++;} if(year%4==0&&year%400! =0&&mon==2&&day>=30){day=1;mon++;} if(year%4! =0&&mon==2&&day>=29){day=1;mon++;} }} voidreset(void){ t=0; TMOD=0x01;//模式选择 TL0=0xb0; TH0=0x3c;//TH1=(65536-9216)/256;TL1=(65536-9216)%256; PT0=0;//定时器优先 ET0=1;//定时器中断允许 TR0=1;//开始定时 EA=1;//cpu允许stop }//timegoon *****************************定时器1中断函数********************************* voidt0int()interrupt3{ TR1=0;//先关闭T0 aa=~aa;//输出方波,发音 TH1=t0h;//下次的中断时间,这个时间,控制音调高低 TL1=t0l; TR1=1;//启动T0 } voiddelayaaa(uchart){ uchara; while(t--)//四重循环,共延时t个1/4拍 { /*for(c=193;c>0;c--) for(b=114;b>0;b--)//114*/ for(a=10;a>0;a--){timedis();} }//延时期间,可进入T0中断去发音 //timedis();没用 TR1=0;//关闭T0,停止发音 } voidsingachar(){ TR1=0; TH1=t0h;//控制音调 TL1=t0l; TR1=1;//启动T0,由T0输出方波去发音 delayaaa(timeaaa);//控制时间长度即节拍 } voidsong(uchar*str){ uchark,i; i=0; timeaaa=1; while(timeaaa) { k=str[i]+7*(str[i+1]);//第i个是音符,第i+1个是第几个八度 t0h=FREQH[k];//从数据表中读出频率数值 t0l=FREQL[k];//实际上,是定时的时间长度 timeaaa=str[i+2];//读出时间长度数值节拍时间 i+=3; singachar(); if(getkeycode()==0x22)break;//stopnoise } } voidmusic(void){ TMOD=0x01;//置T0定时工作方式1 ET1=1;//开T0中断 EA=1;//开CPU中断 while (1) { song(tiger); aa=1; if(getkeycode()==0x22)break; delayaaa(20); (四)大学生对手工艺制品消费的要求//timedis(); }} 当然,在竞争日益激烈的现代社会中,创业是件相当困难的事。 我们认为,在实行我们的创业计划之前,我们首先要了解竞争对手,吸取别人的经验教训,制订相应竞争的策略。 我相信只要我们的小店有自己独到的风格,价格优惠,服务热情周到,就一定能取得大多女孩的信任和喜爱。 *********************************MAIN函数************************************ 8、你是如何得志DIY手工艺制品的? voidmain(){ (三)上海的文化对饰品市场的影响reset(); while (1){ 300元以下918%timedis(); if(getkeycode()==0x88){setZ();}//闹钟设置 if(getkeycode()==0x28){for(p=0;p<3;p++){datedis();}}//日期 if(getkeycode()==0x18){secD=20;minD=0;timedisD(); 附件 (二): if(minD==0&&secD==0){music();}}//倒计时 (1)价格低if(getkeycode()==0x44){minN=0;tsec=0;secN=0;timedisN();}//秒表 if(secZ==sec&&minZ==min&&hourZ==hour){music();} } } ************************************OVER************************************** 1、你一个月的零用钱大约是多少? PART4实验心得 标题: 大学生“负债消费“成潮流2004年3月18日实验虽然已经验收完毕,但收获却是弥足珍贵。 一分耕耘,一分收获。 部亲自去尝试,你很难去体验那份开心。 在写代码的过程中,我遇到了很多难题,百思不得其解,最终在一次一次的修改与调试中圆满达到目标;这让我明白,只有勤于思考,不断的尝试,才能突破迷津。 自制性手工艺品。 自制饰品其实很简单,工艺一点也不复杂。 近两年来,由于手机的普及,自制的手机挂坠特别受欢迎。 在完成代码的过程中,我也受到了一些同学的很大帮助。 经过与别人的讨论,往往能更快更有效地解决问题。 我经过了对单片机由一无所知到逐步了解,现在开始了一些小的制作。 课程设计是一项好的方向,让我们去自我提高,很有裨益。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 最新 西安交通大学 电子 系统 设计 c51 单片机 数字 实验
![提示](https://static.bdocx.com/images/bang_tan.gif)