嵌入式系统实验作业模板1.docx
《嵌入式系统实验作业模板1.docx》由会员分享,可在线阅读,更多相关《嵌入式系统实验作业模板1.docx(13页珍藏版)》请在冰豆网上搜索。
嵌入式系统实验作业模板1
嵌入式系统及应用开放性实验报告
得分:
题目:
基于LPC2378的温度采集
专业名称:
电气工程及其自动化
学生姓名:
吴盼盼
班级:
09021303
时间:
2016.6.18
1、总体设计方案
利用热敏电阻获得温度模拟量,再借助ad转换转换成十进制数字量,再在LCD屏上显示出温度的数值,并且画出了温度随时间变化的坐标系和曲线。
热敏电阻器是敏感元件的一类,按照温度系数不同分为正温度系数热敏电阻器(PTC)和负温度系数热敏电阻器(NTC)。
热敏电阻器的典型特点是对温度敏感,不同的温度下表现出不同的电阻值。
正温度系数热敏电阻器(PTC)在温度越高时电阻值越大,负温度系数热敏电阻器(NTC)在温度越高时电阻值越低,它们同属于半导体器件。
2、具体设计
2.1程序框图
设置IO口置位和清零函数
2.2实验程序代码
AD转换成10进制代码:
#include"Code1.h"
constunsignedintTemp_code[]=
{2843,2718,2599,2486,2379,2277,2180,2087,1999,1916,1836,1760,1688,1619,1553,1490,1430,1373,1319,1266,1217,1169,1124,1081,1039,1000,
962,925,891,857,826,795,766,738,711,686,661,638,615,593,573,553,534,515,497,480,464,449,433,419,405,
392,379,366,355,343,332,321,311,301,292,283,274,265,257,249,242,234,227,220,214,208,201,195,190,184,
};
ucharcheck_code(uintk)
{
unsignedchari;
if(k<184)return(76);
for(i=0;kreturn(i-1);
}
externuintTotemp(uintAD)
{
unsignedintItemp;
unsignedintTk;
Tk=1023-AD;
Itemp=(uint)(((ulong)1000*AD)/Tk);
return(Itemp);
}
ucharGet_Temp(uinti)
{
return(check_code(Totemp(i)));
}
程序代码:
uintcolor[]={0xf8,0x00,0x07,0xe0,0x00,0x1f,0xff,0xe0,0x00,0x00,0xff,0xff,0x07,0xff,0xf8,0x1f};
uintPOINT_COLOR=0XF800;
voidIo_Set(ucharpin)
{
unsignedintio_data=1;
io_data=io_data<IOSET0=io_data;
}
voidIo_Clr(ucharpin)
{
unsignedintio_data=1;
io_data=io_data<IOCLR0=io_data;
}
voidIo_Set2(ucharpin)
{
unsignedintio_data=1;
io_data=io_data<FIO2SET=io_data;
}
voidIo_Clr2(ucharpin)
{
unsignedintio_data=1;
io_data=io_data<FIO2CLR=io_data;
}
voidOUT_DATA(unsignedchardata)
{
FIO2CLR=0x000000ff;
FIO2SET=data;
}
voiddelay(unsignedinti)
{
unsignedintk=1000;
i=i+2;
while(i>0)
{
i--;
}
while(k>1)k--;
}
voidLCD_WR_DATA_BYTE(ucharDataH,ucharDataL)
{
Io_Set(RS);
Io_Set(ALE);
OUT_DATA(DataL);
Io_Clr(ALE);
delay(3);
OUT_DATA(DataH);
Io_Clr(WR);
Io_Set(WR);
}
voidLCD_WR_DATA(uintval)
{
Io_Set(RS);
Io_Set(ALE);
delay(3);
OUT_DATA(val);
Io_Clr(ALE);
delay(3);
OUT_DATA(val>>8);
Io_Clr(WR);
Io_Set(WR);
}
voidLCD_WR_COM(uintcom)
{
Io_Clr(RS);
Io_Set(ALE);
delay(3);
OUT_DATA(com);
Io_Clr(ALE);
delay(3);
OUT_DATA(com>>8);
Io_Clr(WR);
Io_Set(WR);
}
voidLCD_WR_COM_DATA(intcom1,intdat1)
{
LCD_WR_COM(com1);
LCD_WR_DATA(dat1);
}
voidLCD_SET_LOCATION(uinti,uintj)
{
LCD_WR_COM_DATA(0x0020,0);
LCD_WR_COM_DATA(0x0021,0);
LCD_WR_COM(0x0022);
}
voidLCD_CLEAR(ucharx,uinty,ucharlen,uintwid)
{
ulongn,temp;
LCD_WR_COM_DATA(0x0020,0);
LCD_WR_COM_DATA(0x0021,0);
LCD_WR_COM(0x0022);
temp=(ulong)len*wid;
for(n=0;n}
voidLCD_ShowChar(ucharx,uinty,ucharnum)
{
#defineMAX_CHAR_POSX932//234
#defineMAX_CHAR_POSY1232//308
uchartemp;
ucharpos,t;
if(x>MAX_CHAR_POSX||y>MAX_CHAR_POSY)return;
LCD_WR_COM_DATA(0x0020,x);
LCD_WR_COM_DATA(0x0021,y);
LCD_WR_COM_DATA(0x0050,x);//HorizontalGRAMStartAddress
LCD_WR_COM_DATA(0x0052,y);//VerticalGRAMStartAddress
LCD_WR_COM_DATA(0x0051,x+5);//HorizontalGRAMEndAddressLCD_WR_COM_DATA(0x0053,y+11);//VerticalGRAMendAddress
LCD_WR_COM(0x0022)
num=num-'';
for(pos=0;pos<12;pos++)
{
temp=asc2[num][12-pos];
for(t=0;t<6;t++)
{
if(temp&0x01)LCD_WR_DATA(POINT_COLOR);
elseLCD_WR_DATA(0xffff);
temp>>=1;
}
}
LCD_WR_COM_DATA(0x0050,0x0000);//HorizontalGRAMStartAddress
LCD_WR_COM_DATA(0x0051,0x00EF);//HorizontalGRAMEndAddress
LCD_WR_COM_DATA(0x0052,0x0000);//VerticalGRAMStartAddress
LCD_WR_COM_DATA(0x0053,0x013F);//VerticalGRAMStartAddress
}
voidLCD_ShowString(ucharx,uinty,constuchar*p)
{
while(*p!
='\0')
{
if(x>MAX_CHAR_POSX){x=0;y+=12;}
if(y>MAX_CHAR_POSY){y=x=0;LCD_CLEAR(0,0,240,320);}
LCD_ShowChar(x,y,*p);
x+=6;
p++;
}
}
voidLCD_ShowBmp(ucharx,uinty,ucharlenth,uintwide,constuchar*p)
{
ulongsize,temp;
temp=wide*2;
LCD_SET_LOCATION(0,0);
temp=(ulong)temp*lenth;
for(size=0;sizevoidinit_port(void)
{PINSEL10=0;
IODIR0=0x000003c0;
IOSET0=0x000003c0;
FIO2DIR=0x000000ff;
FIO2MASK=0x00000000;
FIO2SET=0x000000ff;}
uintGetAD0(void)
{uintval;
uintt;
AD0CR=0x01000001|0x002E0400;
do{val=AD0GDR;
}while((val&0x80000000)==0);
AD0CR&=~0x01000001;
val=(val>>6)&0x03FF;
t=Get_Temp(val);
returnt;}
主程序代码:
intmain()
{
intZYJ;
intx;
charcode[30];
inti;
intj;
init_port();
PCONP|=(1<<12);
PINSEL0=0;
PINSEL1=0x00004000;
LCD_Init();
LCD_CLEAR(0,0,240,320);
while
(1)
{DDD=(int)GetAD0();
memset(code,0,sizeof(code));
sprintf(code,"TheTemperatureis%d",DDD);
POINT_COLOR=0x07E0;
LCD_ShowString(60,300,code);
LCD_ShowString(70,250,"090213032013302268");
for(i=0;i<240;++i)
{
LCD_ShowString(i,100,"-");
}
POINT_COLOR=0X001F;
LCD_ShowString(x,50+(ZYJ-25)*150/10,"#");
x++;
if(x>=240)
{
x=10;
LCD_CLEAR(0,0,240,250);
}
}
}
3、实验目的
(1)了解热敏电阻与温度的对应关系,熟悉温度采样硬件电路
(2)熟悉AD的结构,掌握AD寄存器的使用方法;
(3)掌握正确配置引脚的方法,实现指定功能;
(4)熟悉串口的机制,掌握串口寄存器的使用方法;
(5)实现温度采样,并将采样结果通过串口上传至PC端。
(6)实现温度数值在LCD上的显示
4、实验结果分析
实验结果就是在LCD屏上显示出学号、当前温度和温度随时间变化的坐标系和函数
5、总结
通过这次实验我加强了对ARM课本知识的了解,又助于今后ARM的学习,同时让我加强了编程能力,有助于我今后的学习。
通过这次实验我认识了自己的不足之处,同时也是要改进的地方,以便能精进自己的技能,加强自己的动手能力。