实验一 读写者问题

实验一  读写者问题
实验一  读写者问题

实验一读者-写者问题模拟实现

一、实验题目

模拟实现读者-写者问题

二、实验目的

通过模拟实现经典的读者——写者问题,巩固对同步机制的学习,学会运用信号量、PV原语处理进程间的同步和互斥。

三、实验要求

设计实现读者-写者问题模拟程序。在Windows xp环境下,创建一个控制台程序,此程序包含n个线程。用这n个线程来表示n个读者或写者。每个线程按相应测试数据文件(后面有介绍)的要求进行读写操作。用信号量机制分别实现读者优先或写者优先的读者-写者问题。

[提示]:

1、读者-写者问题的读写操作限制(包括读者优先和写者优先):

1)写-写互斥,即不能有两个写者同时进行写操作。

2)读-写互斥,即不能同时有一个线程在读,而另一个线程在写。,

3)读-读允许,即可以有一个或多个读者在读。

?如果读者来:

–无读者、写者,新读者可以读

–有写者等待,但有其他读者正在读,新读者可以读

–有写者写,新读者等

?如果写者来:

–无读者,新写者可以写

–有读者,新写者等待

–有其他写者,新写者等待

读者优先的附加限制:如果一个读者申请进行读操作时已有另一个读者正在进行读操作,则该读者可直接开始读操作。

写者优先的附加限制:如果一个读者申请进行读操作时已有另一写者在等待访问共享资源,则该读者必须等到没有写者处于等待状态后才能开始读操作。

2、P、 V操作如下

?读者:

BEGIN

P(mutex);//上锁,互斥其他读者,为了保证只有一个读者改变read_count read_count:=read_count+1;

IF read_count=1 //第一个读者,则上写者的锁,保证读得时候不能让写者写

THEN P(writer)

V(mutex);

读文件;

P(mutex); //同上,互斥读者,为了保证只有一个读者改变read_count read_count:=read_count-1;

IF read_count=0 //最后一个读者,signal写者,可以写

THEN V(write);

V(mutex);

END;

?写者:

BEGIN

P(write);

写文件;

V(write);

END;

四、实验报告提纲

1、实验题目及要求。

2、程序中使用的数据结构及windows API函数说明。

如:CreateSemaphore( )

WaitForSingleObject( )

ReleaseSemaphore( )

CreateThread( )

Sleep()

system("pause");等

3、程序调试(按照以下测试数据要求进行调试并截图表示)

(1)测试数据文件格式

测试数据文件包括n行测试数据,分别描述创建的n个线程是读者还是写者,以及读写操作的开始时间和持续时间。每行测试数据包括四个字段,各个字段间用空格分隔。

第一字段为一个正整数,表示线程序号。

第二字段表示相应线程角色,R表示读者,w表示写者。

第三字段为一个正数,表示读写操作的开始时间:线程创建后,延迟相应时间(单位为秒)后发出对共享资源的读写申请。

第四字段为一个正数,表示读写操作的持续时间。

当线程读写申请成功后,开始对共享资源的读写操作,该操作持续相应时间后结束,并释放共享资源。

下面是一个测试数据文件的例子:

1,W, 3, 5,

2, W, 16, 5,

3, R, 5, 2,

4, W, 6, 5,

5, R, 4, 3

6,R, 11,4

(2)运行结果显示要求

利用以上测试数据要求在每个线程创建、发出读写操作申请、开始读写操作和结束读写操作时分别显示一行提示信息,以确定所有处理都遵守相应的读写操作限制。

4、结果分析和讨论。

5、附一份源程序并附上注释。

实验要求(二者选一):

1、参考“代码参考”(见下页)代码设计内容,对程序进行必要的修改并加注释。按要求完成实验报告

2、自己动手设计数据结构,并完成程序代码,代码正确无误,实验报告完整。

代码参考

#include

#include

#include

#include

#include

#include

#define MAX_PERSON 100

#define READER 0 //读者

#define WRITER 1 //写者

#define END -1

#define R READER

#define W WRITER

typedef struct _Person

{

HANDLE m_hThread;//定义处理线程的句柄

int m_nType;//进程类型(读写)

int m_nStartTime;//开始时间

int m_nWorkTime;//运行时间

int m_nID;//进程号

}Person;

Person g_Persons[MAX_PERSON];

int g_NumPerson = 0;

long g_CurrentTime= 0;//基本时间片数

int g_PersonLists[] = {//进程队列

1, W, 4, 5, 2, W, 16, 4, 3, R, 5, 2,

4, W, 6, 5, 5, R, 4, 3,

END,

};

int g_NumOfReading = 0;

int g_NumOfWriteRequest = 0;//申请写进程的个数HANDLE g_hReadSemaphore;//读者信号

HANDLE g_hWriteSemaphore;//写者信号

bool finished = false; //所有的读完成

void CreatePersonList(int *pPersonList);

bool CreateReader(int StartTime,int WorkTime,int ID);

bool CreateWriter(int StartTime,int WorkTime,int ID);

DWORD WINAPI ReaderProc(LPVOID lpParam);

DWORD WINAPI WriterProc(LPVOID lpParam);

int main()

{

g_hReadSemaphore = CreateSemaphore(NULL,1,100,NULL); //创建信号量

g_hWriteSemaphore = CreateSemaphore(NULL,1,100,NULL); //创建信号量CreatePersonList(g_PersonLists); // Create All the reader and writers

printf("Created all the reader and writer\n...\n");

g_CurrentTime = 0;

while(true)

{

g_CurrentTime++;

Sleep(100); // 100 ms

printf("CurrentTime = %d\n",g_CurrentTime);

if(finished) return 0;

system ("pause");

} // return 0;

}

void CreatePersonList(int *pPersonLists)

{

int i=0;

int *pList = pPersonLists;

bool Ret;

while(pList[0] != END)

{

switch(pList[1])

{

case R:

Ret = CreateReader(pList[2],pList[3],pList[0]);//

break; case W:

Ret = CreateWriter(pList[2],pList[3],pList[0]);

break;

}

if(!Ret)

printf("Create Person %d is wrong\n",pList[0]);

pList += 4; // move to next person list

}

}

DWORD WINAPI ReaderProc(LPVOID lpParam)//读过程

{

Person *pPerson = (Person*)lpParam;

// wait for the start time

while(g_CurrentTime != pPerson->m_nStartTime)

{ }

printf("Reader %d is Requesting ...\n",pPerson->m_nID);

printf("\n\n************************************************\n"); // wait for the write request

WaitForSingleObject(g_hReadSemaphore,INFINITE);

if(g_NumOfReading ==0)

{

WaitForSingleObject(g_hWriteSemaphore,INFINITE); }

g_NumOfReading++;

ReleaseSemaphore(g_hReadSemaphore,1,NULL);

pPerson->m_nStartTime = g_CurrentTime;

printf("Reader %d is Reading the Shared Buffer...\n",pPerson->m_nID); printf("\n\n************************************************\n"); while(g_CurrentTime <= pPerson->m_nStartTime + pPerson->m_nWorkTime) {}

printf("Reader %d is Exit...\n",pPerson->m_nID);

printf("\n\n************************************************\n"); WaitForSingleObject(g_hReadSemaphore,INFINITE);

g_NumOfReading--;

if(g_NumOfReading == 0)

{ReleaseSemaphore(g_hWriteSemaphore,1,NULL);//此时没有读者,可以写

}

ReleaseSemaphore(g_hReadSemaphore,1,NULL);

if(pPerson->m_nID == 4) finished = true; //所有的读写完成

ExitThread(0);

return 0;

}

DWORD WINAPI WriterProc(LPVOID lpParam)

{

Person *pPerson = (Person*)lpParam;

// wait for the start time

while(g_CurrentTime != pPerson->m_nStartTime)

{}

printf("Writer %d is Requesting ...\n",pPerson->m_nID);

printf("\n\n************************************************\n"); WaitForSingleObject(g_hWriteSemaphore,INFINITE);

// modify the writer's real start time

pPerson->m_nStartTime = g_CurrentTime;

printf("Writer %d is Writting the Shared Buffer...\n",pPerson->m_nID); while(g_CurrentTime <= pPerson->m_nStartTime + pPerson->m_nWorkTime) {}

printf("Writer %d is Exit...\n",pPerson->m_nID);

printf("\n\n************************************************\n");

//g_NumOfWriteRequest--;

ReleaseSemaphore(g_hWriteSemaphore,1,NULL);

if(pPerson->m_nID == 4) finished = true;//所有的读写完成

ExitThread(0);

return 0;

}

bool CreateReader(int StartTime,int WorkTime,int ID)

{

DWORD dwThreadID;

if(g_NumPerson >= MAX_PERSON)

return false;

Person *pPerson = &g_Persons[g_NumPerson];

pPerson->m_nID = ID;

pPerson->m_nStartTime = StartTime;

pPerson->m_nWorkTime = WorkTime;

pPerson->m_nType = READER;

g_NumPerson++;

// Create an New Thread

pPerson->m_hThread=

CreateThread(NULL,0,ReaderProc,(LPVOID)pPerson,0,&dwThreadID); if(pPerson->m_hThread == NULL)

return false;

return true;

}

bool CreateWriter(int StartTime,int WorkTime,int ID)

{

DWORD dwThreadID;

if(g_NumPerson >= MAX_PERSON)

return false;

Person *pPerson = &g_Persons[g_NumPerson];

pPerson->m_nID = ID;

pPerson->m_nStartTime = StartTime;

pPerson->m_nWorkTime = WorkTime;

pPerson->m_nType = WRITER;

g_NumPerson++;

// Create an New Thread

pPerson->m_hThread=

CreateThread(NULL,0,WriterProc,(LPVOID)pPerson,0,&dwThreadID); if(pPerson->m_hThread == NULL)

return false;

return true;

}

静态存储器-实验报告

计算机科学与技术系 实验报告 专业名称计算机科学与技术 课程名称计算机组成与结构 项目名称静态随机存储器实验 班级 学号 姓名 同组人员无 实验日期 2015-10-24

一、实验目的与要求 掌握静态随机存储器RAM 工作特性及数据的读写方法 二、实验逻辑原理图与分析 2.1 实验逻辑原理图及分析 实验所用的静态存储器由一片6116(2K ×8bit)构成(位于MEM 单元),如下 图所示。6116有三个控制线:CS(片选线)、OE(读线)、WE(写线),当片选有效(CS=0)时,OE=0时进行读操作,WE=0时进行写操作,本实验将CS 常接地线。 由于存储器(MEM)最终是要挂接到CPU 上,所以其还需要一个读写控制逻辑,使得CPU 能控制MEM 的读写,实验中的读写控制逻辑如下图所示,由于T3的参与,可以保证MEM 的写脉宽与T3一致,T3由时序单元的TS3给出。IOM 用来选择是对I/O 还是对MEM 进行读写操作,RD=1时为读,WR=1时为写。 XMRD XIOR XIOW XMWR RD IOM WE T3 读写控制逻辑 实验原理图如下如所示,存储器数据线接至数据总线,数据总线上接有8 个LED 灯显示D7…D0的内容。地址线接至地址总线,地址总线上接有8个LED 灯显示A7…A0的内容,地址由地址锁存器(74LS273,位于PC&AR 单元)给出。数据开关(位于IN 单元)经一个三态门(74LS245)连至数据总线,分时给出地址和数据。地址寄存器为8位,接入6116的地址A7…A0,6116的高三位地址A10…A8接地,所以其实际容量为256字节。

实现存储器EEPROM AT24C02的数据读写操作 采用IIC总线读写 C程序

/*************************************************************** 功能:11:32 2008-6-27 作者:SG 时间:2004-03-15 版本:V1.0 ***************************************************************/ #include "INTRINS.H" #include "reg52.h" #define WriteDeviceAddress 0xa0 //写驱动地址指令 #define ReadDeviceAddress 0xa1 //读驱动地址指令 sbit AT24C02_SCL = 0xa4; sbit AT24C02_SDA = 0xa5; /*------------------------------------------------------------- 功能:发起始信号 ------------------------------------------------------------*/ void Start_Cond() { AT24C02_SCL = 0; _nop_(); AT24C02_SDA = 1; _nop_(); AT24C02_SCL = 1; _nop_(); AT24C02_SDA = 0; _nop_(); } /*------------------------------------------------------------- 功能:发停止信号 ------------------------------------------------------------*/ void Stop_Cond() { AT24C02_SCL = 0; _nop_(); AT24C02_SDA = 0; _nop_(); AT24C02_SCL = 1; _nop_(); AT24C02_SDA = 1; _nop_();

计算机组成原理存储器读写和总线控制实验实验报告

信息与管理科学学院计算机科学与技术 实验报告 课程名称:计算机组成原理 实验名称:存储器读写和总线控制实验 姓名:班级:指导教师:学号: 实验室:组成原理实验室 日期: 2013-11-22

一、实验目的 1、掌握半导体静态随机存储器RAM的特性和使用方法。 2、掌握地址和数据在计算机总线的传送关系。 3、了解运算器和存储器如何协同工作。 二、实验环境 EL-JY-II型计算机组成原理实验系统一套,排线若干。 三、实验内容 学习静态RAM的存储方式,往RAM的任意地址里存放数据,然后读出并检查结果是否正确。 四、实验操作过程 开关控制操作方式实验 注:为了避免总线冲突,首先将控制开关电路的所有开关拨到输出高电平“1”状态,所有对应的指示灯亮。 本实验中所有控制开关拨动,相应指示灯亮代表高电平“1”,指示灯灭代表低电平“0”。连线时应注意:对于横排座,应使排线插头上的箭头面向自己插在横排座上;对于竖排座,应使排线插头上的箭头面向左边插在竖排座上。 1、按图3-1接线图接线: 2、拨动清零开关CLR,使其指示灯显示状态为亮—灭—亮。 3、往存储器写数据:

以往存储器的(FF ) 地址单元写入数据“AABB ”为例,操作过程如下: 4、按上述步骤按表3-2所列地址写入相应的数据 表3-2 5、从存储器里读数据: 以从存储器的(FF ) 地址单元读出数据“AABB ”为例,操作过程如下: (操作) (显示) (操作) (显示) (操作) (显6、按上述步骤读出表3-2数据,验证其正确性。 五、实验结果及结论 通过按照实验的要求以及具体步骤,对数据进行了严格的检验,结果是正确的,具体数据如图所示:

单片机原理及应用实验报告

单片机原理实验报告 专业:计算机科学与技术 学号: :

实验1 计数显示器 【实验目的】 熟悉Proteus仿真软件,掌握单片机原理图的绘图方法 【实验容】 (1)熟悉Proteus仿真软件,了解软件的结构组成与功能 (2)学习ISIS模块的使用方法,学会设置图纸、选元件、画导线、修改属性等基本操作 (3)学会可执行文件加载及程序仿真运行方法 (4)理解Proteus在单片机开发中的作用,完成单片机电路原理图的绘制【实验步骤】 (1)观察Proteus软件的菜单、工具栏、对话框等基本结构 (2)在Proteus中绘制电路原理图,按照表A.1将元件添加到编辑环境中(3)在Proteus中加载程序,观察仿真结果,检测电路图绘制的正确性 表A.1

Switches&Relays BUT BUTTON 【实验原理图】 【实验源程序】 #include sbit P3_7=P3^7; unsigned char x1=0;x2=0 ; unsigned char count=0; unsigned char idata buf[10]= {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; void delay(int time) { int k,j;

for(;time<0;time--) for(k=200;k>0;k--) for(j=500;j<0;j--); } void init() { P0=buf[x1]; delay(10); P2=buf[x2]; delay(10); } void main() { init(); while(1) { x1=count/10; x2=count%10; P0=buf[x1]; delay(10);

Eeprom的读写

所看过的对24系列I2C读写时序描述最准确最容易理解的资料,尤其是关于主从器件的应答描述和页写描述,看完后明白了很多。关于页写的描述,网络上绝大部分范程都没提到页写时的数据地址必须是每页的首地址才能准确写入,而且如果写入超过一页的数据会循环覆盖当前页的数据。 关于IIC总线 I2C总线:i2c总线是Philips 公司首先推出的一种两线制串行传输总线。它由一根数据线(SDA)和一根时钟线(SDL)组成。i2c总线的数据传输过程如图3所示,基本过程为: 1、主机发出开始信号。 2、主机接着送出1字节的从机地址信息,其中最低位为读写控制码(1为读、0为写),高7位为从机器件地址代码。 3、从机发出认可信号。 4、主机开始发送信息,每发完一字节后,从机发出认可信号给主机。 5、主机发出停止信号。 I2C总线上各信号的具体说明: 开始信号:在时钟线(SCL)为高电平其间,数据线(SDA)由高变低,将产生一个开始信号。 停止信号:在时钟线(SCL)为高电平其间,数据线(SDA)由低变高,将产生一个停止信号。 应答信号:既认可信号,主机写从机时每写完一字节,如果正确从机将在下一个时钟周期将数据线(SDA)拉低,以告诉主机操作有效。在主机读从机时正确读完一字节后,主机在下一个时钟周期同样也要将数据线(SDA)拉低,发出认可信号,告诉从机所发数据已经收妥。(注:读从机时主机在最后1字节数据接收完以后不发应答,直接发停止信号)。 注意:在I2C通信过程中,所有的数据改变都必须在时钟线SCL为低电平时改变,在时钟线SCL为高电平时必须保持数据SDA信号的稳定,任何在时钟线为高电平时数据线上的电平改变都被认为是起始或停止信号。 作为一种非易失性存储器(NVM),24系列EEPROM使用的很普遍,一般作为数据量不太大的数据存储器。下面总结一下其应用的一些要点。从命名上看,24CXX中XX的单位是kbit,如24C08,其存储容量为8k bit,即1k Byte=1024 Byte。 一、工作条件 1.工作电压(VCC) 24CXX:4.5V-5.5V 24CXX-W:2.5V-5.5V 24CXX-R:1.8V-5.5V 2.输入电平定义(VIH,VIL) VIH:0.7VCC-VCC+1 VIL:-0.45V-0.3VCC 二、硬件连接 1.上拉电阻RP的取值 由于I2C总线电容要满足小于400pf的条件。从以下波形可以看出,上拉电阻越大,总线的电容越小,可以实现的数据传输率就越大,可达400khz。 [点击图片可在新窗口打开] 2.写保护脚 芯片写保护脚是高电平有效,即WP接高电平时禁止写入

计算机组成原理与汇编实验报告

计算机组成原理与汇编 实验报告 Company Document number:WUUT-WUUY-WBBGB-BWYTT-1982GT

计算机组成原理与汇编课程设计 实验报告 目录 一、课程设计目标 (3) 二、课程设计基本要求 (3) 三、课程设计的内容 (3) 四、课程设计的要求 (5) 五、实验详细设计 (5) 1.统计文件中各字母出现的频率 (5) 2.用递归计算50以内Fibonacci 数, 以十进制数输出 (9) 3.虚拟平台模拟机实验 (11) 六、使用说明 (19) 七、总结与心得体会 (19) 八、参考文献 (20) 九、附录 (20) 1.字符统计.asm (20) 2.斐波那契数(小于50).asm (29) 一、课程设计目标 通过课程设计使学生综合运用所学过的计算机原理与汇编知识,增强解决实际问题的能力,加深对所学知识的理解与掌握,提高软硬件开发水平,为今后打下基础。 课程设计的目的和要求: 1、使学生巩固和加强《计算机原理与汇编语言》课程的基本理论知识。

2、使学生掌握汇编语言程序设计的方法及编程技巧,正确编写程序。 3、使学生养成良好的编程习惯并掌握调试程序的基本方法。 4、使学生养成规范书写报告文档的能力,撰写课程设计总结报告。 5、通过查阅手册和文献资料,培养学生独立分析问题和解决问题的能力。 二、课程设计的基本要求 1、认真查阅资料,独立完成设计任务,每道题都必须上机通过。 2、编写预习报告,写好代码,上机调试。 3、独立思考,培养综合分析问题解决问题和调试程序的能力。 4、按时完成课程设计,写出课程设计报告。 三、课程设计的内容 1、给定一个英文ASCII码文件,统计文件中英文字母的频率,以十进制形式输出。 2、用递归计算50以内Fibonacci 数, 以十进制数输出. 3、虚拟平台的模型机实验,具体要求如下: 1)选择实验设备,将所需要的组件从组件列表中拖到实验设计流程栏中 2)搭建实验流程:根据原理图1和电路图(见附件),将已选择的组件进行连线。 3)输入机器指令:选择菜单中的“工具”,再选择“模型机调试”,在指令输入窗 口中输入如下指令: 00000000 00010000 00001001 00100000 00001011 00110000 00001011 01000000 00000000 00000001 本实验设计机器指令程序如下:

STC单片机EEPROM读写程序

/* STC89C54RD+的flash空间从0x4000~0xf3ff 共90个扇区,每扇区512字节*/ // #define BaseAddr 0x1000 /* 51rc */ // #define EndSectoraddr 0x3d00 /* 51rc */ // #define EndAddr 0x3fff /* 51rc 12K eeprom */ #define BaseAddr 0x4000 #define EndSectoraddr 0xf200 #define EndAddr 0xf3ff #define UseAddr 0x1000 /* ------------- 定义扇区大小------------- */ #define PerSector 512 /* 用户程序需要记忆的数组, 用户实际使用了n-1个数据,数组长度规整到 2 4 8 16 32 64 上*/ uchar Ttotal[16] = { 0x55, /* 作为判别引导头使用,用户程序请不要修改它*/ /* 用户保存记忆的数据*/ 0x01, /* 用途说明....*/ 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, }; uint timerForDelay, /* 专供延时用的变量*/ i, /* 循环变量*/ EepromPtr; /* eeprom读写指针*/ /* --------------- 命令定义--------------- */ #define RdCommand 0x01 /* 字节读*/ #define PrgCommand 0x02 /* 字节写*/

实验五存储器读写实验报告

实验五存储器读写实验报告 实验报告 课程名:《计算机组成原理》题目:实验五存储器读写班级:计算机+ 自动化0901班姓名:张哲玮,郑俊飞 《计算机组成原理》实验报告- 1 - 实验五、存储器读写实验 一、目的与要求 (1)掌握存储器的工作特性 (2)熟悉静态存储器的操作过程,验证存储器的读写方法 二、实验原理及原理图 (1)?静态存储器芯片6116的逻辑功能 6116是一种数据宽度为8位(8个二进制位),容量为2048字节的静态存储器芯片,封在24引脚的封装中,封装型式如图2-7所示。6116芯片有8根双向三态数据线D7-D0,所谓三态是指输入状态,输出状态和高阻状态,高阻状态数据线处于一种特殊的“断开”状态;11根地址线A10-A0,指示芯片内部2048个存储单元号;3根控制线CS片选控制信号,低电平时,芯片可进行读写操作,高电平时,芯片保存信息不能进行读写;WE 为写入控制信号,低电平时,把数据线上的信息存入地址线A10-A0指示的存储单元中;0E为输出使能控制信号,低电平时,把地址线A10-A0指示的存储单元中的数据读出送到数据线上。

6116芯片控制信号逻辑功能表 (2).存储器实验单元电路 因为在计算机组成原理实验中仅用了256个存储单元,所以6116芯片的3根地址线A11-A8接地也没有多片联用问题,片选信号CS接地使芯片总是处于被选中状态。芯片的WE和0E信号分别连接实验台的存储器写信号M-W和存储器读信号M-Ro这种简化了控制过程的实验电路可方便实验进行。 存储器部件电路图 (3)?存储器实验电路 存储器读\写实验需三部分电路共同完成:存储器单元(MEM UNIT),地址寄存器单元(ADDRESS UNIT)和输入,输出单元(INPUT/OUTPIT UNIT).存储器单元6116芯片为中心构成,地址寄存器单元主要由一片74LS273组成,控制信号B-AR的作用是把总线上的数据送入地址寄存器,向存储器单元电路提供地址信息,输入,输出单元作用与以前相同。

研究生数字图像处理实验内容及要求(新)

《数字图像处理》实验内容及要求 实验内容 一、灰度图像的快速傅立叶变换 1、 实验任务 对一幅灰度图像实现快速傅立叶变换(DFT ),得到并显示出其频谱图,观察图像傅立叶变换的一些重要性质。 2、 实验条件 微机一台、vc++6.0集成开发环境。 3、实验原理 傅立叶变换是一种常见的图像正交变换,通过变换可以减少图像数据的相关性,获取图像的整体特点,有利于用较少的数据量表示原始图像。 二维离散傅立叶变换的定义如下: 11 2( )00 (,)(,)ux vy M N j M N x y F u v f x y e π---+=== ∑∑ 傅立叶反变换为: 112( )00 1 (,)(,)ux vy M N j M N u v f x y F u v e MN π--+=== ∑∑ 式中变量u 、v 称为傅立叶变换的空间频率。图像大小为M ×N 。随着计算机技术和数字电路的迅速发展,离散傅立叶变换已经成为数字信号处理和

图像处理的一种重要手段。但是,离散傅立叶变换需要的计算量太大,运算时间长。库里和图基提出的快速傅立叶变换大大减少了计算量和存储空间,因此本实验利用快速傅立叶变换来得到一幅灰度图像的频谱图。 快速傅立叶变换的基本思路是把序列分解成若干短序列,并与系数矩阵元素巧妙结合起来计算离散傅立叶变换。若按照奇偶序列将X(n)进行划分,设: ()(2) ()(21)g n x n h n x n =??=+? (n=0,1,2,…,12N -) 则一维傅立叶变换可以改写成下面的形式: 1 0()()N mn N n X m x n W -==∑ 11220 ()()N N mn mn N N n n g n W h n W --===+∑∑ 1122(2)(21) (2)(21)N N m n m n N N n n x n W x n W --+===++∑∑

计算机组成原理实验五存储器读写实验

实验五 存储器读写实验实验目的 1. 掌握存储器的工作特性。 2. 熟悉静态存储器的操作过程,验证存储器的读写方法。 二、实验原理 表芯片控制信号逻辑功能表

2. 存储器实验单元电路 芯片状态 控制信号状态 DO-D7 数据状态 M-R M -W 保持 1 1 高阻抗 读出 0 1 6116-^总钱 写人 1 0 总线-*6116 无效 报警 ^2-10 D7—DO A7—A0

團2-8存储器实验电路逻辑图 三、实验过程 1. 连线 1) 连接实验一(输入、输出实验)的全部连线。 2) 按逻辑原理图连接M-W M-R 两根信号低电平有效信号线 3) 连接A7-A0 8根地址线。 4) 连接B-AR 正脉冲有效信号 2. 顺序写入存储器单元实验操作过程 1) 把有B-AR 控制开关全部拨到0,把有其他开关全部拨到1,使全部信号都处 于无效 状态。 2) 在输入数据开关拨一个实验数据,如“ 00000001”即16进制的01耳 把IO-R 控制开关拨下,把地址数据送到总线。 3) 拨动一下B-AR 开关,即实现“1-0-1 ”产生一个正脉冲,把地址数据送地 址寄存器保存。 4) 在输入数据开关拨一个实验数据,如“ 10000000',即16进制的80耳 把IO-R 控 制开关拨下,把实验数据送到总线。 3. 存储器实验电路 0 O O 0 0 olo O O O O 0 00 OUTPUT L/O :W 8-AR £ ■」2 ■七 ol^Fgr' L P O 74LS273 A7- AO vz 0 o|o 0 r 6116 A7 INPUT D7-O0 [olololololololol T2

IIC总线的使用EEPROM芯片的读写程序

51单片机第二十二课IIC总线的使用EEPROM芯片的读写 所属类别:课程代码发布日期:2011-03-05 点击量:341 #include #include #define uchar unsigned char #define uint unsigned int sbit sda=P2^1; sbit scl=P2^0; unsigned char code smg_du[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e, 0x79,0x71,0x00}; unsigned char code smg_we[]={0x08,0x18,0x28,0x38,0x48,0x58,0x68,0x78}; void start(void); void stop(void); void ack(void); void noack(void); void iicwr_byte(uchar dat); uchar iicre_byte(void); void delay (void); void init(void); void delay1(void); void write_byte(uchar add,uchar dat); uchar read_byte(uchar add); /////////////////////////////////// void delay1(void) { uint a=30000; while(a--); } void delay (void) { _nop_();_nop_();_nop_();_nop_(); _nop_();_nop_();_nop_();_nop_(); }

单片机串行通信实验报告(实验要求、原理、仿真图及例程)

《嵌入式系统原理与实验》实验指导 实验三调度器设计基础 一、实验目的和要求 1.熟练使用Keil C51 IDE集成开发环境,熟练使用Proteus软件。 2.掌握Keil与Proteus的联调技巧。 3.掌握串行通信在单片机系统中的使用。 4.掌握调度器设计的基础知识:函数指针。 二、实验设备 1.PC机一套 2.Keil C51开发系统一套 3.Proteus 仿真系统一套 三、实验内容 1.甲机通过串口控制乙机LED闪烁 (1)要求 a.甲单片机的K1按键可通过串口分别控制乙单片机的LED1闪烁,LED2闪烁,LED1和LED2同时 闪烁,关闭所有的LED。 b.两片8051的串口都工作在模式1,甲机对乙机完成以下4项控制。 i.甲机发送“A”,控制乙机LED1闪烁。 ii.甲机发送“B”,控制乙机LED2闪烁。 iii.甲机发送“C”,控制乙机LED1,LED2闪烁。 iv.甲机发送“C”,控制乙机LED1,LED2停止闪烁。 c.甲机负责发送和停止控制命令,乙机负责接收控制命令并完成控制LED的动作。两机的程序要 分别编写。 d.两个单片机都工作在串口模式1下,程序要先进行初始化,具体步骤如下: i.设置串口模式(SCON) ii.设置定时器1的工作模式(TMOD) iii.计算定时器1的初值 iv.启动定时器 v.如果串口工作在中断方式,还必须设置IE和ES,并编写中断服务程序。

(2)电路原理图 Figure 1 甲机通过串口控制乙机LED闪烁的原理图 (3)程序设计提示 a.模式1下波特率由定时器控制,波特率计算公式参考: b.可以不用使用中断方式,使用查询方式实现发送与接收,通过查询TI和RI标志位完成。 2.单片机与PC串口通讯及函数指针的使用 (1)要求: a.编写用单片机求取整数平方的函数。 b.单片机把计算结果向PC机发送字符串。 c.PC机接收计算结果并显示出来。 d.可以调用Keil C51 中的printf来实现字符串的发送。 e.单片机的数码港显示发送的次数,每9次清零。

51内部eeprom读写,实现掉电存储

主函数: #include #include"EEPROM.h" #include"smg.h" void main() { num=byte_read(DEBUG_Data_Memory_Begin_Sector_addr);//字节读(程序开始时读取EEPROM中数据) if(num>=60)num=0;//防止首次上电时读取出错?? while(1) { if(num<60) { display(num); num++;delay(5); delay1(DELAY_CONST); sector_erase(DEBUG_Data_Memory_Begin_Sector_addr);//擦出扇区 byte_program (DEBUG_Data_Memory_Begin_Sector_addr,num);//字节编程} if(num==60)num=0; } } EEPROM.h: /*STC89C51RC,STC89LE51RC 0x2000 共八个扇区 STC89C52RC,STC89LE52RC 0x2000 共八个扇区 STC89C54RD+,STC89LE54RD+ 0x8000 共五十八个扇区 STC89C55RD+,STC89LE55RD+ 0x8000 共五十八个扇区 STC89C58RD+,STC89LE58RD+ 0x8000 共五十八个扇区*/ #include #include //sfr定义特殊功能寄存器 sfr ISP_DA TA =0xe2;//ISP/IAP 操作时的数据寄存器,从Flash 读出的数据放在此处,向Flash 写的数据也需放在此处 sfr ISP_ADDRH =0xe3;//ISP/IAP 操作时的地址寄存器高八位 sfr ISP_ADDRL =0xe4;//ISP/IAP 操作时的地址寄存器低八位 sfr ISP_CMD =0xe5;//ISP/IAP 操作时的命令模式寄存器,须命令触发寄存器触发方可生效 sfr ISP_TRIG =0xe6;//ISP/IAP 操作时的命令触发寄存器 sfr ISP_CONTR =0xe7;//ISP/IAP 控制寄存器 /* 定义命令*/

实验一 存储器实验

实验一存储器实验 1.FPGA中LPM_ROM定制与读出实验 一.实验目的 1、掌握FPGA中lpm_ROM的设置,作为只读存储器ROM的工作特性与配置方法。 2、用文本编辑器编辑mif文件配置ROM,学习将程序代码以mif格式文件加载于 lpm_ROM中; 3、在初始化存储器编辑窗口编辑mif文件配置ROM; 4、验证FPGA中mega_lpm_ROM的功能。 二.实验原理 ALTERA的FPGA中有许多可调用的LPM (Library Parameterized Modules)参数化的模块库,可构成如lpm_rom、lpm_ram_io、lpm_fifo、lpm_ram_dq的存储器结构。CPU 中的重要部件,如RAM、ROM可直接调用她们构成,因此在FPGA中利用嵌入式阵列块EAB 可以构成各种结构的存储器,lpm_ROM就是其中的一种。lpm_ROM有5组信号:地址信号address[ ]、数据信号q[ ]、时钟信号inclock、outclock、允许信号memenable,其参数都就是可以设定的。由于ROM就是只读存储器,所以它的数据口就是单向的输出端口,ROM中的数据就是在对FPGA现场配置时,通过配置文件一起写入存储单元的。图3-1-1中的lpm_ROM有3组信号:inclk——输入时钟脉冲;q[23、、0]——lpm_ROM的24位数据输出端;a[5、、0]——lpm_ROM的6位读出地址。 实验中主要应掌握以下三方面的内容: ⑴ lpm_ROM的参数设置; ⑵ lpm_ROM中数据的写入,即LPM_FILE初始化文件的编写; ⑶lpm_ROM的实际应用,在GW48_CP+实验台上的调试方法。 三.实验步骤 (1)用图形编辑,进入mega_lpm元件库,调用lpm_rom元件,设置地址总线宽度address[] 与数据总线宽度q[],分别为6位与24位,并添加输入输出引脚,如图3-1-1设置与连接。 (2)设置图3-1-1为工程。 (3)在设置lpm_rom数据参数选择项lpm_file的对应窗口中(图3-1-2),用键盘输入 lpm_ROM配置文件的路径(rom_a、mif),然后设置在系统ROM/RAM读写允许,以便能

实验报告(原理图库的建立)

物理与电子科学学院PCB 实验 —原理图库的设计 教 案 姓名:刘斌 班级:物电 1105 班 学号: 2011112030560 指导老师:曹老师

实验三原理图库的设计教案 (物理与电子科学学院1105班刘斌2011112030560) 一、实验目的: 1.熟悉原理图工作环境,图形工具中各种命令的使用。 2.熟悉原理图符号的编辑,原理图库的建立。 二、实验内容 在protel DXP中完成,完成下列原理图符号的制作。 1.AT89c51单片机原理图符号制作 2.74LS00芯片的原理图制作

二、AT89c51单片机原理图符号制作实验步骤 第一步:新建工程;“打开软件—文件—新建—PCBproject”,步骤如图 第二步:保存工程;快捷保存方式:可以直接点击菜单栏中的保存按钮即可进行保存操作,或者”File—Save Project”,接着选择保存路径即可,步骤如图: 第三步:新建原理图文件;“在Project命令栏中,PCB Project右击,选择Add New to Project ——Schematic”,步骤如图 第四步:新建原件库文件;“Project—Add New to Project—Schematic Library”,步骤如图

第五步:绘制元器件;可以直接在工具栏选择想要的图形,步骤如图: 第六步:绘制元器件引脚;步骤如图: 第七步:绘制元器件;结构如图: 第八步:在原理图中查看绘制好的元器件图形;形状如图: 第九步:对绘制好的元件原理图,进行适当的调整和修改,使其形状尽量的合理美观。

三、74LS00芯片的原理图制作实验步骤 第一、二、三、四步重复:二、A T89c51单片机原理图符号制作实验步骤 第五步:在这里74LS00芯片原理图通过“分部分”来完成绘制;步骤如图: 第五步:添加五个Part,分别为(PartA、B、C、D、E),然后在Part BCDE绘制如下图形;步骤如图: 第六步:在Part A中绘制如下图形;步骤如图:

AT24C02EEPROM读写程序

;--------------------------------------------------------------------------------------------------------------------- ;本程序是针对AT89S52单片机编制的EEPROM读写程序(2013.8.4测试通过) ;本程序在4MHZ、12MHZ和24MHZ分别测试通过 ;AT24C02的A0、A1、A2均接GND,设备地址高7位为(1010)000;WP接GND,充许对EEPROM正常读写 ;本程序仅作学习交流之用。 ;--------------------------------------------------------------------------------------------------------------------- SCl equ P2.0 ;SCL接A T89S52的P2.0端口,作为EEPROM的串行输入时钟 SDA equ P2.1 ;SDA接AT89S52的P2.1端口,作为主机与EEPROM之间信息串行传输总线WRITEDATA equ 08H;拟写入EEPROM的数据在主机中的存贮单元地址 READDATA equ 09H ;从EEPROM读取的数据存放到主机存贮单元地址EPROMADDRESS equ 0AH;拟随机读写EEPROM的存贮单元地址 ;------------------------------------------------ ORG 00H LJMP MAIN ;------------------------------------------------ ORG 50H MAIN: MOV SP,#20H;防止堆栈影响已用内存数据 ;以下为写EEPROM过程 mov EPROMADDRESS,#09H;该地址可以随意输入(00H~FFH),但读和写的地址须相同 MOV WRITEDA TA,#01010010B;该数字可以随意输入,并将读和写的数据进行比较;如读数正确则按将读出数据在P1口输出,可在P1口各位分别接LED灯直观显示出来。 LCALL WRITEEEPROMR ;以下为读EEPROM过程 mov EPROMADDRESS,#09H;该地址可以随意输入(00H~FFH),但读和写的地址须相同 LCALL READEEPROMR ;以下为EEPROM读写操作验证 MOV A,WRITEdata MOV B,A MOV A,READDATA CJNE A,B,MAIN1 MOV P1,READDATA;写入数和读出数相等时,读出的数据在P1口输出并按位分别控制LED灯直观显示 sJMP $ MAIN1: MOV P1,#00H;写入数和读出数相等时,LED灯全亮 ;以下可接其它主程序,此处暂为死循环 SJMP $ ;--------------------------------------------------------------------------------------------------------------------- ;WRITEEEPROMR是随机写EEPROM(AT24C02)子程序 ;入口1:EEPROMADRESS(拟读写EEPROM存贮单元地址,00~FFH) ;入口2:WRITEDATA(拟写入EEPROM的字节数据在主机的存放地址)

计算机组成原理实验五存储器读写实验

实验五 存储器读写实验 一、实验目的 1.掌握存储器的工作特性。 2.熟悉静态存储器的操作过程,验证存储器的读写方法。 二、实验原理 1.静态存储器芯片的6116的逻辑功能

2.存储器实验单元电路

3.存储器实验电路 三、实验过程 1.连线 1)连接实验一(输入、输出实验)的全部连线。 2)按逻辑原理图连接M-W、 M-R 两根信号低电平有效信号线。 3)连接A7-A0 8根地址线。 4)连接B-AR正脉冲有效信号 2.顺序写入存储器单元实验操作过程 1)把有B-AR控制开关全部拨到0,把有其他开关全部拨到1,使全部信号都处 于无效状态。 2)在输入数据开关拨一个实验数据,如“00000001”,即16进制的01H。 把IO-R控制开关拨下,把地址数据送到总线。 3)拨动一下B-AR开关,即实现“1-0-1”,产生一个正脉冲,把地址数据送地 址寄存器保存。 4)在输入数据开关拨一个实验数据,如“10000000”,即16进制的80H。 把IO-R控制开关拨下,把实验数据送到总线。

5)拨动M—W控制开关,即实现“1—0—1”,产生一个负脉冲,把实验数据存 入存储器的01H号单元。 6)按表2-11所示的地址数据和实验数据,重复上面(1)、(2)、(3)、(4)4 个步骤,顺序在存储器单元中存放不同的实验数据。 表2-11 推荐的典型实验数 3.顺序读出存储器单元实验操作过程 (1)在输入数据开关上拨一个地址(如00000001,即16进制数01H),拨下IO —R开关把地址数据送人总线。 (2)拨动一下B—AR开关,即实现“0—1—0”,产生一个正脉冲,把地址数据送地址寄存器(AR)保存。 (3)把IO—R开关拨上,切断输入开关与总线的联系。 (4)拨下M—R控制开关,把实验数据从存储器的01H号单元赌场送总线,验证实验数据是否与表2-11中的内容相符合。 (5)拨动IO—R开关,即实现“1—0—1”,产生一个负脉冲,把从存储器读出的实验数据从总线送输出显示电路L7—L0。 (6)拨上M—R控制开关,使存储器处于保持状态。 (7)重复上面的(1)—(6)6个步骤,按顺序从地址01H—05H的存储器单元中读出实验数据送输出显示电路L7—L0,验证读出数据与表2-11中的内容是否相符。

IC读写EEPROM问题总结

I C读写E E P R O M问题 总结 文件管理序列号:[K8UY-K9IO69-O6M243-OL889-F88688]

2017年6月30日星期五 目的:利用TMS320F2801芯片上外设I2C(2线串口)读写EEPROM数据(24LC128) 关键点1:24LC时钟频率400KHz,寄存器设置如下: I2caRegs.I2CPSC.all = 9; // Prescaler - need 7-12 Mhz on module clk I2caRegs.I2CCLKL = 10; // NOTE: must be non zero I2caRegs.I2CCLKH = 5; // NOTE: must be non zero 时钟频率也可设为200KHz,三个参数分别为9、20、20(CPU时钟频率为100MHz)(未测试?) 关键点2:波形分析 问题:I2C模块是不是只有I2CCNT 减到0才会发出停止信号 I2C模块是硬件的,当检测到发送完了就会发结束自动发信号,不需要人为干预 问题1:字节写操作正常,但是字节读函数出错 原因:写EEPROM是在七位器件地址后添加写标志,而读EEPROM需要在七位器件地址后添加写标志。 关键点:读EEPROM数据需要发送两次命令。第一次为写地址(此地址会被赋值给EEPROM内的地址指针),因此需要添加写标志;第二次为读数据,将写标志改为读标志。

问题2:主机接收时,SDA数据线上有数据传输,且I2CDRR接收数据寄存器有数据更新,但寄存器显示不可读,即CPU认为一直没接收到数据,一直停在下面语句 while 关键点:初始化设置时采用的是FIFO接收方式,因此无效,应查询FIFO 接收中断位while方式查询位。 此位只有在非FIFO中断接收方式时才有效。 问题3:断续单字节读写正常,但是采用连续的单字节读写出错。 原因:EEPROM写过程的结束并不是I2C总线写结束就结束,实际上I2C 总线的写入数据先被保存到了EEPROM内部的缓冲区,当遇到I2C结束条件后,EEPROM才启动内部写过程,这个过程才是保存数据的过程。非常悲哀的是这个过程比较长,官方文档标注为5ms。如果在这5ms以内对EEPROM芯片访问将被忽略。 关键点:读写EEPROM应延时至少5ms,软件延时10ms do{}while(EEPROM_Timer <= 10); //10ms 问题4:查询EEPROM写过程是否结束造成死机,只能查询EEPROM读过程。 官方文档说EEPROM内部写周期最长为5ms,在很多情况下是远远低于 5ms的,为了节约时间,官方给出一个解决办法。当写周期完毕后就开始进行应答查询,来确定EEPROM写周期何时结束。所谓应答查询官方解释为:就是向EEPROM发送一个I2C起始条件后发送器件地址和一个读写标

微机原理存储器读写实验

微机原理及单片机应用实验 实验报告 实验存储器读写实验 实验内容 对指定地址区间的RAM(4000H~4FFH)先进行写数据55AAH,然后将其内容读出再写到5000H~5FFH中。 实验步骤 l、在系统提示符“P”状态下,按SCAL键。2、输入执行地址1850后,按EXEC键。3、稍后按RST键退出,用存贮器读方法检查4000H~43FFH中的内容和5000~53FFH中的内容应都是55AA。 实验程序清单 CODE SEGMENT ;RAM.ASM ASSUME CS:CODE PA EQU 0FF20H ;字位口 PB EQU 0FF21H ;字形口 PC EQU 0FF22H ;键入口 ORG 1850h START: JMP START0 BUF DB ?,?,?,?,?,? data1: db0c0h,0f9h,0a4h,0b0h,99h,92h,82h,0f8h,80h,90h,88h,83h,0c6h,0a1h db 86h,8eh,0ffh,0ch,89h,0deh,0c7h,8ch,0f3h,0bfh,8FH START0: MOV AX,0H MOV DS,AX ;写数据段地址 MOV BX,4000H ;内存首址 MOV AX,55AAH ;要写入的字 MOV CX,0200H ;数据长度 RAMW1: MOV DS:[BX],AX ;写数据 ADD BX,0002H ;下一个单元 LOOP RAMW1 ;循环写 MOV AX,4000H ;首址 MOV SI,AX ;SI置源首址 MOV AX,5000H MOV DI,AX ;DI置目首址 MOV CX,0400H ;数据长度 CLD ;增址 REP MOVSB ;串传送 call buf1 ;写”62256-” mov cx,0ffh con1: push cx call disp ;显示 pop cx

PIC单片机的EEPROM读写实例及说明

PIC单片机的EEPROM读写实例及说明 ; PIC 单片机的EEPROM 读写实例及说明; ******************************************************************** ********; This is a program to test the function of readingwritting for EEPROM.; You can observe the value of register(30H--?) buy changing “VALU” and “WRC_”.; Notice that:it must be { ADDR+WRC_=0ffh } !;******************************************************************* *********include “p16f877.inc”ADDR EQU 20H ;写入地址寄存器VALU EQU 21H ;写入值REC_ EQU 22H ;读计数WRC_ EQU 24H ;写计数org 0goto mainmainbcf STATUS,RP1bcf STATUS,RP0 ;bank0movlw 10hmovwf ADDR ;写入EEPROM 初始值movlw 90hmovwf VALU ;初始写入值movlw 30hmovwf FSR ;间址,读出值初始存放地址movlw 0Fhmovwf WRC_ ;写入次数movwf REC_;incf REC_ ;读出次数wri_ ;写子程序bsf STATUS,RP1bsf STATUS,RP0 ;bank3btfsc EECON1,WRgoto $-1bcf STATUS,RP0bcf STATUS,RP1 ;bank0movf ADDR,Wbsf STATUS,RP1 ;bank2movwf EEADRbcf STATUS,RP1 ;bank0movf VALU,Wbsf STATUS,RP1 ;bank2movwf EEDATAbsf STATUS,RP0 ;bank3bcf EECON1,EEPGD ;to data memorybsf EECON1,WRENbcf INTCON,GIEmovlw 55hmovwf EECON2movlw 0aahmovwf EECON2bsf EECON1,WRbcf STATUS,RP0bcf STATUS,RP1 ;bank0incf ADDR,1decf VALU,1decfsz WRC_ ;all write,to read_goto wri_read_ ;读子程序bcf STATUS,RP1bcf STATUS,RP0 ;bank0decf ADDR ;next valuebsf STATUS,RP1 ;bank2movwf EEADRbsf STATUS,RP0 ;bank3EEwr.asm 程序说明:1、本程序是对PIC16F877 单片机的EEPROM 数据区进行读写的演示程序;

相关文档
最新文档