实验4模拟输入输出接口
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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);