ARM7基础实验附原理图.docx
- 文档编号:18601058
- 上传时间:2023-08-20
- 格式:DOCX
- 页数:29
- 大小:185.99KB
ARM7基础实验附原理图.docx
《ARM7基础实验附原理图.docx》由会员分享,可在线阅读,更多相关《ARM7基础实验附原理图.docx(29页珍藏版)》请在冰点文库上搜索。
ARM7基础实验附原理图
菜鸟的ARM学习笔记(第一阶段)
1.LED闪烁——ARM的Proteus实验
2.开关控制LED——ARM的Proteus实验
3.LCD——ARM的Proteus实验
4.UART——ARM的Proteus实验
5.Eint1外部中断——ARM的Proteus实验
6.多个外部中断——ARM的Proteus实验
7.中断结合串口——ARM的Proteus实验
8.定时器——ARM的Proteus实验
9.SPI通信——ARM的Proteus实验
10.SPI通信(多从设备)——ARM的Proteus实验
11.ADC数模转换——ARM的Proteus实验
LED闪烁——ARM的Proteus实验
实验原理
ARM(LPC21XX)的一个I/O口接LED,通过给它送0和1来设置LED的亮和灭。
Proteus仿真电路图
步骤
KEIL
1.创建新工程
2.选择ARM型号(KEIL会自动生成启动代码startup.s)
3.添加源文件,编写程序
4.设置项目选项(是否输出hex、lst文件,设置linkerscript)
Proteus
1.绘制电路图
2.载入程序
3.仿真
C语言源程序
/******************************************************************************/
/**/
/*led.c:
用ARM点亮一个led并闪烁,有点浪费……*/
/**/
/******************************************************************************/
#include
/*******************************************************************************
**函数名:
delay()
**描述:
软件延时
********************************************************************************/
voiddelay(void){
unsignedvolatilelongi,j;
for(i=0;i<60000;i++)
for(j=0;j<5;j++)
;
}
intmain(void){
PINSEL0=0;/*设置引脚为GPIO*/
IO0DIR=0x000001;/*将P0.0设置为输出*/
IO0SET=0x000001;/*将P0.0置1,也就是让led灭*/
while
(1){
IO0CLR=0x000001;
delay();
IO0SET=0x000001;
delay();
}
}
开关控制LED——ARM的Proteus实验
实验原理
ARM的P0.1口接按钮,再通过P0.0控制LED的亮、灭。
本实验的电路图以及实验均在上一个实验基础之上修改。
其中电路图只多了一个开关。
Proteus仿真电路图
实验步骤略(与上一实验相同)
C语言源程序
/******************************************************************************/
/**/
/*led.c:
用ARM实现开关控制led并亮灭,还是有点浪费……*/
/**/
/******************************************************************************/
#include
#defineP0_10x02;/*P0.1*/
/*******************************************************************************
**函数名:
delay()
**描述:
软件延时
********************************************************************************/
voiddelay(void){
unsignedvolatilelongi;
for(i=0;i<10000;i++)
;
}
intmain(void){
intp01State;
PINSEL0=0;/*设置引脚为GPIO*/
IO0DIR=0x000001;/*将P0.0设置为输出*/
IO0SET=0x000001;/*将P0.0置1,也就是让led灭*/
while
(1){
p01State=IO0PIN&P0_1;/*读取开关状态*/
if(p01State==0){
IO0CLR=0x000001;
delay();
}
else{
IO0SET=0x000001;
delay();
}
}
}
LCD——ARM的Proteus实验
实验原理
ARM的P0.0口到P0.10口接LCD,P0.11接LED。
每过一段时间LED状态改变,LCD显示LED的状态。
Proteus仿真电路图
C语言源程序
#include
#definers(1<<8)
#definerw(1<<9)
#defineen(1<<10)
#definebusy(1<<7)//P0.7
typedefunsignedcharuint8;
uint8ledDown[]={"TheLEDisdown!
"};
uint8ledUp[]={"TheLEDisup!
"};
voidwaitLCD()/*等待LCD*/
{
IO0DIR=0xf00;
while
(1)
{
IO0CLR=rs;
IO0SET=rw;
IO0SET=en;
if(!
(IO0PIN&busy))break;
IO0CLR=en;
}
IO0DIR=0xfff;
}
voidlcdOp(uint8dat)/*送LCD控制码*/
{
waitLCD();
IO0CLR=rs;
IO0CLR=rw;
IO0CLR=0xff;
IO0SET=dat;
IO0SET=en;
IO0CLR=en;
}
voidlcdData(uint8dat)/*送LCD显示数据*/
{
waitLCD();
IO0SET=rs;
IO0CLR=rw;
IO0CLR=0xff;
IO0SET=dat;
IO0SET=en;
IO0CLR=en;
}
voidlcdInit(void)/*初始化LCD,DataSheet里有建议的初始化代码*/
{
/*LCD配置为两行,5*7字体*/
lcdOp(0x38);
lcdOp(0x38);
lcdOp(0x06);
lcdOp(0x0E);
lcdOp(0x01);
/*LCD配置为一行,5*10字体
lcdOp(0x34);
lcdOp(0x34);
lcdOp(0x06);
lcdOp(0x0E);
lcdOp(0x01);
*/
}
voidlcdDisplay(uint8addr,uint8*p)/*LCD显示字符串*/
{
lcdOp(addr);
while(*p!
='\0'){
lcdData(*(p++));
}
}
voidlcdClear(void)/*LCD清屏*/
{
lcdOp(0x01);
}
voiddelay(void){
unsignedvolatilelongi,j;
for(i=0;i<60000;i++)
for(j=0;j<10;j++)
;
}
intmain(void)
{
lcdInit();/*初始化LCD显示*/
IO0DIR=0xfff;//设置为输出口
IO0CLR=0xfff;
while
(1){
IO0CLR=0x000800;
lcdDisplay(0x80,ledUp);
delay();
lcdClear();
IO0SET=0x000800;
lcdDisplay(0x80,ledDown);
delay();
lcdClear();
}
}
UART——ARM的Proteus实验
实验原理
ARM的P0.0口接LED,串口接Proteus的虚拟终端。
每隔一段时间改变一次LED的状态,并且在串口上输出LED的当前状态。
Proteus仿真电路图
C语言源程序
#include
#include"uart.h"
#defineCR0x0D
charledDown[]={"TheLEDisdown!
\n"};
charledUp[]={"TheLEDisup!
\n"};
intputchar(intch){/*向串口输出一个字符*/
if(ch=='\n'){
while(!
(U1LSR&0x20));
U1THR=CR;a
}
while(!
(U1LSR&0x20));
return(U1THR=ch);
}
voiddelay(void){
unsignedvolatilelongi,j;
for(i=0;i<60000;i++)
for(j=0;j<5;j++)
;
}
voidserialPuts(char*p){/*向串口输出字符串*/
while(*p!
='\0'){
putchar(*p++);
}
}
intmain(void){
/*开始初始化串口*/
PINSEL0=0x00050000;/*设置引脚,开串口功能*/
U1LCR=0x83;/*8位数据,无效验,一个停止位*/
U1DLL=97;/*VPB15MHz的时候波特率为9600*/
U1LCR=0x03;/*DLAB=0*/
/*结束初始化串口*/
IO0DIR=0x000001;/*将P0.0设置为输出*/
while
(1){
IO0CLR=0x000001;
serialPuts(ledUp);
delay();
IO0SET=0x000001;
serialPuts(ledDown);
delay();
}
}
Eint1外部中断——ARM的Proteus实验
实验原理
ARM的P0.25接一个LED,引脚设置时连接EINT1功能,按钮触发中断。
中断服务程序另LED快速闪烁。
Proteus仿真电路图
C语言源程序
#include
#defineLEDCON0x02000000/*LED接在P0.25上*/
typedefunsignedintuint32;
voidIRQ_Eint1(void)__attribute__((interrupt));/*声明某函数为中断服务子程序的方法*/
uint32times=100;/*循环次数默认为100*/
voidIRQ_Eint1(void){
times=5;
while((EXTINT&0x02)!
=0){
EXTINT=0x02;//清除EINT1中断标志
}
VICVectAddr=0;
}
voiddelay100(void){
unsignedvolatilelongi,j;
for(i=0;i<10000;i++)
for(j=0;j ; if(times>100){ times--; }elseif(times<100){ times++; } } intmain(void) { IO0DIR=LEDCON; PINSEL0=0x20000000;/*引脚选中EINT1功能*/ PINSEL1=0x00000000; /*以下为中断控制部分*/ VICIntSelect=0;/*全部中断设置为IRQ,若某位为1是FIQ*/ VICIntEnable=0x00008000;/*使能EINT1,EINT为第15位*/ VICVectCntl1=0x2F;/*0xF,15号中断*/ VICVectAddr1=(int)IRQ_Eint1;/*设置中断服务子程序*/ EXTINT=0x07; while (1){ IO0CLR=LEDCON; delay100(); IO0SET=LEDCON; delay100(); } } 多个外部中断——ARM的Proteus实验 实验原理 ARM开启两个中断源Eint1与Eint2,分别用一个按钮来控制。 在没有中断的时候两个LED都缓慢闪烁,当任何一个中断被出发的时候,对应的LED会急促闪烁,逐渐回复正常。 Proteus仿真电路图 C语言源程序 #include #defineLED10x02000000/*LED1接在P0.25上*/ #defineLED00x01000000/*LED0接在P0.24上*/ typedefunsignedintuint32; voidEint1_ISR(void)__attribute__((interrupt));/*声明某函数为中断服务子程序的方法*/ voidEint0_ISR(void)__attribute__((interrupt)); uint32times=40;/*循环次数默认为40*/ voiddelay40(void){ unsignedvolatilelongi,j; for(i=0;i<10000;i++) for(j=0;j ; if(times>40){ times-=2; }elseif(times<40){ times+=2; } } voidEint0_ISR(void){ times=0; while(times! =40){ IO0CLR=LED0; delay40(); IO0SET=LED0; delay40(); } while((EXTINT&0x01)! =0){ EXTINT=0x01;/*清除EINT0中断标志*/ } VICVectAddr=0x00; } voidEint1_ISR(void){ times=0; while(times! =40){ IO0CLR=LED1; delay40(); IO0SET=LED1; delay40(); } while((EXTINT&0x02)! =0){ EXTINT=0x02;/*清除EINT1中断标志*/ } VICVectAddr=0; } intmain(void) { IO0DIR=LED1|LED0; PINSEL0=0x20000000;/*引脚选中EINT1功能*/ PINSEL1=0x00000001;/*引脚选中EINT0功能*/ /*以下为中断控制部分*/ VICIntSelect=0;/*全部中断设置为IRQ,若某位为1是FIQ*/ VICIntEnable=0x0000C000;/*使能EINT1、0,EINT1为第15位,0为14位*/ VICVectCntl0=0x2E;/*EINT0最高优先级*/ VICVectAddr0=(int)Eint0_ISR;/*设置EINT0向量地址*/ VICVectCntl1=0x2F;/*0xF,15号中断*/ VICVectAddr1=(int)Eint1_ISR;/*设置中断服务子程序*/ EXTINT=0x07; while (1){/*无中断时,两灯一起缓慢闪烁*/ IO0CLR=LED1|LED0; delay40(); IO0SET=LED1|LED0; delay40(); } } 中断结合串口——ARM的Proteus实验 实验原理 同上多中断源实验相同,ARM开启两个中断源Eint1与Eint2,分别用一个按钮来控制。 在没有中断的时候两个LED都缓慢闪烁,当任何一个中断被出发的时候,对应的LED会急促闪烁,逐渐回复正常。 此外,使用一个串口来发送当前状态,在无中断的时候发送正常状态报告,当有中断的时候,串口发送中断源。 Proteus仿真电路图 C语言源程序 文件一: main.c #include #include"uart0.h" #defineLED10x02000000/*LED1接在P0.25上*/ #defineLED00x01000000/*LED0接在P0.24上*/ typedefunsignedintuint32; voidEint1_ISR(void)__attribute__((interrupt));/*声明某函数为中断服务子程序的方法*/ voidEint0_ISR(void)__attribute__((interrupt)); uint32times=40;/*循环次数默认为40*/ charstatus[]="Everytnigisfine."; chareint0Str[]="InterruptionEINT0activated! ! ! "; chareint1Str[]="InterruptionEINT1activated! ! ! "; voiddelay40(void){ unsignedvolatilelongi,j; for(i=0;i<10000;i++) for(j=0;j ; if(times>40){ times-=2; }elseif(times<40){ times+=2; } } voidEint0_ISR(void){ times=0; while(times! =40){ IO0CLR=LED0; delay40(); IO0SET=LED0; delay40(); serialPuts(eint0Str); } while((EXTINT&0x01)! =0){ EXTINT=0x01;/*清除EINT0中断标志*/ } VICVectAddr=0x00; } voidEint1_ISR(void){ times=0; while(times! =40){ IO0CLR=LED1; delay40(); IO0SET=LED1; delay40(); serialPuts(eint1Str); } while((EXTINT&0x02)! =0){ EXTINT=0x02;/*清除EINT1中断标志*/ } VICVectAddr=0; } intmain(void) { IO0DIR=LED1|LED0; PINSEL0=0x20000005;/*引脚选中EINT1功能,开串口UART0*/ PINSEL1=0x00000001;/*引脚选中EINT0功能*/ /*以下为中断控制部分*/ VICIntSelect=0;/*全部中断设置为IRQ,若某位为1是FIQ*/ VICIntEnable=0x0000C000;/*使能EINT1、0,EINT1为第15位,0为14位*/ VICVectCntl0=0x2E;/*EINT0最高优先级*/ VICVectAddr0=(int)Eint0_ISR;/*设置EINT0向量地址*/ VICVectCntl1=0x2F;/*0xF,15号中断*/ VICVectAddr1=(int)Eint1_ISR;/*设置中断服务子程序*/ EXTINT=0x07; uart0Init(); while (1){/*无中断时,两灯一起缓慢闪烁*/ IO0CLR=LED1|LED0; delay40(); IO0SET=LED1|LED0; delay40(); serialPuts(status); } } 文件二: uart0.c #include #include"uart0.h" #defineCR0x0D intputchar(intch){/*向串口输出一个字符*/ if(ch=='\n'){ while(! (U0LSR&0x20)); U0THR=CR; } while(! (U0LSR&0x20)); return(U0THR=ch); } voidserialPuts(char*p){/*向串口输出字符串*/ while(*p! ='\0'){ putchar(*p++); } putchar('\n'); } voiduart0Init(void){ U0LCR=0x83;/*8位数据,无效验,一个停止位*/ U0DLL=97;/*VPB15MHz的时候波特率为9600*/ U0LCR=0x03;/*DLAB=0*/ } 定时器——ARM的Proteus实验 实验原理 ARM的定时器实验,定时改变LED的状态。 Proteus仿真电路图 C语言源程序 #include #defineLED0x000001 typedefunsignedintuint32; typedefunsignedcharuint8; voidtimer0_ISR(void)__attribute__((interrupt)); uint8timer0T
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- ARM7 基础 实验 原理图