80C51单片机原理实验指导书.doc_第1页
80C51单片机原理实验指导书.doc_第2页
80C51单片机原理实验指导书.doc_第3页
80C51单片机原理实验指导书.doc_第4页
80C51单片机原理实验指导书.doc_第5页
已阅读5页,还剩19页未读 继续免费阅读

下载本文档

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

文档简介

MCS51单片机实验指导书(第2版)2006.11.8 修改了音乐演奏程序中的有关休止符的BUG淮阴师范学院计算机科学系2006.9实 验 板 结 构实验板结构如下图所示:注意:实验板与PC机连接时一定要先连接串行通信电缆,然后再将其电源线插入USB接口;拆除时先断开其电源,再断开串行通信电缆。否则极易损坏PC机的串口。最好先关闭微机电源,再连接或拆除实验板。实 验 要 求1、实验前预习实验内容,理解实验原理。2、按规定时间进入实验室,登记领取实验板和连接线,按操作程序将实验板连接到PC机上,开始实验。2、实验完毕请指导老师确认后,按操作程序拆除实验板,将连接线收拾好,与实验板一起归还指导老师,方可离开实验室。3、按时撰写并上交实验报告。实验报告格式为:(1)实验目的,(2)实验内容,(3)源代码及流程图,(4)结果记录及分析,(5)思考题,(6)体会及设想。51单片机集成开发环境MedWin V2.39简介1、安装从网站免费下载MedWin V2.39集成开发环境安装程序压缩包,将其释放后,按照默认路径安装到C:ManleyPmedWin文件夹。2、设置(1)每次启动MedWin会出现对话框,询问使用仿真器还是模拟仿真,应点击模拟仿真按钮。(2)设置仿真器 点击设置设置仿真器命令,选择时钟频率为12兆赫兹。(3)设置工作目录 MedWin 集成开发环境默认的工作目录为C:MedWinPMedWin,建议根据需要建立自己的工作目录。注意:不得使用长文件名或长目录名!(4)设置编译器 将C语言编译器C51(文件夹)拷贝到C:MedWin文件夹下,点击设置设置编译工具命令,打开“设置编译工具”对话框,使用汇编语言时选择第一行,使用C语言时选择第二行,如下图所示。3、使用(1)新建项目 点击项目管理新建项目 命令,输入项目名称,点击确定按钮,出现“添加项目文件”对话框,输入源代码文件名,如T1.C(或T1.ASM),单击打开按钮,出现代码窗口,即可开始编程。(2)打开项目 点击项目管理打开项目 命令,点击项目文件名(项目文件后缀为.mpf),点击打开按钮,即可打开上次保存的项目。(3)编译 点击项目管理编译/汇编命令,启动编译器对源文件进行语法检查并编译,在消息窗口中显示编译结果。(3)模拟仿真 当源程序编译无误后,可进行模拟仿真调试。点击项目管理产生代码并装入命令,编译器对源程序进行重新编译并装入。这时,可使用调试菜单中的相关命令进行调试,如设置断点、单步及全速执行等。(4)生成目标代码 点击项目管理输出Binary文件命令,生成BIN文件,用下载工具将其下载到实验板的单片机中执行。STC单片机下载软件STC-ISP的使用该软件界面如下图所示:按照界面上的提示,第一步,设置单片机型号为STC89C51RC,第二步,设置串口号,通常为COM1,第三步,点击Open File按钮,打开编译生成的BIN文件,第四步,检查实验板的串行通信线及电源线与PC机连接是否良好,并且实验板的电源开关处于关闭状态,第五步,点击下载按钮后,再打开实验板电源开关,此时,软件将自动完成程序下载,下载完毕,实验板上的单片机立即开始运行。目前,MCS51内核单片机中STC89C5X(宏晶)和AT89S5X(ATMEL)两种芯片具有在线下载功能。实验一 LED流水灯一、实验目的1. 学习单片机并口的使用方法。2. 学习延时子程序的编写和使用。3. 学习集成开发环境MedWin的安装与使用。4. 学习STC单片机在线下载软件STC-ISP的使用。二、实验内容所谓流水灯就是4个发光二极管(LED)轮流点亮,周而复始。实验板上以P3口作输出口,接有四只发光二极管,当单片机的引脚输出为低电平时发光二极管点亮,为高电平时息灭。编写程序,使4个发光二极管循环点亮,时间间隔约0.5秒。三、实验电路连线实验板上与本实验有关的硬件如下图所示。4个LED上串联4个限流电阻,以防止其电流过大而烧坏。单片机的主时钟为11.0592MHz。四、实验说明1、 P3口是准双向口,它作为输出口时与一般的双向口使用方法相同。由准双向口结构可知当P1口用作输入口时必须先对它置“1”。若不先对它置“1”,读入的数据是不正确的。输出时需要接上拉电阻,P3口内部有弱上拉,若将外围电路设计为低有效,高无效,则无需再外接上拉电阻。2、 为使每次点亮一个LED,应使P3.4P3.7 4个端口中有一个为低,其余均为高,延时一段时间后再点亮另一个LED。3、编写for循环构成的软件延时子程序,在MedWin下模拟执行,根据MedWin显示的执行时间,调整循环变量的终值,使延时时间约0.5秒,在晶振频率为11.0592MHz情况下,循环终值约27000。程序如下:void delay(void)unsigned int i,j,k,l; for(i=0;i=27000;i+) j+; k+;l+;流水灯的主程序为:#include void main (void)unsigned char i,c4 = 0xef,0xdf,0xbf,0x7f;/ 从左往右流水i = 0;while(1) P3 = ci & 3;i+; delay(); 五、思考1、 如何使点亮的LED从右往左移动?2、 如何使点亮的LED从两边往中间移动?实验二 用一位数码管循环显示09一、实验目的1. 学习单片机并口的使用方法。2. 学习延时子程序的编写和使用。3. 学习LED数码管的驱动编码。二、实验内容实验板上有4个LED数码管,编写程序,使最右边的一个LED数码管循环显示09十个数字。时间间隔约0.5秒,其余LED数码管关闭。三、实验电路连线实验板上与本实验有关的硬件如上页图所示。4个共阳的LED数码管上同名的引脚连接在一起,通过限流电阻接到单片机的P0口(段控制)。单片机P2口的4个引脚分别控制4个LED数码管的公共端(位控制)。单片机的主时钟为11.0592MHz。四、实验说明1、P0口和P2都是准双向口,输出时需要接上拉电阻。P0内部没有上拉电阻,P2口内部有弱上拉,本实验外围电路设计均为低有效,故无需外接上拉电阻。2、下表为驱动LED数码管的段代码表,“0”代表对应的笔段亮,“1”代表不亮。若需要在最右边显示数字“5”,只要将从表中查得的段代码2CH写入P0口,再将P2.4置低即可。数字gchdebfa十六进制P0.7P0.6P0.5P0.4P0.3P0.2P0.1P0.0010100000A0110111011BB201100010623001010102A400111001395001011002C60010010024710111010BA8001000002090010100028A0011000030b0010010125C11100100E4d0010001123E0110010064F0111010074-011111117F3、实现最右边的一个LED数码管循环显示09十个数字的C语言程序如下:#include #define U8 unsigned charcode U8 tab=0xa0,0xbb,0x62,0x2a,0x39,0x2c,0x24,0xba,0x20,0x28;void delay(void)unsigned int i,j,k,l; for(i=0;i=27000;i+) j+; k+;l+;void main(void)U8 i;P2_4=0;while(1)P0 = tabi;delay();i+;if(i=10) i = 0;五、思考题1. 分别写出 六个字母(用于显示十六进制数)的段代码。2. 能否交替点亮4个LED数码管?实验三 LED数码管的动态驱动一、实验目的1、 学习LED数码管的动态驱动编程。2、 学习使用定时/计数器。二、实验内容编写程序,使实验板上的4个LED数码管稳定显示4个不同的数字,并使这四位数从0000开始,每秒钟加一。三、实验电路连线本实验有关的硬件见实验二。四、实验说明在实验二中,我们已经能够让某一个LED数码管显示需要的数字,比如选让第一个LED显示“1”,隔一较短的时间(如5毫秒)后关闭第一个LED,让第二个LED显示“2”,如此周而复始,让4个LED依次显1、2、3、4,我们就能看到4个LED上稳定地显示4个不同的数字。当然,每个瞬间只有一个LED被点亮,大家亮的时间相同,均为5毫秒,4个LED数码管点亮一遍需要20毫秒,一秒钟各亮50次,所以看上去不会有闪烁感,但亮度只是实验二中LED亮度的四分之一。要实现每隔5毫秒变换一个LED,最好的方法是使用定时器中断。C51程序如下:#include #define U8 unsigned charU8 tab=0xa0,0xbb,0x62,0x2a,0x39,0x2c,0x24,0xba,0x20,0x28;U8 scn=0x7f,0xbf,0xdf,0xef;/先点亮左边一个数码管U8 buf4=0,0,0,0;/ 显示缓冲区,开机先显示0000 U8 cnt = 0;/ 扫描计数void main(void) EA = 1; / 允许中断TMOD = 0x01;/ 设定时器0为模式1(16位) ET0 = 1; / 定时器0中断允许 TH0 = 0xee;/ 晶振11.0592MHz,5mS TL0 = 0; TR0 = 1;/ 开始计数 while(1); / 死循环,等待中断 void timeint(void) interrupt 1 / 定时器0中断服务程序char i;TH0 = 0xee; / 设置定时器时间常数 TL0 = 0; i = cnt & 0x03;/ 求应点亮的LED号(从左到右依次为 0,1,2,3)P0 = tabbufi;/ 笔划代码送P0口P2 = scni;/ 控制扫描码送P2口if(cnt=200)cnt=0;/ 到1秒钟,显示的数字加一for(i=3;i=0;i-) bufi+; if(bufi=10) bufi=0;/ 加到10向前进位 else break;cnt+;五、思考题如何让4个LED数码管从0000开始,每秒钟自动加1,前两位代表分,后两位代表秒?实验四 数字电子钟一、实验目的进一步熟悉定时/计数器的使用。二、实验内容在实验板上编写程序,实现电子钟功能。时间显示格式为HH.MM,中间的小数点每秒钟闪烁一次。三、实验电路连线本实验有关显示部分的硬件见实验二,按钮连接见实验四。四、实验说明实验二及实验三中LED数码管的笔划代码均不含小数点(h位为1,小数点不亮),为了让第2个LED的小数点在每一秒的前半秒亮,后半秒灭,应在定时器的中断子程序中,判断当前时间为前半秒,而且动态扫描到第2个LED时,将其笔划代码取出,和0xDF相与后再写入P0口。该电子钟在上电或复位后时间均从00时00分00秒开始,若要使电子钟断电后照常行走,应采取电池供电。为了降低使用成本及减小体积,可采用两节5号电池,其满电量时电压为3伏,89C51单片机的正常工作电压范围为4.55.5伏,无法使用,可选用89C2051单片机(电压范围2.76伏),最好使用工作电压更低的单片机(如工作电压为1.8伏的AVR单片机)。为了延长电池使用寿命,必须采取一些节电措施,如将LED换成液晶、让单片机不工作时进入休眠方式、适当降低单片机的时钟频率等。五、思考题给电子钟加上能输入当前时间的功能。实验五 自动演奏乐曲一、实验目的(1)进一步熟悉89C51定时器/计数器的功能及应用;(2)掌握其初始化与中断服务程序的编程方法;(3)掌握用定时器/计数器产生不同频率方波的编程方法。二、实验内容用单片机的定时器/计数器0作定时器使用,工作于模式1,中断产生方波发声,根据简谱中各个音阶的频率,计算对应的定时时间常数,定时器中断后按此常数赋初值,从而发出对应的音调。将歌曲的音调和节拍各编成一个表(数组),用音调作为定时器的初值,用节拍控制发音时间, 就可以实现自动演奏乐曲。三、实验电路连线本实验有关的硬件如右图所示。四、实验说明产生音阶定时初值的计算:根据下表的音阶频率,计算对应的音阶周期T,用T/2计算定时周期数(晶振11.0592MHz),填入下表中。定时器的计数初值为65536定时周期数,由程序计算产生。定时周期数增加1倍,音阶降低八度,定时周期数降低1倍,音阶升高八度。音阶(C调)1234567频率(Hz) 256 288 320341384427480周期(s) 3906 3472 31252932260423422083半周期数180016001440135112001079960音阶表的编码规则为,音阶1-7用11-17表示,高八度音阶1-7用21-27表示,低八度音阶1-7用1-7表示。节拍表的编码规则为,1拍为16,约570mS,1/2拍为8,1/4为4,依此类推。下面是康定情歌的简谱及编码,上一行数字是音阶编码,下一行数字是节拍编码。自动演奏康定情歌乐曲的C51程序为:#include #define U8 unsigned charsbit P2_3=P23;sbit P3_2=P32;code unsigned int cyc=1800,1600,1440,1351,1200,1079,960;/音阶1-7的半周期数code U8 tone=13,15,16,16,15,16,13,12,12,13,15,16,16,15,16,13,13, 13,15,16,16,15,16,13,12,12,15,13,12,13,12,11,12,6,6,12,15,13,12,6,6,15,13,12,13,12,11,12,6,5,6,0xff;/ 乐曲康定情歌的简谱表code U8 time=8,8,8,4,4,8,8,12,4,8,8,8,4,4,8,16,8,8,8,8,4,4,8,8,12,4,8,8,4,4, 4,4,8,24,8,24,8,24,8,16,8,8,8,4,4,4,4,8,16,8,32;/ 节拍表U8 H0,L0,cnt;void cntint0(void) interrupt 1 / 定时器0中断用于产生音阶方波TH0=H0;TL0=L0;P2_3=P2_3; / P2.3是音乐信号输出脚,P2.3反相,产生方波void cntint1(void) interrupt 3 / 定时器1中断用于产生节拍延时cnt+; / 计数初值为0,所以不用赋值void main(void)U8 i,a,t;unsigned int b;next:TMOD=0x11;EA=1;ET0=1;ET1=1;cnt=0;TR1=1;i=0;while(1)t=tonei; / 读音调if(t=0xff) break; / 0xff是结束符if(t!=0) / 0 是休止符b=cyct%10-1; / 根据基本音阶,求出半周期数if(t20) b=b/2; / 若是高八度音阶,半周期数减半H0=(65536-b)/256; / 根据半周期数,计算T0初值的高字节和低字节L0=(65536-b)%256;TR0=1; / 启动定时器0发音cnt=0;a=timei; / 读节拍while(acnt);TR0=0;i+;for(b=0;b1000;b+); / 稍加延时,增强节奏感P2_3=1; / 关闭喇叭while(P3_2=1); / 等待按INT键goto next; / 重放一遍五、思考题将程序改成演奏别的乐曲。实验六 加法计算器一、实验目的1、 学习独立式按键的查询识别方法。2、 矩阵键盘的行反转法识别方法。二、实验内容实验板上有12个按键,编写程序,实现一位整数加法运算功能。可定义“A”键为“+”键,“B”键为“=”键。三、实验电路连线由于按键较多,键盘连接成43的矩阵形式,占用单片机P1口的7根线,每根线均外加了10K的上拉电阻,见下图。四、实验说明1、MCS51系列单片机的P0P3口作为输入端口使用时必须先向端口写入“1”。2、用查询方式检测按键时,要加入延时(通常采用软件延时1020mS)以消除抖动。3、由于51单片机的并口能够动态地改变输入输出方式,因此,矩阵键盘采用行反转法识别最为简便。行反转法识别按键的过程是:首先,将4个行线作为输出,将其全部置0,3个列线作为输入,将其全部置1,也就是向P1口写入0xF0;假如此时没有人按键,从P1口读出的值应仍为0xF0(P1.7空,被置1);假如此时1、4、7、0四个键中有一个键被按下,则P1.6被拉低,从P1口读出的值为0xB0;为了确定是这四个键中哪一个被按下,可将刚才从P1口读出的数的低四位置1后再写入P1口,即将0xBF写入P1口,使P1.6为低,其余均为高,若此时被按下的键是“4”,则P1.1被拉低,从P1口读出的值为0xBE;这样,当只有一个键被按下时,每一个键只有唯一的反转码,事先为12个键的反转码建一个表,通过查表就可知道是哪个键被按下了。实现整数加法计算器功能的C51参考程序如下:#include #define U8 unsigned char#define key_port P1code U8 kcode=0xb7,0xbe,0xde,0xee,0xbd,0xdd,0xed,0xbb,0xdb,0xeb,0xd7,0xe7;/反转码对应键值 0 1 2 3 4 5 6 7 8 9 A Bcode U8 disp=0xa0,0xbb,0x62,0x2a,0x39,0x2c,0x24,0xba,0x20,0x28,0xff;U8 buf4=0,0,0,0; U8 cnt=0;U8 scn=0x7f,0xbf,0xdf,0xef;/ 先点亮左边一个数码管void delay_ms(U8 ms)U8 i,j;for(i=0;i100;i+) for(j=0;jms;j+);U8 key(void)U8 a,r;delay_ms(20);/ 延时20毫秒,消除按键抖动if(key_port = 0xf0) goto rn;a = key_port;key_port = a | 0x0f;delay_ms(20);a = key_port;for (r = 0;r 11) r = 0xff;/0xff表示无效rn:key_port = 0xf0;return r;void main(void) U8 k,i,pf;/ pf为按过加号键的标志int p,p1,p2,/ p1,p2为两个加数,p为和TMOD = 0x01; / 设定时器0为模式1(16位) TH0 = 0xee; / 晶振11.0592MHz,5mS TL0 = 0; TR0 = 1; / 开始计数 EA = 1; / 允许中断ET0 = 1; / 定时器0中断允许 key_port = 0xf0;pf = 0; / 清除加号标志p = 0;delay_ms(20);while(1) / 循环 if (key_port != 0xf0) k = key(); if (k 10) if(p1=0)&(p2=0)for(i=0;i=3;i+) bufi = 0;/清空显示缓冲区 else for(i=1;i=3;i+) bufi-1=bufi;/ 数字左移一位 buf3 = k;/ 在个位显示刚按的数字 if(pf=0) p1 = p1 * 10 + k;else p2 = p2 * 10 + k; else if(pf = 1) p = p1 + p2; p1 = 1000; for(i=0;i3;i+) bufi = p / p1; p = p - p1 * bufi; p1 = p1 / 10; buf3 = p;p = 0;p1 = 0;p2 = 0;pf = 0; else pf = 1; p2 = 0; for(k=0;k=3;k+) bufk = 0; while(key_port != 0xf0);/ 等待按键抬起 delay_ms(20); while(key_port != 0xf0); void timeint(void) interrupt 1 / 定时器0中断服务程序unsigned char i,s;TH0 = 0xee; / 设置定时器时间常数 TL0 = 0; i = cnt & 0x03; / 求应点亮的LED号(从左到右依次为 0,1,2,3)P0 = dispbufi; / 笔划代码送P0口P2 = scni;/ 控制扫描码送P2口cnt+;五、思考题修改程序,使LED数码管上高位不显示多余的“0”。比如,开始时不是显示“0000”,而只显示一个“ 0”,按下“7”键后显示“ 7”。 实验七 与PC机串行通信一、实验目的学习串行通信程序设计。二、实验内容实验板上有RS-232接口,将该接口与PC机的串口连接,可以实现单片机与PC机的串行通信,进行双向数据传输。本实验要求当PC机向实验板发送的数字在实验板上显示,按实验板键盘输入的数字在PC机上显示。三、实验电路连线本实验有关的硬件见下图。四、实验说明51单片机有一个全双工的串行通讯口,所以单片机和电脑之间可以方便地进行串口通信。进行串行通讯信要满足一定的条件,比如电脑的串口是RS232电平(-5-15V为1,+5+15V为0),而单片机的串口是TTL电平(大于+2.4V为1,小于- 0.7V为0),两者之间必须有一个电平转换电路,上图中的分立元件就是实现RS232电平与TTL电平的相互转换。为了能够在PC机上看到单片机发出的数据,我们必须借助一个Windows软件进行观察,这里我们可以使用免费的串口调试程序SSCOM32或Windows的超级终端。#include #define U8 unsigned char#define key_port P1code U8 tab=0xa0,0xbb,0x62,0x2a,0x39,0x2c,0x24,0xba,0x20,0x28,0xff;U8 buf4=10,10,10,0;/ 显示缓冲区,开机先显示 0 U8 cnt=0; / 扫描计数U8 scn=0x7F; / 送P2口控制LED显示位,最左边LED先亮U8 rc;code U8 kcode=0xb7,0xbe,0xde,0xee,0xbd,0xdd,0xed,0xbb,0xdb,0xeb,0xd7,0xe7;/反转码对应键值 0 1 2 3 4 5 6 7 8 9 A Bvoid delay_ms(U8 ms)U8 i,j;for(i=0;i100;i+) for(j=0;jms;j+);U8 key(void)U8 a,r;delay_ms(20);/ 延时20毫秒,消除按键抖动if(key_port = 0xf0) goto rn;a = key_port;key_port = a | 0x0f;delay_ms(20);a = key_port;for (r = 0;r 11) r = 0xff;/ 0xff表示无效rn:key_port = 0xf0;return r;void send(unsigned char c)/ 发送一字节数据SBUF = c;while(TI = 0);/ 等待发送完毕TI = 0;void main(void) EA = 1; / 允许中断TMOD = 0x21;/ 定时器0方式1,定时器1方式2(作波特率发生器用) ET0 = 1; / 允许定时器0中断 TH0 = 0xEE;/ 晶振11.0592MHz,5mS TL0 = 0; PCON= 0;/ 波特率不倍增SCON= 0x50;/ 串口工作方式1,REN=1(允许接收) TH1 = 0xFD;/ (11.0592MHz晶振,9600B/S) TL1 = 0xFD;TR0 = 1;/ 开始计数 TR1 = 1; ET1 = 0;/ 禁止定时器1中断key_port = 0xf0;while(1) if(RI = 1) rc = SBUF;RI = 0; if(rc = 0) buf3 = rc - 0; ; if(key_port != 0xf0) send(key() % 10 + 0); while(key_port != 0xf0); delay_ms(20); while(key_port != 0xf0); void timeint(void) interrupt 1 / 定时器0中断服务程序unsigned char i,s;TH0 = 0xEE; / 设置定时器时间常数 TL0 = 0; i = cnt & 0x03;/ 求应点亮的LED号(从左到右依次为 0,1,2,3)P0 = tabbufi;/ 笔划代码送P0口P2 = scn; / 控制扫描码送P2口cnt+;s = (scn & 0x10) 1;scn = scn | s;五、思考题将实验五的电子琴程序与本程序结合,使实验板能够接收PC机发来的音阶表和节拍表自动演奏乐曲(表格放在RAM中,不宜太大)。实验八 I2 C串行flash存储器的读写一、实验目的学习I2C总线串行flash存储器24C16的读写操作。二、实验内容实验板上有1片串行flash存储器24C16,编写程序,对该存储器进行读写操作。具体要求是,每次程序初始化是,读取24C16地址为0和1的两个单元的值,判断是否为0x55和0xAA,若是,在LED上显示OK(“”),否则显示Err(“”),并将这两个数分别写入24C16地址为0和1的两个存储单元。三、实验电路连线本实验有关的电路连接见右图。四、实验说明89C51单片机没有内部闪存,若有用户输入的数据需掉电保持,则要加外部闪存,24CXX系列就是常用的闪存芯片。串行闪存芯片的引脚少,占线路板面积小,与单片机的连线简单,因而被广泛使用。89C51单片机不支持I2C总线协议,必须按照I2C总线时序用软件模拟。实现对24C16进行单字节读写的C语言程序如下:#include #includesbit ESDA=P22;sbit ECLK=P21;sbit EWP=P20; void ask() unsigned int i=0xffff; ESDA=1;_nop_();ECLK=1;_nop_(); do i-; if(ESDA!=1) ECLK=0;i=0; while(i!=0);void stop() ECLK=0; _nop_(); ESDA=0; _nop_(); ECLK=1; _nop_(); ESDA=1; _nop_(); ECLK=0; _nop_();void start() ESDA=1;_nop_(); ECLK=1;_nop_(); ESDA=0;_nop_(); ECLK=0;_nop_();unsigned char rdby() unsigned char i,A=0; ESDA=1; for(i=0;i=7;i+)A=A1;ECLK=1;_nop_();_nop_();_nop_(); A=A|ESDA;ECLK=0;_nop_();/_nop_();_nop_(); return(A);void wrby(unsigned char x) unsigned char i,A; A=x; for(i=0;i=0x80);ECLK=1;_nop_();ECLK=0;A=A1; ESDA=1;_nop_();ECLK=1;void w8addr(unsigned char x) wrby(x); ask();void waddr() start(); wrby(0xa0); ask();unsigned char raddr() start();wrby(0xa1); ask(); ACC=rdby(); stop(); return(ACC);unsigned char read(unsigned char address)/ 从指定的地址中读出一个字节数据函数 waddr(); w8addr(address); return(raddr();void d5ms()/ 延时 unsigned char a,b; for (a=0;a=15;a+) for (b=0;b0x7f;b+) ; void write(unsigned char address,unsigned char dat) EWP=0; / 向指定的地址中写入一个字节数据函数 waddr(); w8addr(address); wrby(dat); ask(); stop(); d5ms(); EWP=1;void main() unsigned char i,j; P3_4 = 0; for(i=0;i=0x7f;i+) write(i,i);/ 调用向指定的地址中写入一个字节数据函数 P3_4 = 1; P3_5 = 0; for(i=0;i=0x7f;i+) j = read(i);/ 调用从指定的地址中读出一个字节数据函数 if(j != i) P3_7 = 0; P3_5 = 1; P3_6 = 0; while(1);附1 STC单片机内部EEPROM读写程序(STC89C51RC)#include #include /* 新增特殊功能寄存器定义*/sfrISP_DATA= 0xe2;sfr ISP_ADDRH= 0xe3;sfrISP_ADDRL= 0xe4;sfrISP_CMD= 0xe5;sfrISP_TRIG= 0xe6;sfrISP_CONTR = 0xe7;/* 定义命令 */#define READ_AP_and_Data_Memory_Command0x01/ 字节读应用程序区和数据存储区#define PROGRAM_AP_and_Data_Memory_Command 0x02/ 字节编程应用程序区和数据存储区#define SECTOR_ERASE_AP_and_Data_Memory_Command 0x03/ 扇区擦除应用程序区和数据存储区#defineDELAY_CONST 60000/* 定义常量 */#define ERROR 0#define OK 1sbit Begin_LED = P34;sbit ERROR_LED = P37;sbit OK_LED= P35;/* 定义Flash 操作等待时间 */#define MCU_CLOCK_10MHz#define WAIT_TIME 0x00unsigned char xdata protect_bufferUSED_BYTE_QTY_IN_ONE_SECTOR;#define DEBUG_Data_Memory_Begin_Sector_addr0x1000#define DEBUG_Data_Memory_End_Sector_addr0x1e00#define DEBUG_Data_Memory_End_Byte_addr0x1fff/* 打开 ISP,IAP 功能 */void ISP_IAP_enable(void)EA=0;/* 关中断 */ISP_CONTR=ISP_CONTR & 0x18; /* 0001,1000 */ISP_CONTR=ISP_CONTR | WAIT_TIME;ISP_CONTR=ISP_CONTR | 0x80; /* 1000,0000 */* 关闭 ISP,IAP 功能 */void ISP_IAP_disable(void)ISP_CONTR=ISP_CONTR & 0x7f;/* 0111,1111 */ISP_TRIG=0x00;EA= 1; /* 开中断 */* 字节读 */unsigned char byte_read(unsigned int byte_addr)ISP_ADDRH=(unsigned char)(byte_addr 8);ISP_ADDRL=(unsigned char)(byte_addr & 0x00ff);ISP_CMD =ISP_CMD&0xf8; /* 1111,1000 */ISP_CMD =ISP_CMD|READ_AP_and_Data_Memory_Command;/* 0000,0001 */ISP_IAP_enable();ISP_TRIG=0x46;ISP_TRIG=0xb9;_nop_();ISP_IAP_disable();return (ISP_DATA);/* 扇区擦除 */unsigned char sector_erase(unsigned int sector_addr)unsigned int get_sector_addr=0;get_sector_addr=(sector_addr & 0xfe00);/1111,1110,0000,0000;取扇区地址ISP_ADDRH =(unsigned char)(get_sector_addr 8);ISP_ADDRL =0x00;ISP_CMD= ISP_CMD & 0xf8;/* 1111,1000 */ISP_CMD= ISP_CMD | SECTOR_ERASE_AP_and_Data_Memory_Command;ISP_IAP_enable();ISP_TRIG = 0x46; /* 触发ISP_IAP命令 */I

温馨提示

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

评论

0/150

提交评论