keilc教程以及程序例子_第1页
keilc教程以及程序例子_第2页
keilc教程以及程序例子_第3页
keilc教程以及程序例子_第4页
keilc教程以及程序例子_第5页
已阅读5页,还剩44页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

/第一章KEIL编译器的安装KEIL()编译器评估版本把目标代码长度限制在2KB以内,可以从网上下载使用。而8051编译器正式版本由1张CD、1张有序列号码的1.44MB软盘和连接打印机端口的硬件锁定键组成。利用评估版本(Evaluation)对源程序通过了便宜,也生成了HEX文件,但就是不能正常运行。这是为什么?使用者可以随时从网上下载KEIL评估版本进行安装,但是编译长度小于2KB的目标代码,并且代码的起始(Start)地址自动设定为4000h,所以硬件组成也应予以支持。免费获得的评估版还有别的限制,为了把所生成HEX文件下载到地址不是4000h的ROM中,就要利用hex2bin.exe实用程序把hex变成bin后下载到ROM,只有这样才能正常运行。hex2bin.exe程序可以从网上下载。下载KEILC51安装程序后,双击Setup.exe文件约几秒后,在安装向导窗口上可以选择安装、更新、搬移程序三个选项,如图1–2所示。图1–1安装项目的选择在默认(InstallSupportforAdditionalMicrocontrollerArchitectures)的情况下,点击Next>进入图1–2所示画面。EvalVersion(EvaluationVersion)评估版本;FullVersion正式版本;Quit退出安装;在安装过程中,键入写在软盘上的序列号码,选择驱动器路径,把软盘插入驱动器继续安装。这时,在程序设置信息项目中出现“LastName”项目,必须键入才能激活“Next”按钮,比如自己的“姓”或其他。在安装盘上有序列号码和与安装有关的重要信息,因此有必要把安装盘进行备份以保护重要的信息。若没有序列号的情况下请选择EvalVersion(EvaluationVersion)评估版本进行安装。图1–2正式版与评估版的选择如果KeiluVision2的KEIL编译器安装结束,则会生成下列路径和图标:以最上层路径为C:\KEIL为假设予以罗列。安装结束后若想运行,则双击屏幕上的KeiluVision2集成运行快捷按钮。在Windows开始-->程序菜单上也会发现同样的快捷按钮。表1–1文件夹的结构路径说明C51\ASM汇编SFR(SpecialFunctionRegister)定义和源程序样本文件C51\BIN编译器的执行文件所位置C51\EXAMPLES应用程序视图文件C51\RTX51实时操作系统Full文件,255个任务C51\RTX_TINY实时操作系统Tiny文件,16个任务C51\INCC语言中与8051有关的所有包含文件都在此处C51\LIB库、开始代码、输入/输出源程序C51\MON51监控目标硬件系统时所使用的HEX代码生成文件UV2编译器集成执行文件KEIL编译器C51以ANSI(AmericanNationalStandardInstitute)规格为标准,所以使用C语言的开发人员用ANSI编写程序就可以(使用ClassicC语言也可以)。第二章KeiluVision2快速入门为了能让使用者快速入门,先简单介绍8051。8051单片机是一个具有40个引脚的长方形芯片,其中,有5V直流电源Vcc(因为内部有很多逻辑电路,应使用波纹系数小的直流电源)和电源地GND引脚。还有至少保持2个机器周期(一个机器周期=12个振荡周期)为高电就复位的RESET引脚。 端口P0是由开漏(用作I/O口时需要外部接上拉电阻)的驱动器构成的8位双向I/O口,用作A0~A7,D0~D7;端口1是有内部上拉电阻的准双向I/O口;端口2是有内部上拉电阻的准双向I/O口,用作A8~A15;端口3是有内部上拉电阻的准双向I/O口,兼有串行通讯、外部中断、定时器、读/写的特殊功能;X1是振荡放大器的反向输入引脚,X2是反向输出引脚,因此,使用晶体时把晶振并联连接到X1和X2上,使用外部振荡器时只连接X1。 ALE/PROG(AddressLatchEnableOutput/ProgramPulseInput)引脚的ALE,在访问外部存储器时用来锁存低8位地址,而PROG在编程EPROM时用来进行脉冲输入。PSEN(ProgramStrobeEnable)引脚信号作为访问外部程序存储器的读选通,每个机器周期PSEN被激活2次,在ALE的下降沿将端口0的地址锁存到外部锁存器。EA/Vpp(ExteralAccessEnable)引脚连接到GND,则0~FFFFH地址都访问外部程序存储器;连接到Vcc,则访问内部程序存储趋。Vpp是对8751编程电压输入端子,其电压为12.75~21V,具体值随不同型号芯片而有所不同。 双击KeiluVision2集成执行快捷按钮,将弹出如图2–1所示的窗口。这是一个初始开发集成窗口。如果没有做过任何项目,则窗口上什么也没有。窗口的上端有10个下拉菜单。C51在管理程序时,采用所谓的项目(Project)文件来进行管理。项目把程序的环境甚至和编图2–1KeiluVision2的执行辑有关的全部信息都保存着,因此使用者可以把多个程序以项目为单位使用C51就可以了。由于C518051KEIL编译器变成集成环境,提供即使不知道汇编或不详细知道8051也能编写应用程序的环境。这一章的内容可以使工程人员快速并正确地熟悉编译器环境。执行集成环境C51,如图2–1所示,出现编辑、项目、输出等3个大窗口和,View,Project,Debug,Flash,Peripherals,Tools,SVCS,Window,Help等11个下拉菜单。 为了开始新的项目,选择“ProjectNewProject”选项后,出现如图2–2所示,然后选择源程序所在路径键入项目的名字并单击“保存”按钮。项目的名字会立即出现在集成环境的左上端。这个项目的名字最后为HEX文件的名字。因此,项目的名字最好不超过8个英文字母,并且尽量不采用中文为好。在这里采用的项目名字为“First_Project”。图2–2建立一个新工程 接着选择用8051开发的目标硬件系统的MPU选项,如图2–3所示。这个选项的是为了反映各个不同厂家生产的具有不同性能的8051而设计的,因此,只要正确选择自己要开发的目标硬件系统的MPU就可以了。图2–3目标硬件系统的CPU的选择接着要进行“OptionforTarget”的设定,以修改跟编译器有关的信息和跟目标系统有关的事项。如图2–4中,第一个选项“Target”设定目标系统的存储器、输出文件以与与源程序文件有关的事项。在菜单栏中,选择“Project/OpintionforTarget…”或者单击工具栏中的“OptionforTarget”快捷按钮就可以开始设定。在这里,要输入系统的工作频率、ROM与RAM的开始地址和大小以与存储模式。首先,正确输入目标系统的晶振的频率值后选择存储模式。图2–4OptionforTarget为了让8051的机器语言代码下载到ROM,需要产生HEX代码。图2–5的Option选项用来设定HEN文件的名字和要存放的文件夹(SelectFolderforObject…)。通常编译、调试到下载ROM需要进行多次编译才能完成。如果不选择“CreatHEXFile”,编译后不将产生HEX代码(即使不发生错误)。这样可以避免不必要地反复写硬盘以保护硬盘的磁道和扇区。图2–5中右上端的“NameofExecutable”表示HEX代码文件的名字,通常和项目文件同名,也可以指定别的名字。编译完成后生成HEX代码文件,并存放在项目所在路径中。因为8051的知识产权是Intel公司的,其命令语的处理也跟随Intel的结构,所以KEIL只支持IntelHEX文件的形式。另外,为了在源代码层次上进行调试,最好选择“DebugInformation”。为了便于编译程序,最好选择“BrowserInformation”。图2–5OptionforTarget输出文件设定 在使用监控程序(Monitor)与目标硬件系统和KEIL编译器集成环境接口,能够监控变量的值和函数的执行。监控程序把监控程序ROM移植到目标硬件系统后运行。为了把监控程序和目标硬件系统接口,需要制作合适的硬件。监控程序的监控原理是,把监控程序装入ROM区,把应用程序代码装入RAM以后,执行监控程序,则监控程序,调用应用程序执行。这样,在RAM区域里代码存储区和数据存储区共存。所以在使用监控程序调试应用程序的时候,需要在KEIL软件中修改以下参数,如图2–6所示将原来的“CSEGAT0”修改成“CSEGAT08000h”(不包括双引号)。如果使用烧写器直接调试程序,则使用默认的“CSEGAT0”即可。图2–6Startup.A51文件修改同时将OptionforTarget中BL51Locate中的Code代码段的设定修改成如图2–7所示图2–7OptionforTarget代码段的设定 下面是可以驱动用于调试的仿真器和监控器的环境设定选项卡“OptionforTarget/Debug”,如图2–8所示。主要有2个单选项:左侧有仅用软件来仿真8051的软件模拟仿真器单选项,右侧有与目标硬件系统边传送信息边进行调试的“KEILMonitor–51Driver”和“TriscendE5Driver”单选项。由于KEIL8051集成开发环境综合了调试(Debug)和Scope功能,所以称之为dScope。监控器的功能是把监控器的ROM移植到目标硬件系统,用RS–232连接PC机和目标硬件系统,PC机的KEILdScope和目标硬件系统互相传送信息。可以下载代码,也可以查看目标硬件系统的变量。图2–8OptionforTarget/Debug第三章应用程序的调试经过上面的软件设置,下面将介绍一下,如何在KEIL软件中进行应用程序的调试、编译和连接。首先单击“File”菜单,在下拉的菜单中单击“New”选项,屏幕图3–1所示,此时可以看到编辑窗口的标题栏是空的,而光标在编辑窗口闪烁。这个时候就可以键入应用程序了。图3–1含有空白的编辑窗口的屏幕单击菜单条上的“File”菜单,在下拉菜单中选中“SaveAs”选项单击,屏幕如图3–2所示。在“文件名”栏右侧的编辑框中,键入欲使用的文件名称,同时,必须键入正确的扩展名。注意:如果使用C语言编写程序,则扩展名为(*.C);如果是用汇编语言编写的程序,则扩展名为(*.asm)。然后,单击“保存”按钮。图3–2保存文件对话框然后需要将你已经保存好的文件添加到该项目中,具体步骤为:单击“SourceGroup1”然后在单击鼠标右键,屏幕如图3–3所示。图3–3把源程序添加到工程中接着单击“Add‘SourceGroup1’”,此时屏幕将出现图3–4所示的画面,然后选择你刚刚设定的函数文件名。单击“Add”按钮后则可以编写C语言程序了;图3–4选择所需要的源程序现在编写程序:#include<reg52.h>//包含文件#include<stdio.h>//包含文件voidmain(void){ SCON=0x52; TMOD=0x20; TH1=0xf3; TR1=1;printf(“HelloIamKEIL51.\n”);//打印程序执行信息printf(“Iwillbeyourfriend.\n”);//打印程序执行信息while(1);//等价于HALT指令}在输入上述程序时,KEIL51会自动识别关键字,并以不同颜色提示用户加以注意,这样可以减低错误率,有利于提高编程效率。程序输入完毕后,屏幕如图3–5所示。图3–5程序输入完成后的屏幕显示 编辑源程序之后,为了下载到目标硬件系统,要反复进行编译和连接操作。这时使用的正是“Project”下拉菜单中的编译命令。“BuildTarget”()表示只编译和连接在项目窗口修改过的源程序,因此适合于多种源程序文件的情况。“RebuildallTargetFile”()表示编译和连接项目里登陆的所有源程序文件。相反,“Translate”()表示只编译被激活的窗口中的源程序。另外,在编译和连接过程中,可以利用“BuildStop”()停止正在进行中的编译和连接,这个快捷按钮是未被激活状态时的画面。在窗口底部可以看见KEIL项目文件(*.UV)的历史记录,列出最近使用过的文件,最多10个。除使用过的项目文件之外的历史记录,在“File”下拉菜单的下端可以到过去曾使用过的6个文件列表。 在设定“OptionforTarget”的存储器和“Settings”项后。进行编译并执行dScope()。则出现如图3–6所示画面。当然,在执行前装如监控程序和目标硬件系统已接好电源,并且串行通信电缆也已连接到PC机的COM端口。然后监控程序和连接都正常,则在左下端状态栏里显示蓝色的直方图表,以表示正在装入;如果通信电缆没有连接到目标硬件系统,则显示如3–7所示的信息。这时,要按目标硬件系统的复位按钮重新执行监控程序之后,单击“TryAgain”或者“Settings……”,重新确定设定值。特别是要重新确定通信速度是否为设定为9600bps,目标硬件系统的时钟频率是否设定为11.0592Mhz。如果这样还是连接不上,单击“StopDebugging”来退出bScope,重新进行上面的步骤。若还没有任何进展,则只好从头开始检查一下目标硬件系统和软件的设置,在特殊情况下,有时往往是ROM里的指令代码有问题,或者串行通信有问题。如果一切连接都正常,则不出现错误窗口,在dScope环境中变成准备等待(Standby)状态。图3–6正在运行的源程序图3–7错误信息提示 根据上述编写的程序,若需要在电脑上显示编写的结果是不是满足自己的要求,可不设定是KEILMonitor–51Driver仿真;可以使用UseSimulator进行仿真。在执行dScope()后,再单击()可以看见通过传口发出去的信息内容,如图3–8所示。图3–8显示程序所实现的结果3.1项目中含有多个文件通常,一个项目是由多个文件构成的,这是结构化语言的特色之一。对于一个大的项目,同时可以由多人编程、调试,最后再连接到总的项目中去,这就构成了工程项目。下面介绍多文件项目使用方法。为了便于说明,将C语言程序加上行号,列表如下:1 #include<reg52.h>//包含文件2 #include<stdio.h>//包含文件3 voidmain(void)//主程序4 {5 SCON=0x52;6 TMOD=0x20;7 TH1=0xf3;8 TR1=1;9 printf("HelloIamKEIL51.\n");//打印程序执行信息10 printf("Iwillbeyourfriend.\n");//打印程序执行信息11 while(1);//等价于HALT指令}现在把5—8行程序改写成如下函数:#include<reg52.h>//包含文件#include<stdio.h>//包含文件voidserial_initial(void){ SCON=0x52; TMOD=0x20; TH1=0xf3; TR1=1;}将上述函数保存为serial_initial.c。将剩余部分添加必要的两行,保存为my_second.c,程序清单如下:#include<reg52.h>//包含文件#include<stdio.h>//包含文件externserial_initial();voidmain(void)//主程序{ serial_initial(); printf("HelloIamKEIL51.\n");//打印程序执行信息 printf("Iwillbeyourfriend.\n");//打印程序执行信息 while(1);//等价于HALT指令 }现在创建第二个工程项目,步骤如下:(1)创建项目,工程名为my_second;(2)选择所用单片机,Ateml公司的AT89s52;(3)添加文件,将已经编写好的my_second.c和serial_initial.c添加到项目中去,完成后,(4)屏幕如图3–1–1所示;(5)编译项目,生成机器代码;(6)执行当前项目,实现软件仿真;(7)查看程序的执行结果,观察屏幕的输出结果(与图3–8完全相同)。图3–1–1my_second屏幕显示图由于Monitor-51开发系统比较简单,占用了一些系统资源,有时给使用者带来了不便。实际编程中常要解决一下两个问题:(1)串行接口功能:串行通信是MCS-51单片机经常要用到的功能,而这里选用的MCS-51系列单片机AT89S52只有一个串行通信口,在与PC机相连接的仿真状态时,串行口用于与PC机通信。若在应用程序中也用到串行口,就会发生冲突。解决方法一是用户程序装载完毕后,运行用户程序,再断开仿真板与PC机的串行通信线,这样串口就可以归用户程序使用了,当然这时PC机就不能在线调试了;另外,还可以选用其它的带两个串行口的MCS-51系列芯片。(2)外部存储空间:用户程序越长,占用的外部数据存储空间将越大。解决的方法是对较长的程序进行分段调试。第四章实验程序4.1键盘显示程序硬件环境:单片机最小系统、8279键盘显示电路实现功能:通过按键输入,在数码管上显示相应的数字C源程序://**********************************************//C按键为清屏幕//D按键为一位一位清除//B按键为小数点//**********************************************#include<reg52.H>#include<ABSACC.H>#defineCOMXBYTE[0x7001]#defineDATXBYTE[0x7000]#defineucharunsignedcharucharcodetable[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};ucharidatadiss[8]={0,1,2,3,4,5,6,7};ucharkeyin();uchardeky();//*************************************voidmain(void){unsignedintii;uchari,k,n,m,j,s;for(ii=0;ii<20000;ii++);COM=0xD1;//清楚总命令清除RAMCOM=0x00;//键盘、显示方式、分频COM=0x38;while(1){k=keyin();switch(k){case0x0c:COM=0xD1;//清楚屏幕i=0; continue; break;case0x0d:i--;//按位清除可以一位一位的清除数码管COM=0x90;COM=i+0x80;DAT=0; continue; break;case0x0b:i--;//小数点COM=0x90; COM=i+0x80; j=diss[i]; s=table[j]; DAT=s|0x80;i++; continue; break;default:break;}if(i<8){COM=0x90;COM=i+0x80;diss[i]=k;DAT=table[k];i++;}elsei=0;}}//***************取键值函数************ucharkeyin(void){uchari,j,k;while(deky()==0);COM=0x40;j=DAT;i=j&0x07;i=i<<3;k=j&0x38;k=k>>3;i=i+k;return(i);}uchardeky(void){uchark;k=COM;return(k&0x0f);}4.28255扩展I/O口实验硬件环境:单片机最小系统、8279键盘显示电路实现功能:通过按键输入数字量,则在8255的三个输出口分别输出相应的数字量C源程序:/**//*函数名称:8255A程序调试/*/*版本:V1.0/*完成时间:2005年8月9日/**///文件名:main.c#include"EXAMPLE.h"voidmain(void){unsignedchark,i,j; Init_8279(); while(1) { k=Keyin(); switch(k) { case0x0a://确定发送 j=buffer[0]<<4; j=buffer[1]|j; Init_8255_mode0(j); continue; break; case0x0c://清除屏幕 Clear_LED(); i=0; continue; default: break; } if(i<8) { COM=0x90; COM=i+0x80; buffer[i]=k; DAT=table[k]; i++; } else i=0;}}//文件名:Init_8279#include"reg52.H"#include"ABSACC.H"//键盘显示8279的数据地址和命令地址#defineCOMXBYTE[0x7001]#defineDATXBYTE[0x7000]unsignedcharcodetable[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e, 0x79,0x71};#definecount8//缓存空间大小unsignedcharidatabuffer[count];//数据输入缓存unsignedcharDeky();unsignedcharKeyin();/*初始化8279*/voidInit_8279(void){COM=0xD1;//清楚总命令清除RAMCOM=0x00;//键盘、显示方式、分频COM=0x38;}/*设置数码管显示*//*ddr为数据显示的位置/*k为取缓存数据的地址*//**/voidDis_LED(unsignedcharddr,unsignedchark){unsignedchari,j; COM=0x90;//取高4位数据 COM=ddr+0x80;i=buffer[k]; j=0xf0&i; j=j>>4; DAT=table[j]; COM=0x90;//取低四位数据 COM=++ddr+0x80;i=buffer[k]; j=0x0f&i; DAT=table[j]; }/*显示小数点*/voidDis_Point(unsignedcharddr){unsignedchari;COM=0x90;COM=ddr+0x80;i=buffer[ddr];DAT=table[i]|0x80;}/*清除屏幕*/voidClear_LED(void){COM=0xD1;}/*取键值函数*/unsignedcharDeky(void){unsignedchark;k=COM;return(k&0x0f);}unsignedcharKeyin(void){unsignedchari,j,k;while(Deky()==0);COM=0x40;j=DAT;i=j&0x07;i=i<<3;k=j&0x38;k=k>>3;i=i+k;return(i);//返回键值}/**///文件名:Init_8255/**//*8255地址0x7800/*接口连线:/*单片机8255/*RW>RW/*WR>WR/*138-Y7>CS/*573-A0\A1>A0\A1/*RESET>RESET/**/#include"reg52.H"#include"ABSACC.H"#defineCOM_PAXBYTE[0x7800]//PA口地址#defineCOM_PBXBYTE[0x7801]//PB口地址#defineCOM_PCXBYTE[0x7802]//PC口地址#defineCOM_CtrlXBYTE[0x7803]//控制字地址/**//*8255方式控制字/*--D7--D6--D5--D4--D3--D2--D1--D0--/*||/*|D7:置位方式;1有效/*A|D6~D5:方式选择:00方式0;01方式1;10方式2/*组|D4:端口A;1为输入;0为输出/*|D3:端口C上半部;1为输入;0为输出/*||/*/*||/*|D2:方式选择:0为方式0;1为方式1;/*B|D1:端口B:1为输入;0为输出;/*组|D0:端口C下半部分:1为输入;0为输出;/*||/**//**//*函数名称:8255初始化;方式0/*/*函数功能:将Value的值,分别送到PA、PB、PC口/*/*返回值:无/**/voidInit_8255_mode0(unsignedcharValue){COM_Ctrl=0x80;//A、B、C口方式0输出COM_PA=Value;COM_PB=Value;COM_PC=Value;}/**/4.3D/A实验硬件环境:单片机最小系统、8279键盘显示电路、0832电路实现功能:通过键盘输入数字量,在0832的DACTEST输出相应的模拟量C源程序://**********************************************//C按键为清屏幕//D按键为一位一位清除//F按键为确认键//**********************************************#include<reg52.H>#include<ABSACC.H>#defineCOMXBYTE[0x7001]#defineDATXBYTE[0x7000]#defineDAC0832XBYTE[0x5800]#defineucharunsignedcharucharcodetable[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};ucharidatadiss[8]={0,1,2,3,4,5,6,7};ucharkeyin();uchardeky();//*************************************voidmain(void){unsignedintii;uchari,k,n,m,j,s;for(ii=0;ii<20000;ii++);COM=0xD1;COM=0x00;COM=0x38;while(1){k=keyin();switch(k){case0x0c:COM=0xD1;i=0; continue; break;case0x0d:i--;COM=0x90;COM=i+0x80;DAT=0; continue; break;case0x0f:n=diss[0]<<4; m=diss[1]|n; do{ DAC0832=m; }while(keyin()==0);continue;break;default:break;}if(i<8){COM=0x90;COM=i+0x80;diss[i]=k;DAT=table[k];i++;}elsei=0;}}//***************取键值函数************ucharkeyin(void){uchari,j,k;while(deky()==0);COM=0x40;j=DAT;i=j&0x07;i=i<<3;k=j&0x38;k=k>>3;i=i+k;return(i);}//*************************************uchardeky(void){uchark;k=COM;return(k&0x0f);}//*************************************4.4DS12887实验硬件环境:单片机最小系统、8279键盘显示电路实现功能:在数码管上显示小时、分钟、秒以与年、月、日、星期通过P1.1的切换显示的内容;C源程序://*****************************************//没有用中断;IRQ为空//接口连线:ALE>AS//WR>R/W//RD>DS//版本:V1.0//完成时间:2005年7月24日//*****************************************#include<reg52.H>#include<ABSACC.H>#defineCOMXBYTE[0x7001]#defineDATXBYTE[0x7000]#defineTM_secondXBYTE[0x6000]//秒#defineAM_secondXBYTE[0x6001]//秒闹#defineTM_minuteXBYTE[0x6002]//分#defineAM_minuteXBYTE[0x6003]//分闹#defineTM_hourXBYTE[0x6004]//时#defineAM_hourXBYTE[0x6005]//时闹#defineTM_weekXBYTE[0x6006]//周#defineTM_dayXBYTE[0x6007]//日(2位数)#defineTM_monthXBYTE[0x6008]//月(2位数)#defineTM_yearXBYTE[0x6009]//年(2位)#defineREG_aXBYTE[0x600a]//寄存器A#defineREG_bXBYTE[0x600b]#defineREG_cXBYTE[0x600c]#defineREG_dXBYTE[0x600d]#defineRAM_114XBYTE[0x600e]#defineucharunsignedcharunsignedcharidatatime_buf[7]={0,1,2,3,4,5,6};sbitTime_chang_Year=P1^1;//控制时间和年月日切换ucharcodetable[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};voidsettime()//设置系统时间{ucharxdatai;i=REG_d;REG_a=0x70; REG_b=0xa2;//输出为BCD码24小时进制TM_second=time_buf[0];TM_minute=time_buf[1];TM_hour=time_buf[2];TM_week=time_buf[3];TM_day=time_buf[4];TM_month=time_buf[5];TM_year=time_buf[6];REG_b=0x22;//芯片更新正常进行REG_a=0x20; i=REG_c;}voidreadtime()//读取系统时间{ucharxdataa;do { a=REG_a; } while((a&0x80)==0x80);//UIP为1时更新即将开始time_buf[0]=TM_second;time_buf[1]=TM_minute;time_buf[2]=TM_hour;time_buf[3]=TM_week;time_buf[4]=TM_day;time_buf[5]=TM_month;time_buf[6]=TM_year;}voidstart12887(void)//启动时钟{ucharxdatai;i=REG_d;REG_a=0x70;//晶体震荡器开始并保持时钟运行REG_b=0xa2;AM_second=0xff;AM_minute=0xff;AM_hour=0xff;REG_b=0x22; REG_a=0x20;i=REG_c;}voidmain(void){uchark;unsignedinti; for(i=0;i<20000;i++);EX1=0; COM=0xD1;COM=0x00;COM=0x38;start12887();//*****************设置显示初始值*****************time_buf[0]=0x00;//sectime_buf[1]=0x00;//mintime_buf[2]=0x00;

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论