嵌入式实验报告.docx
- 文档编号:25012785
- 上传时间:2023-06-03
- 格式:DOCX
- 页数:59
- 大小:525.01KB
嵌入式实验报告.docx
《嵌入式实验报告.docx》由会员分享,可在线阅读,更多相关《嵌入式实验报告.docx(59页珍藏版)》请在冰豆网上搜索。
嵌入式实验报告
ARM
实验报告
:
学号:
专业:
学院:
指导老师:
一、GPIO输出与按键控制实验——按键控制流水灯实验
实验原容:
通过数组认为定义流水灯花样;
一个按键控制一种流水灯花色;
实验电路图:
源程序:
#include"Config.h"
#include"Target.h"
/*名称:
DelayNS()功能:
长软件延时入口参数:
dly延时参数,值越大,延时越久**/
voidDelayNS(uint32dly)
{uint32i;
for(;dly>0;dly--)
for(i=0;i<50000;i++);}
/**函数名称:
main()函数功能:
GPIO输出测试,花样流水灯。
*/
constuint32LED_TBL[8][10]={花样流水灯,注意调用时候用了取反操作
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF},//全部点亮
{0x00,0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80,0xFF},//依次逐个点亮
{0x00,0x01,0x03,0x07,0x0F,0x1F,0x3F,0x7F,0xFF,0xFF},//依次逐个叠加
{0xFF,0x7F,0x3F,0x1F,0x0F,0x07,0x03,0x01,0x00,0xFF},//依次逐个递减
{0x00,0x81,0x42,0x24,0x18,0x18,0x24,0x42,0x81,0xFF},//两个靠拢后分开
{0x00,0x81,0xC3,0xE7,0xFF,0xFF,0xE7,0xC3,0x81,0xFF},//从两边叠加后递减
{0xAA,0x55,0xAA,0x55,0xAA,0x55,0xAA,0x55,0xFF,0xFF},
{0x00,0xFF,0x00,0xFF,0x00,0xFF,0x00,0xFF,0x00,0xFF}};
/**函数名称:
keyscan()函数功能:
按键扫描,每按一次键对相应的LED进行取反*/
voidkeyscan(void)
{uint32i,j,k,m;
PINSEL0=0x00000000;//设置管脚连接GPIO
IO0DIR=0x000000ff;
k=IO0PIN;
if((k&keycon)!
=keycon)
{for(j=0;j<50000;j++);//延时去抖
k=IO0PIN;
if((k&keycon)!
=keycon)
{i=(k&keycon)|(~keycon);i=~i;
switch(i)
{caseKEY1:
for(m=0;m<10;m++){IO0SET=~((LED_TBL[0][m]));DelayNS(3);IO0CLR=((LED_TBL[0][m]));DelayNS(3);}break;
caseKEY2:
for(m=0;m<10;m++){IO0SET=~((LED_TBL[1][m]));DelayNS(3);IO0CLR=((LED_TBL[1][m]));DelayNS(3);}break;
caseKEY3:
for(m=0;m<10;m++){IO0SET=~((LED_TBL[2][m]));DelayNS(3);IO0CLR=((LED_TBL[2][m]));DelayNS(3);}break;
caseKEY4:
for(m=0;m<10;m++){IO0SET=~((LED_TBL[3][m]));DelayNS(3);IO0CLR=((LED_TBL[3][m]));DelayNS(3);}break;
caseKEY5:
for(m=0;m<10;m++){IO0SET=~((LED_TBL[4][m]));DelayNS(3);IO0CLR=((LED_TBL[4][m]));DelayNS(3);}break;
caseKEY6:
for(m=0;m<10;m++){IO0SET=~((LED_TBL[5][m]));DelayNS(3);IO0CLR=((LED_TBL[5][m]));DelayNS(3);}beak;
caseKEY7:
for(m=0;m<10;m++){IO0SET=~((LED_TBL[6][m]));DelayNS(3);IO0CLR=((LED_TBL[6][m]));DelayNS(3);}break;
caseKEY8:
for(m=0;m<10;m++){IO0SET=~((LED_TBL[7][m]));DelayNS(3);IO0CLR=((LED_TBL[7][m]));DelayNS(3);}break;}
}
while((k&keycon)!
=keycon)k=IO0PIN;}}
/*函数名称:
main()
*函数功能:
每按一次键,对相应LED的状态取反*/
intmain(void)
{
TargetResetInit();
PINSEL0=0x00000000;//设置所有管脚连接GPIO
PINSEL1=0x00000000;
IO0DIR=0x000000ff;//设置P0.0-P0.7为输出,其余为输入
IO0CLR=0xffffffff;
while
(1)
{keyscan();}}
二、GPIO输出实验——流水灯实验
实验容:
通过数组认为定义流水灯花样;
有六种花样的流水灯依次闪烁;
实验电路图:
源程序:
#include"config.h"
/**函数名称:
DelayNS()函数功能:
长软件延时入口参数:
dly延时参数,值越大,延时越久*/
voidDelayNS(uint32dly)
{uint32i;
for(;dly>0;dly--)
for(i=0;i<50000;i++);}
/**函数名称:
main()函数功能:
GPIO输出测试,花样流水灯。
*/
constuint32LED_TBL[]={//花样流水灯,注意调用时候用了取反操作
0x00,0xFF,//全部熄灭后,再全部点亮
0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80,//依次逐个点亮
0x01,0x03,0x07,0x0F,0x1F,0x3F,0x7F,0xFF,//依次逐个叠加
0xFF,0x7F,0x3F,0x1F,0x0F,0x07,0x03,0x01,//依次逐个递减
0x81,0x42,0x24,0x18,0x18,0x24,0x42,0x81,//两个靠拢后分开
0x81,0xC3,0xE7,0xFF,0xFF,0xE7,0xC3,0x81};//从两边叠加后递减
intmain(void)
{uint8i;
PINSEL0=0x00000000;//设置管脚连接GPIO
IO0DIR=0x000000ff;//设置P0.0-P0.7控制口为输出
while
(1)
{for(i=0;i<42;i++)//花样流水灯显示
{IO0SET=~((LED_TBL[i]));DelayNS(3);IO0CLR=((LED_TBL[i]));DelayNS(3);}}}
三、单路按键控制LED/蜂鸣器
实验容:
按键key1一按,蜂鸣器响,LED灯亮;
实验电路图:
源程序:
#include"config.h"
#defineBEEP1<<7//P0.7控制蜂鸣器,低电平蜂鸣
#defineKEY11<<8
/*函数名称:
DelayNS()函数功能:
长软件延时*入口参数:
dly延时参数,值越大,延时越久出口参数:
无*******/
voidDelayNS(uint32dly)
{uint32i;
for(;dly>0;dly--)
for(i=0;i<50000;i++);
}
/**函数名称:
main()**函数功能:
用P0.7控制BEEP,让蜂鸣器蜂鸣*/
intmain(void)
{PINSEL0=0x00000000;//设置引脚连接GPIO
PINSEL1=0x00000000;
IO0DIR=BEEP;//设置BEEP控制口为输出
while
(1)
{
if((IO0PIN&KEY1)==0)IO0CLR=BEEP;elseIO0SET=BEEP;}}
四、定时器0控制数码管一亮一灭
实验容:
0.5定时时间一到,数码管闪烁一次;
实验电路图:
源程序:
#include"Config.h"
#include"Target.h"
#defineLED(1<<7)/*P0.7引脚控制LED,低电平点亮*/
/*函数名称:
main()
*函数功能:
通过查询定时器0中断标志位控制LED点亮*/
intmain(void)
{PINSEL1=0x00000000;//设置管脚连接GPIO
IO0DIR=LED;//设置LED控制口输出
T0TC=0;//定时器0初始化
T0PR=99;//设置定时器0分频为100分频,得120000Hz
T0MCR=0x03;//匹配通道0匹配中断并复位T0TC
T0MR0=60024;//比较值(0.5s定时值)
T0TCR=0x03;//启动并复位T0TC
T0TCR=0x01;
while
(1)
{while((T0IR&0x01)==0);//等待定时时间到
T0IR=0x01;//清除中断标志
if((IO0SET&LED)==0)//取反LED状态
IO0SET=LED;
else
IO0CLR=LED;}}
五、数码管动态显示
实验电路图:
源程序:
#include"config.h"
voiddelay(uint32x)
{
uint8i;
while(x--)
for(i=500000;i>0;i--);
}
uint8table[]={
0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71
};
uint8table1[]={
0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80
};
intmain(void)
{
uint8i,j,p=16;
PINSEL0=0x00000000;
PINSEL1=0x00000000;
IO0DIR=0x00ffff00;
while
(1)
{
for(i=0;i<8;i++)
{
IO0CLR=IO0CLR|0xff00;
IO0SET=~table[i]<<8;
for(j=0;j<8;j++)
{
IO0CLR=IO0CLR|0xff0000;
IO0SET=1<
delay(5);
}
p++;
if(p==24)p=16;
}
}
}
六、将读取的DS18B20温度值转换为十进制
实验电路图:
#include"config.h"
#include"DS18B20.h"
uint8Tp[12];//温度显示数据
uint16tt;
uint8TMark=0;//温度正负标志
/****************************************************************************
*函数名称:
Init()
*函数功能:
I/O端口初始化,设置引脚连接模块
****************************************************************************/
voidInit(void){
PINSEL0|=0x00000000;//设置引脚连接模块
PINSEL1|=0x00000088;
PINSEL2&=0x00000004;
}
/****************************************************************************
*函数名称:
ConvertTemperature()
*函数功能:
将读取的DS18B20温度值转换为十进制数
*入口参数:
tvalue读取的DS18B20当前温度值
****************************************************************************/
voidConvertTemperature(uint16tvalue){
Tp[1]=tvalue/1000+0x30;//百位数
Tp[2]=tvalue%1000/100+0x30;//十位数
Tp[3]=tvalue%100/10+0x30;//个位数
Tp[4]=0x2E;//显示小数点
Tp[5]=tvalue%10+0x30;//显示温度小数位
Tp[6]=0x01;//显示自定义字符,用于温度符号显示
Tp[7]=0x43;//显示字符"C"
Tp[8]=0x20;//显示字符"C"
Tp[9]=0x20;//显示字符"C"
Tp[10]=0x20;//显示字符"C"
Tp[11]=0x20;//显示字符"C"
if(TMark==0){
Tp[0]=0x20;//正温度不显示符号
}
else{
Tp[0]=0x2D;//负温度显示负号:
-
}
if(Tp[1]==0x30){
Tp[1]=0x20;//如果百位为0,不显示
if(Tp[2]==0x30){
Tp[2]=0x20;//如果十位为0,不显示
}
}
}
/****************************************************************************
*函数名称:
DelayNS()
*函数功能:
软件延时
*入口参数:
dly延时参数,值越大,延时越久
****************************************************************************/
voidDelayNS(uint32dly){
uint32i;
for(;dly>0;dly--)
for(i=0;i<50000;i++);
}
/****************************************************************************
*函数名称:
main()
*函数功能:
主函数
****************************************************************************/
intmain(void){
uint8i;
Init();//I/O端口初始化
lcd_init();//LCD初始化
DisText(0x80,"CurrentTemperature:
");
for(i=0;i<110;i++)ReadTemp();//预读DS18B20
while
(1){
ConvertTemperature(ReadTemp());//温度转换
DisText(0xc4,Tp);//显示当前温度
}
}
七、LCD1602显示1
实验电路图:
源程序:
#include"config.h"
#definers(1<<5)
#definerw(1<<6)
#defineen(1<<7)
#definebusy(1<<15)
/****************************************************************************
*函数名称:
ChkBusy()
*函数功能:
检查总线是否忙
****************************************************************************/
voidChkBusy()
{
IO0DIR=0xf0;
while
(1)
{
IO0CLR=rs;
IO0SET=rw;
IO0SET=en;
if(!
(IO0PIN&busy))break;
IO0CLR=en;
}
IO0DIR=0xffffffff;
}
/****************************************************************************
*函数名称:
WrOp()
*函数功能:
写命令
*入口参数:
dat,待写入LCD的命令
****************************************************************************/
voidWrOp(uint8dat)
{
ChkBusy();
IO0CLR=rs;
IO0CLR=rw;
IO0CLR=IO0CLR|0xff00;//先清零
IO0SET=dat<<8;//再送数
IO0SET=en;
IO0CLR=en;
}
/****************************************************************************
*函数名称:
WrDat()
*函数功能:
写数据
*入口参数:
dat,待写入LCD的数据
****************************************************************************/
voidWrDat(uint8dat)
{
ChkBusy();
IO0SET=rs;
IO0CLR=rw;
IO0CLR=IO0CLR|0xff00;//先清零
IO0SET=dat<<8;//再送数
IO0SET=en;
IO0CLR=en;
}
/****************************************************************************
*函数名称:
lcd_init()
*函数功能:
lcd初始化
****************************************************************************/
voidlcd_init(void)
{
WrOp(0x38);
WrOp(0x06);
WrOp(0x0c);
}
/***************************************************************************
*函数名称:
LocateXY()
*函数功能:
显示光标定位
*入口参数:
posxLCD列位置,posyLCD行位置
****************************************************************************/
voidLocateXY(uint8posx,uint8posy){
uint8temp;
temp=posx&0xf;
posy&=0x1;
if(posy)temp|=0x40;
temp|=0x80;
WrOp(temp);
}
/***************************************************************************
*函数名称:
DispOneChar()
*函数功能:
显示单字符
*入口参数:
xLCD列位置,yLCD行位置,Wdata显示字符
****************************************************************************/
voidDispOneChar(uint8x,uint8y,uint8Wdata){
LocateXY(x,y);//定位显示字符的x,y位置
WrDat(Wdata);//写字符
}
/***************************************************************************
*函数名称:
ePutstr()
*函数功能:
显示字符串
*入口参数:
xLCD列,yLCD行,j字符串长度,*ptr字符串指针
****************************************************************************/
voidePutstr(uint8x,uint8y,uint8j,uint8*ptr){
uint8i,l=0;
for(i=0;i DispOneChar(x++,y,ptr[i]); if(x==16){ x=0;y^=l; } } } /**********************************************
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 嵌入式 实验 报告