• 705.50 KB
  • 28页

单片机时钟设计报告范本(word档)

  • 28页
  • 当前文档由用户上传发布,收益归属用户
  1. 1、本文档共5页,可阅读全部内容。
  2. 2、本文档内容版权归属内容提供方,所产生的收益全部归内容提供方所有。如果您对本文有版权争议,可选择认领,认领后既往收益都归您。
  3. 3、本文档由用户上传,本站不保证质量和数量令人满意,可能有诸多瑕疵,付费之前,请仔细先通过免费阅读内容等途径辨别内容交易风险。如存在严重挂羊头卖狗肉之情形,可联系本站下载客服投诉处理。
  4. 文档侵权举报电话:19940600175。
'单片机课程设计院系:电子工程信息学院姓名:学号:班号:12级电子通信313班指导教师:日期:2013.05.28 目录第一部分元器件的购买和电路板的焊接1.元器件清单:USB电源借口,四位一体共阴数码管,电阻:铝电解电容器,电阻,晶振,瓷片电容器两个,电阻若干2.电路板原理图,单片机,单片机芯片,电源指示灯3.焊接第二部分1.编程软件的学习2.简单的LED和液晶显示第三部分时钟的设计1.总体设计2.硬件设计3.软件设计第四部分实习心得体会 通过学习单片机我懂得了不只要在书本上花时间,还要动手去做,去实践,手脑结合,学习效果会更好,锻炼自己动手的能力更能突出自己的聪明才智,单片机在现实社会当中已经普片存在了,越来越多的电子产品牵涉到单片机的应用了,单片机在电子产品当中已经占主要市场了,所以我要学好这门技术,为自己的梦想从现在开始奋斗吧 第一部分元器件的购买和电路板的焊接1.元器件清单(见附录)2.电路板原理图11041204 12041104通过和班长去广埠屯购买元件,对购买元器件有了一定的了解。另外通过对开发板硬件的学习,熟知了很多元器件的功能。 3.焊接以下是完成后的开发板:通过对开发板的焊接,首先对焊接技巧有了一定的掌握,另外对一些电路图有了一定的认识,并初步了解了一些基本的原理,如A/D转换,复位电路等。 第二部分1.编程软件的学习首先,在上课期间了解了wave,在暑假集中学习了keil.以下是keil编程的主要步骤:1、点击KeiluVision4→File→New可新建一个工程文件。点击KeiluVision4→File→Save可保存并重命名新建的工程文件。工程文件的名称后缀为.c2、点击KeiluVision4→Project→NewProject...可新建并重命名一个工程;点击“保存”按钮后,选择对应的单片机型号3、在SourceGroup1上右键单击AddFilestoGroup‘SourceGroup1’为工程添加相应的工程文件4、在工程文件中写入单片机程序,点击保存按钮保存文件5、如果程序出现错误,在OutputWindow窗口会有错误和告警提示,修改并重新编译程序内容,直到OutputWindow窗口出现“0Error(s),0Warning(s)”。2.简单的LED和液晶的显示通过课程和编程软件的学习,可以编写一些基本的程序,比如数码管可以实现计时,闪烁,键盘扫描,移位,清屏;液晶可以实现按键显示。以下是C语言源程序: #include"reg51.h"#include"1602.h"unsignedchart;unsignedcharLed[8]={1,2,3,4,5,6,7,8};unsignedcharLed1[8]={0x00,0x21,0x42,0x63,0x84,0xa5,0xc6,0xe7};unsignedcharKeyV=0;unsignedcharcodeKey[16]={0xeb,0x77,0x7b,0x7d,//01230xb7,0xbb,0xbd,0xd7,//45670xdb,0xdd,0x7e,0xbe,//89ab0xde,0xee,0xe7,0xed,//cd*#};unsignedcharcodeA[]={0X00,0X01,0X02,0X03,0X04,0X05,0X06,0X07,0X08,0X09};unsignedcharSecondL;unsignedcharSecondH;unsignedcharMinuteL;unsignedcharMinuteH;unsignedcharHourL;unsignedcharHourH;unsignedcharcnt;voiddelay(){unsignedchart;t=200;while(t--);}voiddly(){unsignedintq;q=2000;while(q--);}voiddisplay(){unsignedchari,P1Buf; for(i=0;i<=7;i++){P1Buf=i*2;P1Buf=P1Buf<<4;P1Buf=P1Buf+Led[i];P1=P1Buf;delay();}}/*0为放开,1为未放开*/unsignedcharup(){unsignedcharP0Buf;P0=0xf0;delay();P0Buf=P0;return(P0Buf-0xf0);}voidscan(){unsignedcharP0Buf,P0Buf2,i;P0=0xf0;P0Buf=P0;if(P0Buf!=0xf0){dly();P0=0xf0;P0Buf=P0;if(P0Buf!=0xf0){P0=0x0f;P0Buf2=P0;P0Buf=P0Buf+P0Buf2;KeyV=P0Buf;while(up());/*判断按键放开*/for(i=0;i<=15;i++){if(KeyV==Key[i]){KeyV=i;break;}} for(i=7;i>0;i--){Led[i]=Led[i-1];}Led[0]=KeyV;}}}voidtimer0()interrupt1{unsignedcharcnt;TH0=(65536-50000)/256;TL0=(65536-50000)%256;cnt++;if(cnt>=20){cnt=0;++SecondL;if(SecondL==10){SecondL=0;++SecondH;if(SecondH==6){SecondH=0;++MinuteL;if(MinuteL==10){MinuteL=0;++MinuteH;if(MinuteH==6){MinuteH=0;++HourL;if(HourL==10){HourL==0;++HourH;}if(HourH>=2&HourL>=4){HourH=0;HourL=0;} }}}}}}voidshizhong(){TMOD=0x01;TH0=(65536-50000)/256;TL0=(65536-50000)%256;EA=1;ET0=1;TR0=1;KeyV=0;while(1){scan();if(KeyV==11){P1=0x0a;KeyV=0;while(up());do{scan();}while(!KeyV);HourH=KeyV;KeyV=0;while(up());do{scan();}while(!KeyV);HourL=KeyV;KeyV=0;while(up());do{scan();}while(!KeyV);MinuteH=KeyV;KeyV=0;while(up());do{scan();}while(!KeyV);MinuteL=KeyV;KeyV=0;while(up()); do{scan();}while(!KeyV);SecondH=KeyV;KeyV=0;while(up());do{scan();}while(!KeyV);SecondL=KeyV;if(HourH>=2&HourL>=4){HourH=0;HourL=0;}}if(KeyV==10){P1=0x0a;break;}P1=A[SecondL]+0x00;delay();P1=A[SecondH]+0x20;delay();P1=A[MinuteL]+0x40;delay();P1=A[MinuteH]+0x60;delay();P1=A[HourL]+0x80;delay();P1=A[HourH]+0xA0;delay();}}voidjianpan(){while(1){if(KeyV==10){P1=0x0a;break;}scan();display();}}voidtimer1()interrupt3{t++;TL1=(65536-50000)%256;TH1=(65536-50000)/256; }voidsanshuo(){TL1=(65536-50000)%256;TH1=(65536-50000)/256;EA=1;ET1=1;TR1=1;while(1){scan();if(KeyV==10){P1=0x0a;break;}if(t>=20){P1=0x0a;t=0;while(t<=20);t=0;}P1=0x01;delay();P1=0x22;delay();P1=0x43;delay();P1=0x64;delay();P1=0x85;delay();P1=0xa6;delay();P1=0xc7;delay();P1=0xe8;delay();}}voidyejing(){unsignedcharx,y;//显示坐标unsignedchartmp;//用于暂存dly();LcdInit();//LCD初始化WrtLcdCmd();//清显示SetCursor(0,0);//光标复位进入工作状态 Display(0,0,"danpianjiyanshi");//欢迎画面SetCursor(0,1);Display(0,1,"zhanglin");dly();}voidmain(){while(1){do{scan();}while(!KeyV);switch(KeyV){case12:yejing();break;case13:sanshuo();break;case14:jianpan();break;case15:shizhong();break;case16:break;}}}第三部分时钟的设计1.总体设计本系统选用MCS-51系列单片机为主控机,通过扩展必要的外围接口电路,实现对时钟的设计。具体设计如下:(1)由于要设计的是简单的时钟,为了得到较好的显示效果,采用LCD显示时间。(2)键盘采用PS2键盘,除了数字键输入时间外,“+”设置时间,“—”设置闹钟,“.”跳出闹钟。(3)执行过程:开机LCD显示时间,当键入按键,执行相应的功能。 2、硬件设计本设计选用AT89C51单片机为主控单元。显示部分:采用LCD静态显示。按键部分:PS2键盘。3、软件设计时钟程序:#include#include"1602.h"#include"absacc.h"#include"intrins.h"#include"PS2.h"sbitcs=P2^0;//片选信号sbitRead_enable=P3^7;//读使能信号sbitLed_clock=P3^1;//LED模拟闹钟unsignedcharnum1,num2,num3,num4,num5,num6;//存储显示时间信息unsignedcharmiao=0,fen=0,shi=0,ri=0,yue=0,nian=0;//存储设置时间信息unsignedchartemp1=0,temp2=0,temp3=0,temp4=0,temp5=0,temp6=0;//存储闹钟时间信息unsignedcharshuju[15]={"0"},shuju2[15]={0},shuju3[15]={"0"},shuju4[15]={0};charflag=1,flag1=1,flag3=1;//标志位/*************命令常量定义**************/#defineCMD_START_DS12C8870x20//开启时钟芯片#defineCMD_START_OSCILLATOR0x70//开启振荡器,处于抑制状态/*******************所有的置位使用或操作,清除使用与操作****************/#defineMASK_SETB_DM0x04//使用二进制格式#defineMASK_CLR_DM0xfb//使用BCD码格式#defineMASK_SETB_24120x02//使用24小时模式#defineMASK_CLR_24120xfd//使用12小时模式//************寄存器地址通道定义********************//xdatacharchSecondsChannel_at_0xfe00;xdatacharchMinutesChannel_at_0xfe02;xdatacharchHoursChannel_at_0xfe04;xdatacharchDofWChannel_at_0xfe06;xdatacharchDateChannel_at_0xfe07;xdatacharchMonthChannel_at_0xfe08;xdatacharchYearChannel_at_0xfe09;xdatacharchCenturyChannel_at_0xfe32;xdatacharchRegA_at_0xfe0a;xdatacharchRegB_at_0xfe0b; xdatacharchRegC_at_0xfe0c;xdatacharchRegD_at_0xfe0d;//******************函数声明部分****************************//voiddisplay(void);voidStartDs12c887(void);voidCloseDs12c887(void);voidInitDs12c887(void);unsignedcharGetSeconds(void);unsignedcharGetMinutes(void);unsignedcharGetHours(void);unsignedcharGetDate(void);unsignedcharGetMonth(void);unsignedcharGetYear(void);unsignedcharGetCentury(void);voidSetTime(unsignedcharchSeconds,unsignedcharchMinutes,unsignedcharchHours);voidSetDate(unsignedcharchDate,unsignedcharchMonth,unsignedcharchYear);/***********延时函数*****************/voidDly_mS(unsignedintms){unsignedinti;while(ms--)for(i=0;i<75;i++);}voidDly_S(unsignedlongintno){unsignedlonginti;for(;no>0;no--)for(i=0;i<7244;i++);}/************************启动时钟芯片工作***************************/voidStartDs12c887(void){chRegA=CMD_START_DS12C887;}/***************************关闭时钟芯片**************************//*voidCloseDs12c887(void){chRegA=CMD_CLOSE_DS12C887;}*//**********************从时钟芯片读取秒字节*******************/unsignedcharGetSeconds(void){ return(chSecondsChannel);}/**********************从时钟芯片读取分字节********************/unsignedcharGetMinutes(void){return(chMinutesChannel);}/********************从时钟芯片读取小时字节********************/unsignedcharGetHours(void){return(chHoursChannel);}/*******************从时钟芯片读取日字节**********************/unsignedcharGetDate(void){return(chDateChannel);}/******************从时钟芯片读取月字节*********************/unsignedcharGetMonth(void){return(chMonthChannel);}/********************从时钟芯片读取年字节********************/unsignedcharGetYear(void){return(chYearChannel);}/*******************设置时钟芯片的时间******************/voidSetTime(unsignedcharchSeconds,unsignedcharchMinutes,unsignedcharchHours){chRegB=0x86;//禁止刷新chSecondsChannel=chSeconds;chMinutesChannel=chMinutes;chHoursChannel=chHours;chRegB=0x06;//使能刷新}/******************设置时钟芯片的日期*****************/voidSetDate(unsignedcharchDate,unsignedcharchMonth,unsignedcharchYear){chRegB=0x86;//禁止刷新chDateChannel=chDate;chMonthChannel=chMonth;chYearChannel=chYear;chRegB=0x06;//使能刷新 }/*****************显示时间日期***********************/voiddisplay(void){unsignedchary,l,m,w,n,o,p,q;unsignedcharz,x,c,b;z=num1/10;//秒x=num1%10;c=num2/10;//分b=num2%10;n=num3/10;//时o=num3%10;p=num4/10;//日q=num4%10;w=num5/10;//月l=num5%10;m=num6/10;//年y=num6%10;WrtLcdCmd(0x81);WrtLcdData(0x30+n);WrtLcdCmd(0x82);WrtLcdData(0x30+o);Display(3,0,":");WrtLcdCmd(0x84);WrtLcdData(0x30+c);WrtLcdCmd(0x85);WrtLcdData(0x30+b);Display(6,0,":");WrtLcdCmd(0x87);WrtLcdData(0x30+z);WrtLcdCmd(0x88);WrtLcdData(0x30+x);WrtLcdCmd(0xc1);WrtLcdData(0x30+m);WrtLcdCmd(0xc2);WrtLcdData(0x30+y);Display(3,1,":");WrtLcdCmd(0xc4);WrtLcdData(0x30+w);WrtLcdCmd(0xc5);WrtLcdData(0x30+l);Display(6,1,":");WrtLcdCmd(0xc7);WrtLcdData(0x30+p);WrtLcdCmd(0xc8); WrtLcdData(0x30+q);}/*************************设置时间日期**********************/voidSettime(){unsignedcharx,y,i,t=0,m=12;WrtLcdCmd(Clear);//清显示SetCursor(0,0);//光标复位进入工作状态Display(0,0,"Pleaseinter");//画面设置Dly_S(1);//延时2sDly_S(1);WrtLcdCmd(Clear);//清显示();SetCursor(0,0);WrtLcdCmd(AllOn);x=y=0;i=0;while(flag){while(KeyPress==0);//等待有键按下KeyPress=0;//按键标识清零DispOneChar(x,y,KeyChar);//显示坐标x++;shuju[i++]=KeyChar;//存储键值字符if((x==6)&&(y==0)){y=1;x=0;//换行}if((x==6)&&(y==1)){x=0;y=0;flag=0;//y=0;x=0;//显示坐标归零}}WrtLcdCmd(Clear);//清显示Dly_S(1);i=0;t=0;m=12;//再次赋值while(m--)//数据转换函数{switch(shuju[i++]){case"0":shuju2[t++]=0;break;case"1":shuju2[t++]=1;break;case"2":shuju2[t++]=2;break; case"3":shuju2[t++]=3;break;case"4":shuju2[t++]=4;break;case"5":shuju2[t++]=5;break;case"6":shuju2[t++]=6;break;case"7":shuju2[t++]=7;break;case"8":shuju2[t++]=8;break;case"9":shuju2[t++]=9;break;default:break;}}miao=shuju2[10]*10+shuju2[11];fen=shuju2[8]*10+shuju2[9];shi=shuju2[6]*10+shuju2[7];ri=shuju2[4]*10+shuju2[5];yue=shuju2[2]*10+shuju2[3];nian=shuju2[0]*10+shuju2[1];SetDate(nian,yue,ri);//设置日期SetTime(shi,fen,miao);//设置时间flag=1;i=0;t=0;//所有标志清零}/*******************显示完成设置***************************/voidWangcheng(){WrtLcdCmd(Clear);//清显示Display(0,0,"zhupengjian");//完成画面Display(0,1,"O(∩_∩)OO(∩_∩)O");Dly_S(1);WrtLcdCmd(Clear);//清显示Dly_S(1);Read_enable=1;num1=GetSeconds();num2=GetMinutes();num3=GetHours();num4=GetDate();num5=GetMonth();num6=GetYear();display();Read_enable=0;}/***************************设置闹钟************************/voidSetclock(){unsignedcharx,y,j,s=0,n=12; WrtLcdCmd(Clear);//清显示SetCursor(0,0);//光标复位进入工作状态Display(0,0,"Setclock");//画面设置Dly_S(1);Dly_S(1);WrtLcdCmd(Clear);//清显示();SetCursor(0,0);WrtLcdCmd(AllOn);x=y=0;j=0;while(flag1){while(KeyPress==0);//等待有键按下KeyPress=0;//按键标识清零DispOneChar(x,y,KeyChar);//显示坐标x++;shuju3[j++]=KeyChar;if((x==6)&&(y==0)){y=1;x=0;//换行}if((x==6)&&(y==1)){x=0;y=0;flag1=0;//y=0;x=0;//显示坐标归零}}WrtLcdCmd(Clear);//清显示Dly_S(1);j=0;s=0;n=12;while(n--){switch(shuju3[j++]){case"0":shuju4[s++]=0;break;case"1":shuju4[s++]=1;break;case"2":shuju4[s++]=2;break;case"3":shuju4[s++]=3;break;case"4":shuju4[s++]=4;break;case"5":shuju4[s++]=5;break;case"6":shuju4[s++]=6;break;case"7":shuju4[s++]=7;break;case"8":shuju4[s++]=8;break;case"9":shuju4[s++]=9;break; default:break;}}temp1=shuju4[10]*10+shuju4[11];temp2=shuju4[8]*10+shuju4[9];temp3=shuju4[6]*10+shuju4[7];temp4=shuju4[4]*10+shuju4[5];temp5=shuju4[2]*10+shuju4[3];temp6=shuju4[0]*10+shuju4[1];flag1=1;j=0;s=0;}/****************************停止闹钟****************************/voidStopclock(){WrtLcdCmd(Clear);//清显示SetCursor(0,0);//光标复位进入工作状态Display(0,0,"Stopclock");//画面设置Dly_S(1);Dly_S(1);WrtLcdCmd(Clear);//清显示Led_clock=1;flag3=0;}/**********************摁键功能***********************/voidcheckkey(){switch(KeyChar){case"+":Settime();break;case"-":Setclock();break;case"*":Wangcheng();break;case".":Stopclock();break;default:break;}}/*******************主函数*******************************/voidmain(){cs=0;Led_clock=1;LcdInit();//lcd初始化 InitDs12c887();//时钟初始化//StartDs12c887();//启动时钟/*//XBYTE[0xfe00+0x09]=11;//yearset;//XBYTE[0xfe00+0x08]=8;//monthset;//XBYTE[0xfe00+0x07]=16;//dateset;//XBYTE[0xfe00+0x04]=10;//hourset;//XBYTE[0xfe00+0x02]=20;//minset;//XBYTE[0xfe00+0x00]=20;//secset;*///另一种时间设置,绝对地IT0=0;//设外部中断0为低电平触发EX0=1;//开中断0EA=1;while(1){if((XBYTE[0xfe00+0x0A]&0x80)==0){num6=XBYTE[0xfe00+0x09];//yearset;num5=XBYTE[0xfe00+0x08];//monthset;num4=XBYTE[0xfe00+0x07];//dateset;num3=XBYTE[0xfe00+0x04];//hourset;num2=XBYTE[0xfe00+0x02];//minset;num1=XBYTE[0xfe00+0x00];//secset;if((num1==temp1)&(num2==temp2)&(num3==temp3)&(num4==temp4)&(num5==temp5)&(num6==temp6)){while(flag3){Led_clock=0;//LED闪烁表示闹钟,等待停止Dly_S(1);Dly_S(1);Led_clock=1;Dly_S(1);Dly_S(1);if(KeyPress==1)//有键按下{KeyPress=0;//按键标识清零checkkey();//键值功能检查}}}flag3=1;//标志位置位 }/*Read_enable=1;num1=GetSeconds();num2=GetMinutes();num3=GetHours();num4=GetDate();num5=GetMonth();num6=GetYear();Read_enable=0;*/display();if(KeyPress==1)//有键按下{KeyPress=0;//按键标识清零checkkey();//键值功能检查}}}第四部分本次实习的心得体会第一、粗心导致焊错了元器件,另外对理论应用的能力导致编程现比较多的错误。感觉细心和能力同等重要。第二、通过这次实习感觉学习能力非常重要,比如说对keil的学习。 第三、发现问题和解决问题的能力。在调试的过程中,解决问题的能力非常重要,我感觉调试的过程中才是真正学东西的时候,每次运行完的error通过查资料问同学和老师解决的过程能学很多东西。总结:在以后的学习中首先要培养自己的学习能力;在课外要多花时间把理论知识应用到实践中,既培养自己的动手能力,又培养理论结合实际的能力;最后就是发现错误和解决问题的能力,当发现问题后,不能自暴自弃,一定要冷静地好好分析,然后查资料去解决问题,在这过程中,自信相当重要,坚信自己能战胜它! 附录:1.元器件清单类别序号封装参数电容C1cap0.1uF电容C2cap0.1uF电容C3cap0.1uF极性电容C4ELECTOR10uF极性电容C5ELECTOR10uF极性电容C6ELECTOR10uF电容C7CAP0.1uF电容C8CAP0.1uF电容C9CAP0.1uF电容C10CAP0.1uF电容C11CAP0.1uF电容C15CAP0.1uF电容C16CAP0.1uF极性电容C17ELECTOR10uF极性电容C18ELECTOR10uF电容C21CAP0.1uF二极管D1IN41481N4148二极管D2IN41481N4148六脚蓝色插座JP1POWER6电源插座二脚蓝色插座JP2POWER2输入信号跳线JP3PIN2通道选择跳线跳线JP4PIN2通道选择跳线跳线JP5PIN2通道选择跳线2*17插座JP6HDR2X17_CEN扩展插孔2脚蓝色插座JP8POWER2电压输出信号电阻R2AXIAL-0.410K电阻R4AXIAL-0.410K电阻R15AXIAL-0.410K电阻R18AXIAL-0.410KAD转换U1DIP28ADC0809或非门U2DIP1474LS02通用4运放U3DIP14TL084DA转换U5DIP20DAC0832实时时钟U6DIP24DS12887 类别序号封装参数电容C1CAP1uF电容C2CAP1uF电容C3CAP0.1uF电容C4CAP1uF电容C5CAP1uF电容C6CAP0.1uF极性电容C7CAP10uF电容C8CAP0.1uF电容C9CAP0.1uF电容C10CAP30pF电容C11CAP30pF电容C12CAP0.1uF电容C13CAP0.1uF极性电容C14ELECTOR10uF极性电容C15ELECTOR10uF电容C16CAP0.1uF高亮发光二极管E1ELECTOR电源指示DB9公头插座JP1DB9M串口单排16针插座JP2HDR1X161602插座PS2母头插座JP3PS2PS2键盘插座2脚蓝色插座JP4POWER2电源插座2*17,双排17针插座JP5HDR2X17_CEN扩展插座排阻JP6MHDR1X910k8针单排排针JP7HDR1X8键盘插座4位高亮8段数码管(小封装)JP84LED 4位高亮8段数码管(小封装)JP94LED 2*5插座JP10JTAGJTAG接口3脚单排排针JP11HDR1X3跳线4脚方形小按钮K1SW1复位开关三极管Q1NPN2N5551电阻R1AXIAL-0.41K电阻R2AXIAL-0.4200电阻R3AXIAL-0.4200电阻R4AXIAL-0.4200电阻R5AXIAL-0.4200电阻R6AXIAL-0.4200电阻R7AXIAL-0.4200电阻R8AXIAL-0.4200电阻R9AXIAL-0.4200电阻R10AXIAL-0.4200电阻R14AXIAL-0.410K电位器R15AXIAL-0.410K 电平转换U1DIP16MAX232N数码管译码驱动U2DIP16CD4511MCUU3DIP40AT89S52译码器U4DIP1674LS138看门狗U5DIP8X5045晶振Y1CRYSTAL11.0592MHz'