当前位置:文档之家› 嵌入式基础考试题目

嵌入式基础考试题目

嵌入式基础考试题目
嵌入式基础考试题目

1、用PWM方式,使LED灯闪烁。

#include ""

void PwmInit(void);

int main(void){

PINSEL0=0x00080000;

PwmInit();

while(1){

PWMMR0=4000;

PWMMR6=2000;

}

return 0;

}

void PwmInit(){

PWMPR=0x00;

PWMMCR=0x02;

PWMMR0=4000;

PWMMR6=2000;

PWMLER=0x41;

PWMPCR=0x4000;

PWMTCR=0x09;

}

2、用定时器匹配后引脚翻转功能使LED灯1秒闪烁一次。

#include ""

#define LED 1<<3 void __irq IRQ_Time0(){ while((T0IR&0x01)==0);

T0IR=0x01;

VICVectAddr=0x00;

}

void Time0Init(){

T0PR = 99;

T0MCR = 0x03;

T0MR0 = 110592/4;

T0TCR = 0x03;

T0TCR = 0x01;

T0EMR=0X30;

VICIntSelect = 0x00;

VICVectCntl0 = 0x24;

VICVectAddr0 = (uint32)IRQ_Time0;

VICIntEnable = 0x00000010;

}

int main(){

PINSEL0 = 0x00000080;

IOCLR=LED;

Time0Init();

while(1);

return 1;

}

3、上位机发送一个数字字符给下位机(1-8),下位机接受到这个字符若为“1”,则点亮一盏灯,“2”点亮2盏灯。。。。。。。“8”点亮8

盏灯。

4、设外部中断为FIQ快速中断,按键按下,灯的亮灭状态改变。

/*

*注意:需要在中添加EXTMODE和EXTPOLAR寄存器*/

#include ""

#define LED 0x01

void __irq IRQ_SPR()

{

if((IOPIN&0X01)==0)

IOSET=0X01;

else

IOCLR=0X01;

while((EXTINT&0X02)!=0)

EXTINT=0x02;}

//中断初始化

void EINT_init(){

PINSEL0=0X;//选择为中EINT1,为GPIO

VICIntSelect=/*~*/(1<<15);//设置EINT1为

FIQ中断

VICIntEnable=(1<<15);//EINT1中断使能,

开中断

EXTINT=0x02;//清中断

}

int main(){

EINT_init();

IODIR=LED;//为输出,其余为输入

IOSET=LED;//开始不显示

while(1);

return 0;

}

修改头文件

修改lpc2016

1)在#define MAMTIM (*((volatile unsigned char *) 0xE01FC004))//定时控制添加:

#define EXTMODE (*((volatile unsigned char *) 0xE01FC148))

#define EXTPOLAR (*((volatile unsigned char *) 0xE01FC14C))

2)添加lcd1602

3)修改

void FIQ_Exception(void) {

if((IOPIN&0X01)==0)

IOSET=0X01;

else

IOCLR=0X01;

while((EXTINT&0X02)!=0)

EXTINT=0x02;

// while(1); // 这一句替换为自己的代码}

4) 修改文件将5f 改成9f

5、外部中断,通过1个按键使8个发光二极管二进制显示加法。#include ""

#define LED 0x000000FF //设置p0引脚typedef unsigned int uint32;

uint32 counter=0;

void __irq IRQ_Eint1(void){ //加法counter++;

IOSET=LED;

IOCLR=counter;

while((EXTINT&0x02)!=0){

EXTINT=0x02;

}

VICVectAddr=0;

}int main(void)

{

PINSEL0 = 0x;

IODIR = LED;

IOSET=LED;

IOCLR=counter;

VICIntSelect=0;

VICIntEnable=0x00008000;

VICVectCntl1=0x2F;

VICVectAddr1=(int)IRQ_Eint1;

while (1) ;

}

6、用单边沿、双边沿两种方式输出两路脉冲信号,要求占空比为50%,显示在同一个示波器上;

#include ""

void PWM_Init(){

PWMPR=0x00;

PWMMCR=0x02;

PWMMR0=4000;

PWMMR1=1000;

PWMMR2=3000;

PWMMR3=2000;

PWMLER=0x0F;

PWMPCR=0x0C04;

PWMLER=0X0F;

PWMTCR=0x09;

}

int main(){

PINSEL0=0X00008008;

PWM_Init();

while(1){

PWMMR0=4000;

PWMMR1=1000;

PWMMR2=3000;

PWMMR3=2000;

}

return 0;

}

7、用延时方法,使共阳数码管静态循环显示0—F。7seg-com-an-grn

#include ""

#define LED 0X7F

void delayNS(uint32 xms) {

int i,j;

for(i=xms;i>0;i--)

for(j=5000;j>0;j--); }

uint32 dis_tab[16]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7

d,0x07,

0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};

int main(){

int i;

PINSEL0=0;

IODIR=LED;

while(1)

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

{

IOSET=0xff;

IOCLR=dis_tab[i];

delayNS(280);

}

return 0;

}

8、8位共阴数码管动态显示。

#include""

#define uchar unsigned char

#define uint unsigned int

#define CS 0xFEFF

void delay(uint xms){

uint i,j;

for (i=xms;i>0;i--)

for(j=110;j>0;j--) ; }int main(void){

const uint

a[8]={0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0xff};

PINSEL0 = 0x00000000;

PINSEL1 = 0x00000000;

IODIR = 0xFFFF;

while (1){

uchar i;

for (i=0;i<8;i++){

IOSET = (CS<

delay(20);

IOCLR = 0xFFFF;

}

}

return 0;

}

9、使用中断,2按键,2灯。不同按键控制不同灯,按键按下,所控制的灯的状态改变。

修改头文件

1)在#define MAMTIM (*((volatile unsigned char *) 0xE01FC004))//定时控制

添加:

#define EXTMODE (*((volatile unsigned char *) 0xE01FC148))

#define EXTPOLAR (*((volatile unsigned char *) 0xE01FC14C))

#include ""

#define d1 1<<0//第一盏灯

#define d2 1<<1//第二盏灯

//EINT1的中断服务程序

void __irq EINT1_ISR()

{

if((IOPIN&d1)==0x0)

IOSET=d1;

else

IOCLR=d1;

while((EXTINT&0X02)!=0)//产生中断要清中断

EXTINT=0x02;

}

//EINT2的中断服务程序

void __irq EINT2_ISR()

{

if((IOPIN&d2)==0x0)

IOSET=d2;

else

IOCLR=d2;

while((EXTINT&0X04)!=0)

EXTINT=0x04;

}

//中断初始化

void EINT_init()

{

PINSEL0=0XA0000000;//选择,为中EINT1,

EINT2,,为GPIO

EXTMODE|=0X06;//- ,0110,跳沿触发

EXTPOLAR|=0x09;//-,1001,下跳沿触发

VICIntSelect&=~0x00018000;//设置EINT1,

2为IRQ中断

VICVectCntl1=0x20|15;//EINT1分配为向

量IRQ中通道1,b5=1

VICVectCntl2=0x20|16;//EINT2分配为向

量IRQ中通道2,b5=1

VICVectAddr1=(uint32)EINT1_ISR;//EINT1

的中断服务程序

VICVectAddr2=(uint32)EINT2_ISR;//EINT2

的中断服务程序

VICIntEnable=0x00018000;//EINT1,2中断

使能,开中断

EXTINT=0x0f;//清中断

}

int main()

{

EINT_init();

IODIR=d1|d2;//,为输出,其余为输入

IOSET=d1|d2;//开始不显示

while(1);

return 0;

}

10、以中断方式,控制两个数码管显示数字,三个按键,每个按键分别控制数字的加、减和清零。

#include ""

#define LED 0x000000ff

uint32 temp=0;

//加法

void __irq IRQ_Eint0()

{

temp=VICIRQStatus;

temp=IOSET;

temp++;

if((temp&0x000f)>=10)

temp+=6; //个位大于9进位,改0

if((temp&0x00ff)>0x99)

temp+=0x060;//十位大于9进位,改0

IOCLR=LED;

IOSET=temp;

while((EXTINT&0x01)!=0)

EXTINT=0x01;

VICVectAddr=0x00;

}

//清零

void __irq IRQ_Eint1()

{

temp=VICIRQStatus;

IOCLR=LED;

IOSET=0;

while((EXTINT&0x02)!=0)

EXTINT=0x02;

VICVectAddr=0x00;

}

//减法

void __irq IRQ_Eint2()

{

temp=VICIRQStatus;

temp=IOSET;

temp--;

if((temp&0x000f)==0xf)//temp--,个位出现f,执行下边操作

temp&=0xf9; //个位f-9-,十位保留

if((temp&0x00f0)==0xf0)//temp--,十位出现f,执行下边操作

temp&=0x9f;//十位f--9,个位保留

IOCLR=LED;

IOSET=temp;

while((EXTINT&0x04)!=0)

EXTINT=0x04;

VICVectAddr=0x00;}

void EXTINT_Init()

{

VICIntSelect=0x00000000;

VICVectCntl0=0x2e;

VICVectAddr0=(int)IRQ_Eint0;

VICVectCntl1=0x2f;

VICVectAddr1=(int)IRQ_Eint1;

VICVectCntl2=0x30;

VICVectAddr2=(int)IRQ_Eint2;

VICIntEnable=0x0001c000;

EXTINT=0x07;

}

int main()

{

PINSEL0=0xa0000000;

PINSEL1=0x00000001;

EXTINT_Init();

IODIR=LED;

IOCLR=LED;

while(1);

return 0;

}

11、以GPIO的方式控制LCD1602输出两行,第一行显示邮箱,第二行显示电话号

#include ""

#define rs (1<<8) #define rw (1<<9) #define en (1<<10) #define busy (1<<7) uint8 txt1[]={""}; uint8 txt2[]={""}; void CheckBusy() {IODIR=0x700;

while(1)

{

IOCLR=rs;

IOSET=rw;

IOSET=en;

if(!(IOPIN & busy))break;

IOCLR=en;

}

IODIR=0x7ff;

}

void WrOp(uint8 dat)

{

CheckBusy();

IOCLR=rs; //全部清零

IOCLR=rw;

IOCLR=0xff; //先清零

IOSET=dat; //再送数

IOSET=en;

IOCLR=en;

}

void WrDat(uint8 dat)

{

CheckBusy();

IOSET=rs;

IOCLR=rw;

IOCLR=0xff; //先清零

IOSET=dat; //再送数

IOSET=en;

IOCLR=en;

}

void DisText(uint8 addr,uint8 *p)

{

WrOp(addr);

while(*p !='\0')WrDat(*(p++));

}

int main(void)

{

lcd_init();

IODIR=0x7ff; //设置为输出

IOCLR=0x7ff;

DisText(0x80,txt1);

DisText(0xc3,txt2);

while(1);

}

12、以I2C的方式,用数码管显示开机次数。

#include ""

#include ""

#define EEPROM 0xA0

void DelayNS(uint32 dly);

void Display(uint8 num);

uint8 data_buf[1];

int main()

{

PINSEL0 |=0x0000FFFF;

IODIR |= 0x0000FF00;

I2C_Init(100000);//初始化

IRcvStr(EEPROM,0x00,data_buf,1);//读出EEPROM 0x00处的数据

if(data_buf[0]==0xff)

data_buf[0] = 0;

if(data_buf[0]>9)

data_buf[0] = 0;

Display(data_buf[0]+1);

data_buf[0]++;

ISendStr(EEPROM,0x00,data_buf,1);//写入

数据到EEPROM 0x00

while(1);

return 0;

}

void DelayNS(uint32 dly)

{

uint32 i;

for(; dly>0; dly--)

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

}

void Display(uint8 num)

{

switch(num)

{

case 0: //"0"

IOCLR |= (IOCLR &

0xFFFF00FF)|(0xFF<<8);

IOSET |= 0x3F<<8;

break;

case 1: //"1"

IOCLR |= (IOCLR &

0xFFFF00FF)|(0xFF<<8);

IOSET |= 0x00000006<<8;

break;

case 2: //"2"

IOCLR |= (IOCLR &

0xFFFF00FF)|(0xFF<<8);

IOSET |= 0x0000005B<<8;

break;

case 3: //"3"

IOCLR |= (IOCLR &

0xFFFF00FF)|(0xFF<<8);

IOSET |= 0x0000004F<<8;

break;

case 4: //"4"

IOCLR |= (IOCLR &

0xFFFF00FF)|(0xFF<<8);

IOSET |= 0x00000066<<8;

break;

case 5: //"5"

IOCLR |= (IOCLR &

0xFFFF00FF)|(0xFF<<8);

IOSET |= 0x0000006D<<8;

break;

case 6: //"6"

IOCLR |= (IOCLR &

0xFFFF00FF)|(0xFF<<8);

IOSET |= 0x0000007D<<8;

break;

case 7: //"7"

IOCLR |= (IOCLR & 0xFFFF00FF)|(0xFF<<8);

IOSET |= 0x00000007<<8;

break;

case 8: //"8"

IOCLR |= (IOCLR &

0xFFFF00FF)|(0xFF<<8);

IOSET |= 0x0000007F<<8;

break;

case 9: //"9"

IOCLR |= (IOCLR &

0xFFFF00FF)|(0xFF<<8);

IOSET |= 0x0000006F<<8;

break;

case 10: //"A"

IOCLR |= (IOCLR &

0xFFFF00FF)|(0xFF<<8);

IOSET |= 0x00000077<<8;

break;

case 11: //"B"

IOCLR |= (IOCLR &

0xFFFF00FF)|(0xFF<<8);

IOSET |= 0x0000007C<<8;

break;

case 12: //"C"

IOCLR |= (IOCLR &

0xFFFF00FF)|(0xFF<<8);

IOSET |= 0x00000039<<8;

break;

case 13: //"D"

IOCLR |= (IOCLR &

0xFFFF00FF)|(0xFF<<8);

IOSET |= 0x0000005E<<8;

break;

case 14: //"E"

IOCLR |= (IOCLR &

0xFFFF00FF)|(0xFF<<8);

IOSET |= 0x00000079<<8;

break;

case 15: //"F"

IOCLR |= (IOCLR &

0xFFFF00FF)|(0xFF<<8);

IOSET |= 0x00000071<<8;

break;

default: //"off"

IOCLR |= (IOCLR &

0xFFFF00FF)|(0xFF<<8);

IOSET |= 0x00000000<<8;

break;

}

}

13、利用PWM和按键,实现按键按下,脉宽增加的功能。

#include ""

#define KEY1 0x00004000 /*引脚连接KEY1*/

void WaitKey()

{ uint32 i;

while(1)

{ while((IOPIN&KEY1)!=0);

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

if((IOPIN&KEY1)==0)break;

}

while((IOPIN&KEY1)==0);

}

void init(){

PWMPR=0x00;

PWMMCR=0x02;

PWMMR0=4000;

PWMMR6=1000;

PWMLER=0x41;

PWMPCR=0x4000;

PWMTCR=0x09;

}

int main()

{

uint32 pwmdata;

PINSEL0=0x00080000;

PINSEL1=0x00000000;

init();

pwmdata=1000;

while(1)

{ PWMMR0=4000;

PWMMR6=pwmdata;

PWMLER=0x41;

WaitKey();

pwmdata+=100;

if(pwmdata>=4000)

pwmdata=0;

}

return 0;

}

14、利用数码管显示8个按键的按键序号,例如:第一个按键按下显示“1”,第二个按键按下显示“2”,以此类推。

#include ""

#define key (0xff<<8) typedef unsigned int uint; /*

*延时函数

*/

void delay(uint xms)

{

uint i,j;

for(i=xms;i>0;i--)

for(j=110;j>0;--j);

}

/*

*判断按键

*/

void waitkey()

{

if((IOPIN&key)!=key)//判断有键按下

{

delay(1000);//延时去抖

if((IOPIN&key)!=key)//再次判断按键

{

IOCLR=0x000000ff;//清0

switch(IOPIN&key)

{

case 0x0000fe00://键1

IOSET=0x00FF06;

break;

case 0x0000fd00:////键2

IOSET=0x00FF5b;

break;

case 0x0000fb00:////键3

IOSET=0x000FF4f;

break;

case 0x0000f700:////键4

IOSET=0x00FF66;

break;

case 0x0000ef00:////键5

IOSET=0x00FF6d;

break;

case 0x0000df00:////键6

IOSET=0x00FF7d;

break;

case 0x0000bf00:////键7

IOSET=0x0000FF07;

break;

case 0x00007f00:////键8

IOSET=0x0000FF7f;

break;

}

}

while((IOPIN&key)==key);//等待按键抬起

}

}

int main()

{

PINSEL0=0x0;//GPIO功能

IODIR=0x000000FF;//输入输出

while(1)

{

waitkey();

}

return 0;

}

15、利用WDT,控制LED1--LED4显示输出。程序先对LED1--LED4闪烁3次,并进行喂狗处理;然后只点亮LED1,并进入死循环,等待WDT复位;

#include ""

#define LEDCON 0x0000000f

void WdtFeed(void)

{

WDFEED = 0xAA;

WDFEED = 0x55;

}

void DelayNS(uint32 dly) {

uint32 i;

for(; dly>0; dly--)

{

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

}

}

int main(void)

{

uint8 i;

IODIR = LEDCON;

WDTC = ;

WDMOD = 0x03;

WdtFeed();

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

{

IOSET = 0x0000000f;

DelayNS(100);

IOCLR = 0x0000000f;

DelayNS(100);

}

IOSET = 0x0000000f;

IOCLR = 0x00000001;

while(1);

return(0);

}

16、以定时器的方式,使数码管从0—9循环显示,每一秒改变一次。#include ""

#define LED 0x7f

int

dis_tab[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7 d,0x07,0x7f,0x6f};

int i=0;

void __irq IRQ_Time0()

{

while((T0IR&0x01)==0);

IOCLR=0XFF;

IOSET=dis_tab[(++i)%10];

T0IR=0x01;

VICVectAddr=0x00;

}

void Time0Init()

{

T0PR = 99;

T0MCR = 0x03;

T0MR0 = 110592/4;

T0TCR = 0x03;

T0TCR = 0x01;

VICIntSelect = 0x00;

VICVectCntl0 = 0x24;

VICVectAddr0 = (uint32)IRQ_Time0;

VICIntEnable = 0x00000010;

}

int main()

{

PINSEL0 = 0x00000000;

IODIR = LED;

IOSET = 0X3F;

Time0Init();

while(1);

return 1;

}

17、利用SPI和HC595,控制数码管0-F显示。

#include ""

#define HC595_CS 0x00000100

void DelayNS(uint32 dly)

{ uint32 i;

for(; dly>0; dly--)

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

}

void MSpiIni(void)

{

S0SPCCR = 0x52;

S0SPCR = 0x30;

}

uint8 MSendData(uint8 data) {

IOCLR = HC595_CS;

S0SPDR =data;

while( 0==(S0SPSR&0x80) );

IOSET = HC595_CS;

return (S0SPDR);

}

uint8 const DISP_TAB[16] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,

0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};

uint8 rcv_data;

int main(void)

{ uint8 i;

PINSEL0 = 0x00005500;

PINSEL1 = 0x00000000;

IODIR = HC595_CS;

MSpiIni();

while(1)

{ for(i=0; i<16; i++)

{ rcv_data = MSendData(DISP_TAB[i]);

DelayNS(300);

}

}

return(0);

}

修改添加

#define S0SPCR (*((volatile unsigned char *) 0xE0020000))

#define S0SPSR (*((volatile unsigned char *) 0xE0020004))

#define S0SPDR (*((volatile unsigned char *) 0xE0020008))

#define S0SPCCR (*((volatile unsigned char *) 0xE002000C))

#define S0SPINT (*((volatile unsigned char *) 0xE002001C))

#define S1SPCR (*((volatile unsigned char *) 0xE0030000))

#define S1SPSR (*((volatile unsigned char *) 0xE0030004))

#define S1SPDR (*((volatile unsigned char *) 0xE0030008))

#define S1SPCCR (*((volatile unsigned char *) 0xE003000C))

#define S1SPINT (*((volatile unsigned char *) 0xE003001C))

18、利用SPI和HC595,使流水灯亮,亮的方式为:从上往下——从下往上——灭——闪两下——往中间跑——交叉闪亮。

#include ""

#define HC595_CS 0x00000100

void DelayNS(uint32 dly)

{ uint32 i;

for (;dly>0;dly--)

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

}

void MSpiIni(void)

{ S0SPCCR=0x52;

S0SPCR=0x30;

}

uint8 MSendData(uint8 data)

{ IOCLR=HC595_CS;

S0SPDR=data;

while(0==(S0SPSR&0x80));

IOSET=HC595_CS;

return(S0SPDR);

}

uint8

DISP_TAB[33]={0x01,0x02,0x04,0x08,0x10,0x20,0

x40,0x80,

0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01,

0x00,0xFF,0x00,0xFF,0x00,

0x18,0x24,0x42,0x81,

0x01,0x04,0x10,0x40,

0x02,0x08,0x20,0x80

};

int main(void)

{ uint8 rcv_data;

uint8 i;

PINSEL0=0x00005500;

PINSEL1=0x00000000;

IODIR=HC595_CS;

MSpiIni();

rcv_data=MSendData(0);

while(1)

{ for (i=0;i<33;i++)

{rcv_data=MSendData(DISP_TAB[i]);

DelayNS(20);

}

}

return(0);

}

修改添加

#define S0SPCR (*((volatile unsigned char *) 0xE0020000)) #define S0SPSR (*((volatile unsigned char *) 0xE0020004)) #define S0SPDR (*((volatile unsigned char *) 0xE0020008)) #define S0SPCCR (*((volatile unsigned char *) 0xE002000C)) #define S0SPINT (*((volatile unsigned char *) 0xE002001C))

#define S1SPCR (*((volatile unsigned char *) 0xE0030000))

#define S1SPSR (*((volatile unsigned char *) 0xE0030004))

#define S1SPDR (*((volatile unsigned char *) 0xE0030008))

#define S1SPCCR (*((volatile unsigned char *) 0xE003000C))

#define S1SPINT (*((volatile unsigned char *) 0xE003001C))

19、通过UART端口向上位机(模拟终端)发送考生名字的拼音。

#include ""

void DelayNS(uint32 dly)

{ uint32 i;

for(;dly>0;dly--)

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

}

void UART0_Ini(void)

{

U0LCR=0x83;

U0DLL=0x12;

U0DLM=0x00;

U0LCR=0x03;

}

void UART0_SendByte(uint8 data)

{

U0THR=data;

while((U0LSR&0x40)==0);

}

void UART0_SendStr(uint8 const *str)

{ while(1)

{

UART0_SendByte(*str++);

if(*str=='\0')

{

UART0_SendByte('\r');

UART0_SendByte('\n');

break;

}

}

}

int main(void)

{

uint8 const

SEND_STRING[]="zhangyunan!\n";

PINSEL0=0x00000005;

PINSEL1=0x00000000;

UART0_Ini();

UART0_SendStr(SEND_STRING);

DelayNS(10);

}

20、利用UART串口,完成一个字符串的写入和回写功能,要求每4个字符触发一次,返回刚才写入

相关主题
文本预览
相关文档 最新文档