標題: LPC2000系列Proteus仿真+代碼 菜鳥的ARM學習筆記 [打印本頁]
作者: zhang779065972 時間: 2018-11-15 17:50
標題: LPC2000系列Proteus仿真+代碼 菜鳥的ARM學習筆記
lpc2000系列proteus仿真+代碼,新手自取
菜鳥的ARM學習筆記
下面就是我學習ARM的第一階段的記錄,這段時間的學習基本上是使用Proteus配合KEIL做簡單的實驗(最后有實驗的目錄以及下載地址)。通過該階段的學習,算是對ARM的基本結(jié)構(gòu)有了了解。
該階段主要學習資料是《基于PROTEUS的ARM虛擬開發(fā)技術(shù)》,以及另外一本ARM體系結(jié)構(gòu)的書籍,感覺這類書都差不多。
學習ARM前需要的基礎
- 前輩學習ARM的經(jīng)驗! (我是在嵌入式開發(fā)聯(lián)盟的新人區(qū)看的帖子。)
- 掌握C語言編程。
- 了解簡單的微機算計原理知識,例如二進制,計算機程序的執(zhí)行過程,總線(數(shù)據(jù)、地址、控制),軟件系統(tǒng)(系統(tǒng)軟件與應用軟件)。
- 聽說過RISC與CISC,高級語言與低級語言的區(qū)別。
- 最好聽說過串行傳輸與并行傳輸。
- 普林斯頓(ARM7)和哈佛結(jié)構(gòu)(ARM9、10、11—)。
什么是ARM?
學ARM,自然要理解ARM是什么,也好明確學習目標。網(wǎng)上的資料很多,“ARM是一家公司,也是一個處理器體系”……我將學ARM分為以下幾類:
- 做ARM的核心研發(fā)。也就是進ARM公司做IP核,應該是學電子之類的東西吧。
- 買ARM的IP核,做具體的嵌入式處理器、核心板,例如三星和NXP。
- 買ARM核心板,連接外圍電路制作教育用或開發(fā)用的開發(fā)板,或者直接開發(fā)其它中斷產(chǎn)品。
- 買ARM開發(fā)板做產(chǎn)品,要做系統(tǒng)軟件和應用軟件。
3和4基本并列了。
ARM基礎
任何一本介紹ARM體系結(jié)構(gòu)書籍都應該有這些內(nèi)容。
處理器模式
用戶模式、特權(quán)模式又分為系統(tǒng)模式、管理模式、快中斷模式、中斷模式、終止模式、未定義指令終止模式。
2. 寄存器
R0-R7、R15和CPSR是所有模式共享的。
R8-R12出快中斷模式有RX-fiq外所有模式共享。
R13、R14和SPSR只有用戶模式和系統(tǒng)模式共享,其它都有似有SPSR。
R15(PC)程序計數(shù)器
R16(CPSR)程序轉(zhuǎn)臺寄存器
R13(SP)堆棧指針
P14(LR)鏈接寄存器
ARM指令集 匯編程序設計
略了,我看了,但是做Proteus仿真實驗沒用上,兩天就忘了。
LPC2000
我買的3本ARM入門書籍中有兩本都是以LPC2000系列為例的,其實從網(wǎng)上可以下載到具體LPC2XXX處理器的datasheet,上面的資料是最權(quán)威和詳盡的。
引腳選擇
PINSEL0、PINSEL1設置各個引腳的功能。
中斷
中斷的寄存器太多了,沒記。
GPIO
做輸入輸出。以P0口為例,寄存器有IO0PIN、IO0SET、IO0DIR、IO0CLR。
存儲器
- LPC2000可用地址為4GB,內(nèi)部2GB(0~0x7FFFFFFF),外部2GB(0x80000000~0xDFFFFFFF),高0.5GB是I/O設備地址空間(0xE0000000~0xFFFFFFFF)。
- 內(nèi)部最低128KB或256KB為Flash。
- 高1GB(0x40000000~0x7FFFFFFF)為SRAM。其中0x40000000~0x40001FFF為片內(nèi)SRAM。
- I/O部分,低2MB(0xE0000000~0xE001FFFFF)為VPB外設空間,高2MB(0xFFE00000~0xFFFFFFFF)為AHB外設空間。
- FLASH加速模塊。
MAMCR設置是否允許加速、MAMTIM設置預取處理器時鐘。
時鐘
cclk、pclk
分振蕩器模式和從屬模式,振蕩器Fosc經(jīng)PLL升頻為cclk,cclk經(jīng)過VPB分頻后為pclk。
設置cclk
PLLCFG 設置PLL倍頻M,PLL分頻器值P
PLLCON PLL的允許與連接
PLLSTAT 讀取PLL狀態(tài)
PLLFEED 使PLL設置生效
例Fosc=12MHz,cclk=60MHz,則M=60/12-1=4,因為Fcco=P*cclk*2(要求156M~320MHz)。
設置pclk
由VPBDIV設置00為4分頻、01為不分頻、10為二分頻。
定時器
pclk定時,定時器為32位,從0計數(shù)到0xFFFFFFFF。以T0為例
T0TC,計數(shù)器初值
T0PR,定時計數(shù)器分頻,pclk/(PR+1)
T0MR0~3,匹配值,當計數(shù)帶到時候,按照T0MCR的設置觸發(fā)不同動作。
T0MCR,計數(shù)器到達匹配值的動作(復位、中斷、停止)
T0EMR,外部匹配寄存器,到達匹配值時候外部引腳的操作(MAT0.0~3)
T0CCR,外部引腳有特定動作時候,計數(shù)值存入T0CR0~3,設置是否觸發(fā)中斷
T0CR0~3,在T0CCR控制下存TC值。
T0TCR,復位與使能
T0IR,對應MR與CR中斷
PWM
看門狗
Pclk四分頻后控看門狗的32為計數(shù)器減一。
WDTC,看門狗計數(shù)器初值。
WDMOD,看門狗工作模式,可以開啟和復位看門狗。
WDFEED,喂狗寄存器。
WDTV,看門狗計數(shù)器當前值。
UART
引腳RxD0,TxD0
U0RBR,暫存接受數(shù)據(jù)。
U0THR,暫存發(fā)送數(shù)據(jù)。訪問它時,U0LCR的DLAB位為0。
U0IER,串口個狀態(tài)的中斷允許。
U0IIR,中斷標志。
U0FCR,控制UART的FIFO(暫時沒明白)。
U0LCR,傳輸模式。
U0LSR,當前狀態(tài)(錯誤指示)。
U0DLL、U0DLM,pclk/( U0DLL U0DLM),訪問時UOLCR的DLAB位為1。
SPI
全雙工同步串行接口
引腳:
SCK0,串行時鐘。
SSEL0,從機選擇。
MISO,主機輸入,從機輸出。
MOSI,主機輸出,從機輸入。
寄存器:
S0SPCR,SPI控制。
S0SPSR,SPI狀態(tài)。
S0SPDR,SPI數(shù)據(jù)。
S0SPCCR,控制SCK的頻率。必須為偶數(shù)且大于等于8。(指示一個SCK周期中的pclk周期)
S0SPINT,SPI中斷。
I2C
引腳:SDA,SCL
寄存器:
I2CONSET
I2CONCLR
I2CON
上面三個寄存器控制應答標志位,中斷標志、停止和起始以及I2C使能。
I2STAT,I2C狀態(tài)。
I2DAT,I2C數(shù)據(jù)。
I2ADR,I2C從模式地址。
I2STAT,I2C狀態(tài)。
I2SCLH,高電平占空比占pclk周期個數(shù)。
I2SCLL,低電平占空比占pclk周期個數(shù)。
分頻fpclk/( I2SCLH+I2SCLL)。
AD轉(zhuǎn)換
引腳:AIN0~3
寄存器:
ADCR,工作模式選擇。
ADDR,轉(zhuǎn)換數(shù)據(jù)以及標志的暫存。
基于Proteus的ARM實驗目錄
菜鳥的ARM學習筆記(第一階段)
- LED閃爍——ARM的Proteus實驗
- 開關(guān)控制LED——ARM的Proteus實驗
- LCD——ARM的Proteus實驗
- UART——ARM的Proteus實驗
- Eint1外部中斷——ARM的Proteus實驗
- 多個外部中斷——ARM的Proteus實驗
- 中斷結(jié)合串口——ARM的Proteus實驗
- 定時器——ARM的Proteus實驗
- SPI通信——ARM的Proteus實驗
- SPI通信(多從設備)——ARM的Proteus實驗
- ADC數(shù)模轉(zhuǎn)換——ARM的Proteus實驗
1、LED閃爍——ARM的Proteus實驗
實驗原理
ARM(LPC21XX)的一個I/O口接LED,通過給它送0和1來設置LED的亮和滅。
Proteus仿真電路圖
步驟
KEIL
- 創(chuàng)建新工程
- 選擇ARM型號(KEIL會自動生成啟動代碼startup.s)
- 添加源文件,編寫程序
- 設置項目選項(是否輸出hex、lst文件,設置linker script)
Proteus
C語言源程序
/******************************************************************************/
/* */
/* led.c: 用ARM點亮一個led并閃爍,有點浪費…… */
/* */
/******************************************************************************/
#include <LPC21xx.H>
/*******************************************************************************
**函數(shù)名: delay()
**描述: 軟件延時
********************************************************************************/
void delay (void) {
unsigned volatile long i,j;
for(i=0;i<60000;i++)
for(j=0;j<5;j++)
;
}
int main(void) {
PINSEL0 = 0; /*設置引腳為GPIO */
IO0DIR = 0x000001; /*將P0.0設置為輸出 */
IO0SET = 0x000001; /*將P0.0置1,也就是讓led滅 */
while (1) {
IO0CLR = 0x000001;
delay();
IO0SET = 0x000001;
delay();
}
}
2、開關(guān)控制LED——ARM的Proteus實驗
實驗原理
ARM的P0.1口接按鈕,再通過P0.0控制LED的亮、滅。本實驗的電路圖以及實驗均在上一個實驗基礎之上修改。其中電路圖只多了一個開關(guān)。
Proteus仿真電路圖
實驗步驟略(與上一實驗相同)
C語言源程序
/******************************************************************************/
/* */
/* led.c: 用ARM實現(xiàn)開關(guān)控制led并亮滅,還是有點浪費…… */
/* */
/******************************************************************************/
#include <LPC21xx.H>
#define P0_1 0x02; /*P0.1*/
/*******************************************************************************
**函數(shù)名: delay()
**描述: 軟件延時
********************************************************************************/
void delay (void) {
unsigned volatile long i;
for(i=0;i<10000;i++)
;
}
int main(void) {
int p01State;
PINSEL0 = 0; /*設置引腳為GPIO */
IO0DIR = 0x000001; /*將P0.0設置為輸出 */
IO0SET = 0x000001; /*將P0.0置1,也就是讓led滅 */
while (1) {
p01State = IO0PIN&P0_1; /*讀取開關(guān)狀態(tài)*/
if(p01State == 0){
IO0CLR = 0x000001;
delay();
}
else{
IO0SET = 0x000001;
delay();
}
}
}
3、LCD——ARM的Proteus實驗
實驗原理
ARM的P0.0口到P0.10口接LCD,P0.11接LED。每過一段時間LED狀態(tài)改變,LCD顯示LED的狀態(tài)。
Proteus仿真電路圖
C語言源程序
#include <LPC21XX.H>
#define rs (1<<8)
#define rw (1<<9)
#define en (1<<10)
#define busy (1<<7) //P0.7
typedef unsigned char uint8;
uint8 ledDown[]={"The LED is down!"};
uint8 ledUp[]={"The LED is up!"};
void waitLCD() /*等待LCD*/
{
IO0DIR=0xf00;
while(1)
{
IO0CLR=rs;
IO0SET=rw;
IO0SET=en;
if(!(IO0PIN & busy))break;
IO0CLR = en;
}
IO0DIR=0xfff;
}
void lcdOp(uint8 dat)/*送LCD控制碼*/
{
waitLCD();
IO0CLR=rs;
IO0CLR=rw;
IO0CLR=0xff;
IO0SET=dat;
IO0SET=en;
IO0CLR=en;
}
void lcdData(uint8 dat)/*送LCD顯示數(shù)據(jù)*/
{
waitLCD();
IO0SET=rs;
IO0CLR=rw;
IO0CLR=0xff;
IO0SET=dat;
IO0SET=en;
IO0CLR=en;
}
void lcdInit(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);
*/
}
void lcdDisplay(uint8 addr,uint8 *p)/*LCD顯示字符串*/
{
lcdOp(addr);
while(*p !='\0'){
lcdData(*(p++));
}
}
void lcdClear(void)/*LCD清屏*/
{
lcdOp(0x01);
}
void delay (void) {
unsigned volatile long i,j;
for(i=0;i<60000;i++)
for(j=0;j<10;j++)
;
}
int main(void)
{
lcdInit();/*初始化LCD顯示*/
IO0DIR=0xfff;//設置為輸出口
IO0CLR=0xfff;
while (1) {
IO0CLR = 0x000800;
lcdDisplay(0x80,ledUp);
delay();
lcdClear();
IO0SET = 0x000800;
lcdDisplay(0x80,ledDown);
delay();
lcdClear();
}
}
4、UART——ARM的Proteus實驗
實驗原理
ARM的P0.0口接LED,串口接Proteus的虛擬終端。每隔一段時間改變一次LED的狀態(tài),并且在串口上輸出LED的當前狀態(tài)。
Proteus仿真電路圖
C語言源程序
#include <LPC21xx.H>
#include "uart.h"
#define CR 0x0D
char ledDown[]={"The LED is down!\n"};
char ledUp[]={"The LED is up!\n"};
int putchar (int ch) {/* 向串口輸出一個字符 */
if (ch == '\n') {
while (!(U1LSR & 0x20));
U1THR = CR; a
}
while (!(U1LSR & 0x20));
return (U1THR = ch);
}
void delay (void) {
unsigned volatile long i,j;
for(i=0;i<60000;i++)
for(j=0;j<5;j++)
;
}
void serialPuts(char *p){/* 向串口輸出字符串 */
while (*p != '\0'){
putchar(*p++);
}
}
int main (void) {
/* 開始初始化串口 */
PINSEL0 = 0x00050000;/* 設置引腳,開串口功能 */
U1LCR = 0x83;/* 8位數(shù)據(jù),無效驗,一個停止位 */
U1DLL = 97;/* VPB 15MHz的時候波特率為9600 */
U1LCR = 0x03;/* DLAB = 0 */
/* 結(jié)束初始化串口 */
IO0DIR = 0x000001;/*將P0.0設置為輸出 */
while (1) {
IO0CLR = 0x000001;
serialPuts(ledUp);
delay();
IO0SET = 0x000001;
serialPuts(ledDown);
delay();
}
}
5、Eint1外部中斷——ARM的Proteus實驗
實驗原理
ARM的P0.25接一個LED,引腳設置時連接EINT1功能,按鈕觸發(fā)中斷。中斷服務程序另LED快速閃爍。
Proteus仿真電路圖
C語言源程序
#include <LPC21XX.H>
#define LEDCON 0x02000000/*LED接在P0.25上*/
typedef unsigned int uint32;
void IRQ_Eint1(void) __attribute__ ((interrupt));/*聲明某函數(shù)為中斷服務子程序的方法*/
uint32 times = 100;/*循環(huán)次數(shù)默認為100*/
void IRQ_Eint1(void){
times = 5;
while((EXTINT&0x02)!=0){
EXTINT=0x02; //清除EINT1中斷標志
}
VICVectAddr=0;
}
void delay100(void) {
unsigned volatile long i,j;
for(i=0;i<10000;i++)
for(j=0;j<times;j++)
;
if(times > 100){
times--;
}else if(times <100){
times++;
}
}
int main(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();
}
}
6、多個外部中斷——ARM的Proteus實驗
實驗原理
ARM開啟兩個中斷源Eint1與Eint2,分別用一個按鈕來控制。在沒有中斷的時候兩個LED都緩慢閃爍,當任何一個中斷被出發(fā)的時候,對應的LED會急促閃爍,逐漸回復正常。
Proteus仿真電路圖
C語言源程序
#include <LPC21XX.H>
#define LED1 0x02000000/*LED1接在P0.25上*/
#define LED0 0x01000000/*LED0接在P0.24上*/
typedef unsigned int uint32;
void Eint1_ISR(void) __attribute__ ((interrupt));/*聲明某函數(shù)為中斷服務子程序的方法*/
void Eint0_ISR(void) __attribute__ ((interrupt));
uint32 times = 40;/*循環(huán)次數(shù)默認為40*/
void delay40(void) {
unsigned volatile long i,j;
for(i=0;i<10000;i++)
for(j=0;j<times;j++)
;
if(times > 40){
times-=2;
}else if(times <40){
times+=2;
}
}
void Eint0_ISR(void){
times = 0;
while(times!=40){
IO0CLR = LED0;
delay40();
IO0SET = LED0;
delay40();
}
while((EXTINT&0x01)!=0){
EXTINT=0x01;/*清除EINT0中斷標志*/
}
VICVectAddr=0x00;
}
void Eint1_ISR(void){
times = 0;
while(times!=40){
IO0CLR = LED1;
delay40();
IO0SET = LED1;
delay40();
}
while((EXTINT&0x02)!=0){
EXTINT=0x02;/*清除EINT1中斷標志*/
}
VICVectAddr=0;
}
int main(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最高優(yōu)先級*/
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();
}
}
7、中斷結(jié)合串口——ARM的Proteus實驗
實驗原理
同上多中斷源實驗相同,ARM開啟兩個中斷源Eint1與Eint2,分別用一個按鈕來控制。在沒有中斷的時候兩個LED都緩慢閃爍,當任何一個中斷被出發(fā)的時候,對應的LED會急促閃爍,逐漸回復正常。
此外,使用一個串口來發(fā)送當前狀態(tài),在無中斷的時候發(fā)送正常狀態(tài)報告,當有中斷的時候,串口發(fā)送中斷源。
Proteus仿真電路圖
C語言源程序
文件一:main.c
#include <LPC21XX.H>
#include "uart0.h"
#define LED1 0x02000000/*LED1接在P0.25上*/
#define LED0 0x01000000/*LED0接在P0.24上*/
typedef unsigned int uint32;
void Eint1_ISR(void) __attribute__ ((interrupt));/*聲明某函數(shù)為中斷服務子程序的方法*/
void Eint0_ISR(void) __attribute__ ((interrupt));
uint32 times = 40;/*循環(huán)次數(shù)默認為40*/
char status[] = "Everytnig is fine.";
char eint0Str[] = "Interruption EINT0 activated!!!";
char eint1Str[] = "Interruption EINT1 activated!!!";
void delay40(void) {
unsigned volatile long i,j;
for(i=0;i<10000;i++)
for(j=0;j<times;j++)
;
if(times > 40){
times-=2;
}else if(times <40){
times+=2;
}
}
void Eint0_ISR(void){
times = 0;
while(times!=40){
IO0CLR = LED0;
delay40();
IO0SET = LED0;
delay40();
serialPuts(eint0Str);
}
while((EXTINT&0x01)!=0){
EXTINT=0x01;/*清除EINT0中斷標志*/
}
VICVectAddr=0x00;
}
void Eint1_ISR(void){
times = 0;
while(times!=40){
IO0CLR = LED1;
delay40();
IO0SET = LED1;
delay40();
serialPuts(eint1Str);
}
while((EXTINT&0x02)!=0){
EXTINT=0x02;/*清除EINT1中斷標志*/
}
VICVectAddr=0;
}
int main(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最高優(yōu)先級*/
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 <LPC21XX.H>
#include "uart0.h"
#define CR 0x0D
int putchar (int ch) {/* 向串口輸出一個字符 */
if (ch == '\n') {
while (!(U0LSR & 0x20));
U0THR = CR;
}
while (!(U0LSR & 0x20));
return (U0THR = ch);
}
void serialPuts(char *p){/* 向串口輸出字符串 */
while (*p != '\0'){
putchar(*p++);
}
putchar('\n');
}
void uart0Init(void){
U0LCR = 0x83;/* 8位數(shù)據(jù),無效驗,一個停止位 */
U0DLL = 97;/* VPB 15MHz的時候波特率為9600 */
U0LCR = 0x03;/* DLAB = 0 */
}
8、定時器——ARM的Proteus實驗
實驗原理
ARM的定時器實驗,定時改變LED的狀態(tài)。
Proteus仿真電路圖
C語言源程序
#include <LPC21xx.H>
#define LED 0x000001
typedef unsigned int uint32;
typedef unsigned char uint8;
void timer0_ISR (void) __attribute__ ((interrupt));
uint8 timer0Times = 0;
void timer0Init (void) {
T0MR0 = 119999;/*匹配寄存器,120000-1,12000000為1秒*/
T0MCR = 3;/*產(chǎn)生中斷,重置TC*/
T0TCR = 1;/*使能定時計數(shù)器0*/
VICVectAddr0 = (unsigned long)timer0_ISR;
VICVectCntl0 = 0x20 | 4;/*定時器計數(shù)器0為4號中斷*/
VICIntEnable = 0x00000010;/*開定時計數(shù)器0中斷*/
}
void timer0_ISR (void) {
timer0Times++;
uint32 i;
if(timer0Times == 10){
i=IO0SET; //讀出當前LED2控制值
if((i&LED)==0){
IO0SET=LED;
}else{
IO0CLR=LED;
}
timer0Times = 0;
}
T0IR = 1;/*清除定時器0中斷*/
VICVectAddr = 0;
}
int main(void) {
PINSEL0 = 0;/*設置引腳為GPIO */
IO0DIR = LED;/*將P0.0設置為輸出 */
IO0SET = LED;/*將P0.0置1,也就是讓led滅 */
timer0Init();
while (1) {
}
}
9、SPI通信——ARM的Proteus實驗
實驗原理
使用SPI協(xié)議,利用ARM控制數(shù)碼顯示管顯示1到F,用串口檢驗發(fā)送的數(shù)據(jù)是否正確。
Proteus仿真電路圖
C語言源程序
下面是主程序文件,串口部分的程序代碼與“中斷結(jié)合串口”相同,所以省略。
#include <LPC21XX.H>
#include "uart0.h"
#define HC595_CS 0x00000100/*P0.8口為74HC595的片選*/
typedef unsigned int uint32;
typedef unsigned char uint8;
char status[] = "Everytnig is fine.";
uint8 const DISP_TAB[16]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,
0xF8,0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E};
uint8 rcv_data;
void delay(void) {
unsigned volatile long i,j;
for(i=0;i<10000;i++)
for(j=0;j<30;j++)
;
}
void spiInit(void){
S0SPCCR=0x52; //設置SPI時鐘分頻
S0SPCR=0x30; //設置SPI接口模式
}
uint8 spiChar(uint8 data){
IO0CLR=HC595_CS; //片選
S0SPDR=data;
while(0==(S0SPSR&0x80)); //等待SPIF置位,即等待數(shù)據(jù)發(fā)送完畢
IO0SET=HC595_CS;
return(S0SPDR);
}
int main(void){
uint8 i;
PINSEL0 = 0x00005505;/*引腳開串口SPI、UART0*/
IO0DIR=HC595_CS;
spiInit();/*初始化SPI接口*/
uart0Init();
while(1){
for (i=0;i<16;i++) {
if(i<10){putchar(i+'0');}
else{putchar(i+7+'0');}
rcv_data=spiChar(DISP_TAB[ i]);/*發(fā)送顯示數(shù)據(jù)*/
delay();
}
serialPuts(status);
}
}
[ i]
10、SPI通信(多從設備)——ARM的Proteus實驗
實驗原理
使用SPI協(xié)議,利用ARM控制數(shù)碼顯示管1顯示1到F,數(shù)碼顯示管2則從F到1倒計數(shù),數(shù)碼顯示管則一直顯示0。該連接方法使用片選來激活不同的SPI從設備(HC595)。
Proteus仿真電路圖
C語言源程序
下面是主程序文件,串口部分的程序代碼與“中斷結(jié)合串口”相同,所以省略。
#include <LPC21XX.H>
#include "uart0.h"
#define HC595_CS 0x00000100/*P0.8口為第一個74HC595的片選*/
#define HC595_CS2 0x00000200/*P0.9口為第二個74HC595的片選*/
#define HC595_CS3 0x00000400/*P0.10口為第三個74HC595的片選*/
typedef unsigned int uint32;
typedef unsigned char uint8;
char status[] = "Everytnig is fine.";
uint8 const DISP_TAB[16]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,
0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E};
uint8 rcv_data;
void delay(void) {
unsigned volatile long i,j;
for(i=0;i<10000;i++)
for(j=0;j<30;j++)
;
}
void spiInit(void){
S0SPCCR=0x52;/*設置SPI時鐘分頻*/
S0SPCR=0x30;/*設置SPI接口模式*/
}
uint8 spiChar(uint8 data){
IO0CLR=HC595_CS;/*SPI1片選*/
S0SPDR=data;
while(0==(S0SPSR&0x80));/*等待SPIF置位,即等待數(shù)據(jù)發(fā)送完畢*/
IO0SET=HC595_CS;
return(S0SPDR);
}
uint8 spi2Char(uint8 data){
IO0CLR=HC595_CS2;/*SPI2片選*/
S0SPDR=data;
while(0==(S0SPSR&0x80));
IO0SET=HC595_CS2;
return(S0SPDR);
}
uint8 spi3Char(uint8 data){
IO0CLR=HC595_CS3;/*SPI3片選*/
S0SPDR=data;
while(0==(S0SPSR&0x80));
IO0SET=HC595_CS3;
return(S0SPDR);
}
int main(void){
uint8 i;
PINSEL0 = 0x00005505;/*引腳開SPI、UART0*/
IO0DIR=HC595_CS|HC595_CS2|HC595_CS3;
spiInit();/*初始化SPI接口*/
uart0Init();
while(1){
for (i=0;i<16;i++) {
if(i<10){putchar(i+'0');}
else{putchar(i+7+'0');}
rcv_data=spiChar(DISP_TAB[ i]);/*發(fā)送顯示數(shù)據(jù)到數(shù)碼顯示管1*/
rcv_data=spi2Char(DISP_TAB[15-i]);/*數(shù)碼顯示管2*/
rcv_data=spi3Char(DISP_TAB[0]);/*數(shù)碼顯示管2*/
delay();
}
serialPuts(status);
}
}
[ i]
11、ADC數(shù)模轉(zhuǎn)換——ARM的Proteus實驗
實驗原理
使用ARM微處理器內(nèi)置的AD轉(zhuǎn)換,將電壓值轉(zhuǎn)換為數(shù)字量后直接輸出到串口UART0。
Proteus仿真電路圖
C語言源程序
main.c
#include <LPC21XX.H>
#include "uart0.h"
typedef unsigned int uint32;
void delay(void) {
unsigned volatile long i,j;
for(i=0;i<10000;i++)
for(j=0;j<50;j++)
;
}
void adcRead (void) {
unsigned int val;
ADCR |= 0x01000000;/* 開始AD轉(zhuǎn)換 */
do {
val = ADDR;/* 讀取AD轉(zhuǎn)換數(shù)據(jù)寄存器 */
} while ((val & 0x80000000) == 0);/* 等待AD轉(zhuǎn)換結(jié)束 */
ADCR &= ~0x01000000;/* 結(jié)束AD轉(zhuǎn)換 */
val = (val >> 6) & 0x03FF;/* 設置數(shù)據(jù)格式并且按照16進制輸出 */
putstr ("\nAIN0 Result = 0x");
puthex((val >> 8) & 0x0F);
puthex((val >> 4) & 0x0F);
puthex (val & 0x0F);
}
int main(void)
{
ADCR = 0x002E0401;/* Setup A/D: 10-bit AIN0 @ 3MHz */
PINSEL0 = 0x20000005;/*引腳選中EINT1功能,開串口UART0*/
PINSEL1 = 0x00000001;/*引腳選中EINT0功能*/
uart0Init();
while (1) {
adcRead();
delay();
}
}
uart0.c
#include <LPC21XX.H>
#include "uart0.h"
#define CR 0x0D
int putchar (int ch) {/* 向串口輸出一個字符 */
if (ch == '\n') {
while (!(U0LSR & 0x20));
U0THR = CR;
}
while (!(U0LSR & 0x20));
return (U0THR = ch);
}
void serialPuts(char *p){/* 向串口輸出字符串 */
while (*p != '\0'){
putchar(*p++);
}
putchar('\n');
}
void uart0Init(void){
U0LCR = 0x83;/* 8位數(shù)據(jù),無效驗,一個停止位 */
U0DLL = 97;/* VPB 15MHz的時候波特率為9600 */
U0LCR = 0x03;/* DLAB = 0 */
}
void puthex (int hex) {/* Write Hex Digit to Serial Port */
if (hex > 9) putchar('A' + (hex - 10));
else putchar('0' + hex);
}
void putstr (char *p) {/* Write string */
while (*p) {
putchar(*p++);
}
}
完整的Word格式文檔51黑下載地址:
菜鳥的ARM學習筆記proteus仿真.zip
(183.92 KB, 下載次數(shù): 118)
2018-11-15 17:50 上傳
點擊文件名下載附件
ARM筆記
下載積分: 黑幣 -5
作者: dhbhj 時間: 2019-9-25 23:33
兄弟,你這個第三個我按照你的程序?qū)懀瑸樯秾懗鰜頍o法輸出,而且只會亮屏
作者: dhbhj 時間: 2019-9-26 09:36
而且會報錯“[HD44780] Controller received data whilst busy. [LCD1]
”
作者: mrli0104 時間: 2023-5-13 21:59
樓主你好,請問代碼中的uart0.h文件哪里可以獲得?
作者: xm20000107 時間: 2023-5-15 00:00
SPI通信里的uart0.h文件是自己寫的嗎?
作者: ccccc155151 時間: 2024-5-30 08:54
我這第三個LCD顯示有誤
| 歡迎光臨 (http://m.izizhuan.cn/bbs/) |
Powered by Discuz! X3.1 |
国产精品久久网|
亚洲精品乱码久久久久久蜜桃欧美|
一区二区欧美久久|
一区二区三区免费网站|
久久综合影视|
jvid一区二区三区|
国产伦精品一区二区三区免费迷|
警花观音坐莲激情销魂小说|
精品免费国产一区二区三区四区|
国产喂奶挤奶一区二区三区|
999亚洲国产精|
97se亚洲国产一区二区三区|
麻豆传媒在线免费看|
成人亚洲国产|
99精品免费观看|
熟女少妇a性色生活片毛片|
免费在线观看的毛片|
久久另类ts人妖一区二区|
一区二区三区美女|
精品国偷自产在线|
国产精品二区不卡|
亚洲成人短视频|
午夜成人影视|
看**视频a级毛片|
亚州av在线播放|
久久久蜜桃一区二区|
中文字幕免费高清|
天堂中文在线资|
狠狠干成人综合网|
日漫免费在线观看网站|
日本午夜精品一区二区三区|
日本黄色小视频在线观看|
欧美精品成人在线|
日韩电影视频免费|
欧美久久一区二区|
精品成人av一区|
国产精品美女久久久久久久久久久|
久久成人羞羞网站|
一本色道久久综合亚洲精品不|
欧美日韩国产免费观看视频|
国产精品一区二区三区www|
av女在线播放|
免费网站看v片在线a|
羞羞视频在线观看|
久久久99免费|
亚洲激情欧美色图|
中文字幕第315页|
欧美三日本三级少妇99|
日韩欧美视频免费观看|
日本黄色动态图|
杨幂一区二区国产精品|
无需播放器的av|
粉嫩虎白女毛片人体|
少妇人妻在线视频|
av免费看网址|
日韩国产欧美亚洲|
www国产精品内射老熟女|
日韩中文字幕在线不卡|
亚洲欧洲久久|
亚洲高清视频一区|
亚洲欧美久久久久一区二区三区|
日本一区不卡|
一区二区三区欧美在线|
亚洲精品久久久久久一区二区|
日韩国产精品一区二区|
欧美日本国产精品|
日韩欧美精品在线不卡
|
神马亚洲视频|
午夜影院在线观看视频|
中文字幕免费在线|
欧美日韩视频精品二区|
国产精品影院在线|
中文日本在线观看|
怡红院av在线|
多野结衣av一区|
91精品韩国|
小说区图片区亚洲|
白嫩白嫩国产精品|
九九亚洲精品|
在线中文一区|
久久av一区二区三区|
日韩avvvv在线播放|
精品一区二区三区久久久|
粉嫩av一区二区三区在线播放|
不卡av免费在线观看|
久久久国产午夜精品|
亚洲女人小视频在线观看|
午夜精品久久久久久久99水蜜桃|
日本韩国欧美国产|
日韩久久久久久|
国产一区二区三区日韩欧美|
欧美xxxx综合视频|
日产日韩在线亚洲欧美|
91九色偷拍|
欧美久久高跟鞋激|
欧美一区二区三区免费观看视频
|
xxxx影院|
国产在线一二|
欧美午夜大胆人体|
岛国一区二区|
欧洲专线二区三区|
在线播放一区|
国产激情偷乱视频一区二区三区|
国产亚洲女人久久久久毛片|
亚洲三级在线免费观看|
欧美在线视频全部完|
亚洲精品国产成人|
色综合五月天导航|
成人在线播放av|
视频一区二区综合|
激情六月丁香婷婷|
国产二级一片内射视频播放
|
国产在线观看福利|
久久久久无码国产精品一区李宗瑞|
99久久久无码国产精品衣服|
日韩女同强女同hd|
理论片中文字幕|
免费在线观看的黄色网址|
天天夜夜亚洲|
人成在线免费网站|
一区二区三区视频免费观看|
性xx色xx综合久久久xx|
久久久久久久久免费|
欧美优质美女网站|
久久电影一区二区|
国产厕所精品在线观看|
欧美精品久久久久久久自慰|
亚洲第一黄色网址|
中文字幕一区二区三区四区视频|
欧美日韩不卡中文字幕在线|
eeuss在线观看|
在线人成日本视频|
av伊人久久|
国产iv一区二区三区|
精品久久久久久国产91|
亚洲欧洲第一视频|
国产欧美va欧美va香蕉在线|
男女激烈动态图|
jizz日本免费|
国产亚洲婷婷免费|
久久精品国产露脸对白|
只有精品亚洲|
亚洲一区二区三区在线免费观看|
天堂中文字幕——hd|
日韩一区二区精品在线观看|
av在线不卡观看免费观看|
欧美日韩国产精品专区
|
精品久久精品久久|
自拍偷拍21p|
久久精品这里有|
久久综合图区亚洲综合图区|
亚洲一区在线日韩在线深爱|
97欧美成人|
野花国产精品入口|
一区二区高清视频在线观看|
亚洲人成五月天|
国产98在线|日韩|
婷婷综合久久|
99久久99热这里只有精品|
粉嫩av一区二区三区在线播放
|
国产精品入口麻豆免费观看|
97最新国自产拍视频在线完整在线看|
国内精品视频|
蜜桃视频一区二区三区|
天天色综合成人网|
欧美裸身视频免费观看|
日韩国产精品一区二区|
91精品人妻一区二区|
高清毛片aaaaaaaaa片|
在线色视频网|
麻豆一区一区三区四区|
色帝国亚洲欧美在线|
欧美日日夜夜|
eeuss影院一区二区三区|
日韩精品专区在线影院重磅|
91沈先生在线观看|
特种兵之深入敌后|
老司机午夜福利视频|
成人一区二区不卡免费|
成人嘿咻视频免费看|
成人激情小说网站|
蜜臀99久久精品久久久久小说|
www亚洲精品|
国产伦精品一区二区三区在线|
性欧美在线视频|
91麻豆成人精品国产|
色琪琪丁香婷婷综合久久|
日韩成人在线电影|
精品综合久久久久久8888|
91精品中文字幕一区二区三区|
91精品久久久久久久久久另类|
国产成人在线综合|
亚洲精品一区二区口爆|
黄色美女网站在线观看|
日本久久黄色|
亚洲一区二区3|
国产成人一区三区|
亚洲一级片免费观看|
熟妇人妻av无码一区二区三区|
麻豆影院在线|
亚洲永久免费精品|
91麻豆精品国产|
欧美一区激情视频在线观看|
国产3级在线观看|
免费白白视频|
亚洲综合影院|
国产精品亲子乱子伦xxxx裸|
久久久久久久国产|
亚洲一级片网站|
欧日韩在线视频|
五月婷婷视频在线观看|
久久午夜电影|
亚洲成人在线网|
自拍偷拍亚洲色图欧美|
欧美啪啪小视频|
青青草免费在线视频|
牛牛国产精品|
欧美精品三级日韩久久|
日本精品视频一区|
国内免费精品视频|
欧美高清电影在线|
亚洲影视在线|
亚洲精品自拍第一页|
少妇一晚三次一区二区三区|
国产精品51麻豆cm传媒|
亚洲xxxxxx|
麻豆传媒一区二区三区|
国产一区二区三区精品久久久
|
九九久久精品这里久久网|
日韩精品免费电影|
日韩国产综合|
99久久国产综合精品女不卡|
www.日韩av.com|
午夜免费精品视频|
亚洲综合天堂网|
日韩电影免费观看高清完整版|
国产精品一二三四区|
久久亚洲影音av资源网|
www.国产视频.com|
韩日三级av|
国产日韩三级|
欧美视频不卡中文|
欧美不卡在线一区二区三区|
日韩在线视频免费播放|
香蕉视频在线播放|
国产精品一区二区久久精品爱涩|
在线观看中文字幕|
在线观看成人av电影|
免费日韩视频|
亚洲国产成人一区二区
|
国产精彩视频在线观看|
最新中文字幕在线观看|
欧美三级网页|
日韩精品福利在线|
欧在线一二三四区|
久久久久久久久久久久久91|
亚洲精品进入|
91精品国产91热久久久做人人|
亚洲高潮无码久久|
亚洲男人天堂2020|
777视频在线|
最近2019中文字幕第三页视频
|
精品国产sm最大网站|
欧美成人精品免费|
中文字字幕一区二区三区四区五区|
亚洲欧美日本国产|
欧美日韩一区二区在线
|
日本电影中文字幕|
福利在线一区|
欧美人xxxx|
人妻有码中文字幕|
日本黄色小网站|
欧美午夜在线视频|
日韩中文娱乐网|
野花社区视频在线观看|
一级片免费在线|
国产精品18久久久久久久久|
国产精品欧美风情|
无码人妻精品一区二区三区9厂|
爱情电影社保片一区|
亚洲国产精品嫩草影院|
久久久久久久免费视频|
欧美性bbb|
一区二区三区四区电影|
在线电影欧美日韩一区二区私密|
国产乱了高清露脸对白|
久草福利在线|
99精品在线观看视频|
国产激情一区二区三区在线观看
|
欧美久久综合网|
国产一区2区在线观看|
国产 日韩 欧美 在线|
久久综合狠狠综合久久综青草
|
国产精品9区|
综合一区在线|
久久激情视频久久|
少妇的滋味中文字幕bd|
亚洲图区一区|
亚洲综合一二区|
一本久道高清无码视频|
超污黄色软件|
美女视频一区二区|
成人国产精品日本在线|
国产美女无遮挡永久免费|
老司机在线精品视频|
国产视频自拍一区|
人妻无码一区二区三区免费|
678在线观看视频|
国产精品久久久免费|
欧美有码在线|
亚洲国产精品一区二区久|
国产伦精品一区三区精东|
韩国三级在线观看久|
中文字幕第一页久久|
一区二区三区在线观看www|
国产精品福利视频一区二区三区|
国产手机视频一区二区|
国产精品va在线|
国产人妻精品一区二区三区|
精品国内自产拍在线观看视频|
日韩在线观看免费全|
国产精品成人免费一区二区视频|
成人涩涩视频|
亚洲国产精品成人av|
天天躁日日躁aaaa视频|
sm久久捆绑调教精品一区|
欧美自拍丝袜亚洲|
欧产日产国产精品98|
www.8ⅹ8ⅹ羞羞漫画在线看|
在线亚洲人成电影网站色www|
五月六月丁香婷婷|
米奇精品一区二区三区|
日韩欧美中文字幕在线观看|
毛毛毛毛毛毛毛片123|
国产激情视频在线|
91福利在线导航|
国产精品久久久久久亚洲色|
国产精品一品|
欧美大黄免费观看|
国产免费一区二区三区四区|
亚洲成人1区|
日本欧美在线看|
久久精品亚洲精品国产欧美|
日韩欧美一区二区三区四区
|
国产精品30p|
精品国产18久久久久久洗澡|
欧美成人h版在线观看|
伊人22222|
欧美视频二区|
超碰97人人人人人蜜桃|
国产bdsm视频|
97se亚洲国产综合自在线不卡|
九色自拍视频在线观看|
国产永久免费高清在线观看视频|
欧美日韩在线第一页|
久久久久国产精品无码免费看|
成人性生活视频|
国产亚洲在线播放|
国产精品51麻豆cm传媒|
一区二区亚洲|
欧美精品成人一区二区在线观看|
xfplay每日更新av资源|
国产精品的网站|
中文字幕第10页|
欧美成人精品三级网站|
www.久久久久久.com|
99热在线这里只有精品|
成人欧美亚洲|
日韩一区二区三区免费观看|
青娱乐国产精品|
国产二区精品|
精品无人区一区二区三区|
二区中文字幕|
日韩欧美aaa|
农村妇女精品一区二区|
欧美一站二站|
国产经典一区二区三区|
婷婷亚洲天堂|
欧美色视频日本高清在线观看|
成年人看的免费视频|
免费视频一区三区|
91福利视频导航|
韩国版免费三体|
日韩欧美有码在线|
久久精品黄色片|
亚洲精品国产成人影院|
久热这里只精品99re8久|
国产香蕉尹人视频在线|
欧美少妇性性性|
免费在线看黄网址|
午夜视频一区|
一区二区三区观看|
成人三级网址|
爽爽爽爽爽爽爽成人免费观看|
刘玥91精选国产在线观看|
国产精品一级黄|
国产欧美激情视频|
jizzjizzjizz欧美|
亚洲精品免费网站|
免费观看v片在线观看|