实验4模拟输入输出接口

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

实验四模拟输入输出接口

一、实验目的

1. 学习模拟输入输出接口的原理

2. 掌握接口程序实现的基本方法

二、实验设备

标准硬件。

三、实验内容

在实验箱的CPU板上运行程序,拨动相应开关,与它对应的LED灯显示电平的高低,同时,LCD上显示相应的数据值。

四、实验原理

使用一片缓冲芯片74LS244来把CPU外面的输入数据写入CPU的并行总线上,之后,并行总线上的数据被一片数据锁存芯片74LS273保留,CPU通过选中锁存芯片,并读取预先设给锁存器地址内的内容,就可以把数据读出,来确定外面的数据的高低。本实验的输入是用8个拨动开关两种工作状态来表示输入接口的高低状态,然后,再通过8个LED灯亮和灭两种工作状态,以及LCD上用数据值来清楚的反映各状态的输出显示,从而完成模拟的输入输出接口的实现。

在C程序中的实现,如下程序所示:

while(1)

{

for(i=0;i<1000;i++);//延时

rrr = (*(volatile unsigned char*)0x20000016);//CPU把值写入并行数据总线

d0 = rrr>>7&1;

d1 = rrr>>6&1;

d2 = rrr>>5&1;

d3 = rrr>>4&1;

d4 = rrr>>3&1;

d5 = rrr>>2&1;

d6 = rrr>>1&1;

d7 = rrr>>0&1;//将数据按位赋值

data = (d7<<7|d6<<6|d5<<5|d4<<4|d3<<3|d2<<2|d1<<1|d0);

(*(volatile unsigned char*)0x20000000) = data;//CPU把总线值写入锁存器

for(i=0;i<1000;i++);

if (data != data_pre) //data_pre为上一个数据,若当前数据与上一个相同则不处理

{

Set_Color(GUI_YELLOW);

Set_Font(&GUI_Font8x16);

Disp_BinAt(data,170,120,8);//显示二进制数据

Disp_HexAt(data,170,140,4);//显示十六进制数据

Disp_DecAt(data,170,160,3);//显示十进制数据

data_pre = data; //保存数据

}

}

五、实验步骤

1.打开LCD电源开关。

2.打开ADS1.2开发环境,打开\基础实验 \实验八\IO_SIM.mcp项目文件,然后进行compile和make生成*.axf文件。

3.编译通过后,进入ADS1.2调试界面,加载基础实验\实验八

\IO_SIM_Data\Debug中的映象文件IO_SIM.axf。

4.在ADS调试环境下全速运行映象文件。LCD上有图形显示后,将拨码开关0-7全部拨到ON,拨动LED灯下方的开关K1-k8,拨到L为0,H为1,0时LED亮。观察开关上方的8个LED灯的亮灭情况,以及LCD上的显示情况。每个开关代表1个数字位,遵循二进制规则。

该实验是从数据总线上把检测到的数据变化,锁存到锁存器中,然后又从总线上读出数据,显示到LCD上,来模拟I/O实现。

六、实验结果

在ADS调试环境下全速运行映象文件。LCD上有图形显示后,按下实验箱下部一排中的任一模拟输入的带锁键值,观察8位数码管上方的8个LED灯的亮灭情况,以及LCD上的显示情况。

每个按键代表1个数字位,按键均不按下,代表数字量为255,全按下为0,每个按键的都是2的权值,在不按下时,最靠近键盘的按键代表1,之后依次是2;4;8;16;32;64;128。按下时均代表0。该实验是从数据总线上把检测到的数据变化,锁存到锁存器中,然后又从总线上读出数据,显示到LCD上,来模拟I/O实现。

七、源程序

#include

#include

#include "2410addr.h"

#include "2410lib.h"

#include "mmu.h"

void HaltUndef(void)

{

Uart_Printf("Undefined instruction exception.\n");

while(1);

}

void HaltSwi(void)

{

Uart_Printf("SWI exception.\n");

while(1);

}

void HaltPabort(void)

{

Uart_Printf("Pabort exception.\n");

while(1);

}

void HaltDabort(void)

{

Uart_Printf("Dabort exception.\n");

while(1);

}

void Isr_Init(void)

{

pISR_UNDEF = (unsigned)HaltUndef;

pISR_SWI = (unsigned)HaltSwi;

pISR_PABORT = (unsigned)HaltPabort;

pISR_DABORT = (unsigned)HaltDabort;

rINTMOD = 0x0; //All=IRQ mode

rINTMSK = BIT_ALLMSK; //All interrupt is masked.

rINTSUBMSK = BIT_SUB_ALLMSK; //All sub-interrupt is masked. <- April 01, 2002 SOP

}

void Target_Init(void)

{

MMU_Init();

//ChangeMPllValue(0xa1,0x3,0x1); // FCLK=202.8MHz ChangeMPllValue(0x52,0x1,0x1); // FCLK=180.0MHz

// ChangeMPllValue(0x70,0x2,0x2); // FCLK=90.0MHz

ChangeClockDivider(1,1); // 1:2:4

Port_Init();

Isr_Init();

Uart_Init(0,19200);

//Uart_Init(0,115200);//Uart_Init(0,230400);

Uart_Select(0);

//Touch_Init();//TouchINT_Init();

}

void Main()

{

Target_Init();

GUI_Init();

Delay(0);

Delay(10000);

Set_Color(GUI_MAGENTA);

Fill_Rect(0,0,639,50);

Set_Color(GUI_WHITE);

Set_BkColor(GUI_MAGENTA);

Set_Font(&CHINESE_FONT16);

Disp_String(CN_start"达盛嵌入式实验平台"CN_end,4,20);

Set_Color(GUI_RED);

Set_BkColor(GUI_RED);

Fill_Rect(0,51,639,479);

Set_Color(GUI_WHITE);

Fill_Rect(50,70,590,72);

Fill_Rect(50,70,52,400);

Fill_Rect(50,398,590,400);

相关文档
最新文档