基于ARM芯片s3c2410的简易测温系统设计.docx
《基于ARM芯片s3c2410的简易测温系统设计.docx》由会员分享,可在线阅读,更多相关《基于ARM芯片s3c2410的简易测温系统设计.docx(16页珍藏版)》请在冰豆网上搜索。
![基于ARM芯片s3c2410的简易测温系统设计.docx](https://file1.bdocx.com/fileroot1/2023-2/9/9ed52ca6-0d87-4bdb-aacd-ea707e3eecc7/9ed52ca6-0d87-4bdb-aacd-ea707e3eecc71.gif)
基于ARM芯片s3c2410的简易测温系统设计
本系统利用DS18B20进行测温,基于s3c2410开发板进行温度控制,具有硬件电路简单,控温精度高、功能强,体积小,简单灵活等优点,可以应用于控制温度在-55℃到+125℃之间的各种场合,可以实现温度的实时采集、显示功能。
温度是一种最基本的环境参数之一,日常生活和工农业生产中经常要检测温度。
传统的方式是采用热电偶或热电阻,但是由于模拟温度传感器输出为模拟信号,必须经过A/D转换环节获得数字信号后才能与s3c2410开发板等微处理器接口,使得硬件电路结果复杂,制作成本较高。
美国DALLAS公司生产的DS18B20为代表的新型单总线数字式温度传感器以其突出优点广泛使用于仓库管理、工农业生产制造、气象观测、科学研究以及日常生活中。
本文提出用DALLAS公司生产的DS18B20数字温度传感器和89S52s3c2410开发板构成的多路测温系统,采用单总线的方式(一根数据线,在一个I/O口上),可以在单总线上挂接多个18B20,在s3c2410开发板控制下巡回检测多点温度,并可以设置高、低温度超限报警等功能
实习内容:
本次校内实习我们会用到的主要器件是51s3c2410开发板和DS18B20温度传感器以及数码管,主要就是通过温度传感器的检测,把实际测得的温度值转换成二进制,再传回s3c2410开发板处理,然后通过数码管显示出温度值。
Ds18b20
1》概述:
DS18b20是一款支持“一线总线”接口的数字化温度传感器,它通过一个单线接口发送或者接受信息,用于读写和温度转换的电源可以从数据线本身获得,无需外部电源。
DS18B20有三只引脚,VCC,DQ,和VDD
DS18B20的温度操作是使用16位,也就是说分辨率是0.0625
2》开发板访问DS18B20:
DS18B20一般都是充当从机的角色,而开发板就是主机。
开发板通过一线总线访问DS18B20需要经过以下几个步骤:
1.DS18B20复位。
2.执行ROM指令。
3.执行DS18B20功能指令(RAM指令)。
DS18B20复位
DS18B20的复位时序如下:
1.单片机拉低总线480us~950us,然后释放总线(拉高电平)。
2.这时DS18B20会拉低信号,大约60~240us表示应答。
3.DS18B20拉低电平的60~240us之间,单片机读取总线的电平,如果是低电平,那么表示复位成功。
4.DS18B20拉低电平60~240us之后,会释放总线。
74ls164
器件功能作用
8位串入,并出移位寄存器
概述
74ls164、74lsT164是高速硅门CMOS器件,与低功耗肖特基型TTL(LSTTL)器件的引脚兼容。
74HC164、74HCT164是8位边沿触发式移位寄存器,串行输入数据,然后并行输出。
数据通过两个输入端(DSA或DSB)之一串行输入;任一输入端可以用作高电平使能端,控制另一输入端的数据输入。
两个输入端或者连接在一起,或者把不用的输入端接高电平,一定不要悬空。
时钟(CP)每次由低变高时,数据右移一位,输入到Q0,Q0是两个数据输入端(DSA和DSB)的逻辑与,它将上升时钟沿之前保持一个建立时间的长度。
主复位(MR)输入端上的一个低电平将使其它所有输入端都无效,同时非同步地清除寄存器,强制所有的输出为低电平。
功能图
应用程序
#include
#include
#include
#include
#include
#include
#include
intmain(void)
{
intfd,tempa;
unsignedcharbuf[2];
unsignedchartempH,tempL;
fd=open("/dev/ds18b20",O_RDWR);
if(fd<0){
perror("opendevice/dev/ds18b20");
exit
(1);
}
while
(1)
{
read(fd,buf,2);
tempH=buf[1];
tempL=buf[0];
if(tempH&0xfc)
{
tempa=((tempH*256)+tempL);
tempa=((~tempa)+1);
tempa*=0.625;
}
else
{
tempa=((tempH*256)+tempL)*0.625;//温度转换,扩大100返回
}
驱动程序
#include//支持printk输出
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#defineDEVICE_NAME"ds18b20"
#defineds18b20_MAJOR231
staticchardevicecount=0;//计数器,防止被多个人多次打开
chartable[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
chartable1[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef};
unsignedchardata[2]={0};
unsignedcharflag=0;
/*************************************************************************************/
staticintds18b20_write(structfile*file,constchar__user*buffer,size_tcount,loff_t*ppos)
{
return0;
}
/****************************************************************/
staticintds18b20_open(structinode*inode,structfile*file)
{
if(devicecount>0)return-ERESTARTSYS;
printk("deviceopen:
success\n");
devicecount++;
return0;
}
staticintds18b20_release(structinode*inode,structfile*filp)
{
devicecount--;
printk("devicerelease\n");
return0;
}
staticvoidInit_DS18B20(void)
{
s3c2410_gpio_cfgpin(S3C2410_GPE7,S3C2410_GPE7_OUTP);
s3c2410_gpio_setpin(S3C2410_GPE7,0);
udelay(700);
s3c2410_gpio_cfgpin(S3C2410_GPE7,S3C2410_GPE7_INP);
udelay(60);
udelay(200);
}
staticcharRead_bit(void)
{
unsignedcharb;
s3c2410_gpio_cfgpin(S3C2410_GPE7,S3C2410_GPE7_OUTP);
s3c2410_gpio_setpin(S3C2410_GPE7,0);
udelay(8);
s3c2410_gpio_cfgpin(S3C2410_GPE7,S3C2410_GPE7_INP);
udelay(10);
//b=(s3c2410_gpio_getpin(S3C2410_GPE7)>>7);duiying
b=s3c2410_gpio_getpin(S3C2410_GPE7);
udelay(40);
returnb;
}
unsignedcharReadOneChar(void)
{
unsignedchari,j,dat=0;
for(i=0;i<8;i++)
{
j=Read_bit();
dat=j|(dat>>1);
//dat=(j<<7)|(dat>>1);duiying
}
returndat;
}
voidWriteOneChar(unsignedchardat)
{
unsignedinti;
unsignedchara;
for(i=0;i<8;i++)
{
s3c2410_gpio_cfgpin(S3C2410_GPE7,S3C2410_GPE7_OUTP);
a=dat&0x01;
dat=dat>>1;
if(a==1)
{
s3c2410_gpio_setpin(S3C2410_GPE7,0);
udelay(14);
s3c2410_gpio_setpin(S3C2410_GPE7,1);
udelay(50);
s3c2410_gpio_cfgpin(S3C2410_GPE7,S3C2410_GPE7_INP);
udelay(60);
}
else
{
s3c2410_gpio_setpin(S3C2410_GPE7,0);
udelay(60);
s3c2410_gpio_cfgpin(S3C2410_GPE7,S3C2410_GPE7_INP);
udelay(60);
}
}
}
staticunsignedshortReadTemperature(void)
{
unsignedshorttempa;
Init_DS18B20();
udelay(200);
WriteOneChar(0xcc);
WriteOneChar(0x44);
udelay(5);
Init_DS18B20();
udelay(200);
WriteOneChar(0xcc);
WriteOneChar(0xbe);
data[0]=ReadOneChar();
data[1]=ReadOneChar();
if(data[1]&0xf0)
flag=1;
else
flag=0;
tempa=data[1];
tempa=tempa<<8;
tempa=tempa|data[0];
//printk("tempa=%d\n",tempa);
returntempa;
}
voiddeat(chardat)
{
inti;
for(i=0;i<8;i++)
{
s3c2410_gpio_setpin(S3C2410_GPE9,0);
s3c2410_gpio_setpin(S3C2410_GPE8,dat&0x01);
s3c2410_gpio_setpin(S3C2410_GPE9,1);
dat>>=1;
}
mdelay(4);
}
voiddisplay(intnum)
{
intd,s,g;
s=num/100;
g=num/10%10;
d=num%10;
if(flag==0)
{
s3c2410_gpio_setpin(S3C2410_GPH1,1);
s3c2410_gpio_setpin(S3C2410_GPG0,1);
s3c2410_gpio_setpin(S3C2410_GPE6,1);
s3c2410_gpio_setpin(S3C2410_GPH0,0);
deat(0);
udelay
(2);
s3c2410_gpio_setpin(S3C2410_GPH0,1);
s3c2410_gpio_setpin(S3C2410_GPG0,1);
s3c2410_gpio_setpin(S3C2410_GPE6,1);
s3c2410_gpio_setpin(S3C2410_GPH1,0);
deat(table[s]);
udelay
(2);
s3c2410_gpio_setpin(S3C2410_GPH0,1);
s3c2410_gpio_setpin(S3C2410_GPH1,1);
s3c2410_gpio_setpin(S3C2410_GPE6,1);
s3c2410_gpio_setpin(S3C2410_GPG0,0);
deat(table1[g]);
udelay
(2);
s3c2410_gpio_setpin(S3C2410_GPH0,1);
s3c2410_gpio_setpin(S3C2410_GPH1,1);
s3c2410_gpio_setpin(S3C2410_GPG0,1);
s3c2410_gpio_setpin(S3C2410_GPE6,0);
deat(table[d]);
udelay
(2);
}
else
{
s3c2410_gpio_setpin(S3C2410_GPH1,1);
s3c2410_gpio_setpin(S3C2410_GPG0,1);
s3c2410_gpio_setpin(S3C2410_GPE6,1);
s3c2410_gpio_setpin(S3C2410_GPH0,0);
deat(0);
udelay
(2);
s3c2410_gpio_setpin(S3C2410_GPH0,1);
s3c2410_gpio_setpin(S3C2410_GPG0,1);
s3c2410_gpio_setpin(S3C2410_GPE6,1);
s3c2410_gpio_setpin(S3C2410_GPH1,0);
deat(table[s]);
udelay
(2);
s3c2410_gpio_setpin(S3C2410_GPH0,1);
s3c2410_gpio_setpin(S3C2410_GPH1,1);
s3c2410_gpio_setpin(S3C2410_GPE6,1);
s3c2410_gpio_setpin(S3C2410_GPG0,0);
deat(table1[g]);
udelay
(2);
s3c2410_gpio_setpin(S3C2410_GPH0,1);
s3c2410_gpio_setpin(S3C2410_GPH1,1);
s3c2410_gpio_setpin(S3C2410_GPG0,1);
s3c2410_gpio_setpin(S3C2410_GPE6,0);
deat(table[d]);
udelay
(2);
}
}
/******************************************************************/
staticintds18b20_ioctl(structinode*inode,structfile*file,unsignedintcmd,unsignedlongarg)
{
inti;
unsignedinta;
if((cmd>=300)&(cmd<1000))
{
s3c2410_gpio_setpin(S3C2410_GPE10,0);
}
if(cmd<300)
{
s3c2410_gpio_setpin(S3C2410_GPE10,1);
}
for(i=0;i<100;i++)
{
if(cmd>1000)
{
display(234);
//s3c2410_gpio_setpin(S3C2410_GPE10,1);
}
else
display(cmd);
}
return0;
}
/*************************************************************************************/
staticintds18b20_read(structfile*filp,char__user*buffer,size_tcount,loff_t*ppos)
{
unsignedshorttempa;
tempa=ReadTemperature();
buffer[0]=data[0];
buffer[1]=data[1];
returntempa;
}
/*************************************************************************************/
staticstructfile_operationsds18b20_fops={//file_operations结构体
.owner=THIS_MODULE,
.ioctl=ds18b20_ioctl,
.write=ds18b20_write,
.read=ds18b20_read,
.open=ds18b20_open,
.release=ds18b20_release,
};
staticint__initds18b20_init(void)
{
intret;
ret=register_chrdev(ds18b20_MAJOR,DEVICE_NAME,&ds18b20_fops);//注册设备号
if(ret<0){
printk(DEVICE_NAME"can'tregistermajornumber\n");
returnret;
}
printk(DEVICE_NAME"initialized\n");
s3c2410_gpio_cfgpin(S3C2410_GPH0,S3C2410_GPH0_OUTP);
s3c2410_gpio_cfgpin(S3C2410_GPH1,S3C2410_GPH1_OUTP);
s3c2410_gpio_cfgpin(S3C2410_GPG0,S3C2410_GPG0_OUTP);
s3c2410_gpio_cfgpin(S3C2410_GPE6,S3C2410_GPE6_OUTP);
s3c2410_gpio_cfgpin(S3C2410_GPE7,S3C2410_GPE7_OUTP);
s3c2410_gpio_cfgpin(S3C2410_GPE8,S3C2410_GPE8_OUTP);
s3c2410_gpio_cfgpin(S3C2410_GPE9,S3C2410_GPE9_OUTP);
s3c2410_gpio_cfgpin(S3C2410_GPE10,S3C2410_GPE10_OUTP);
s3c2410_gpio_setpin(S3C2410_GPE10,1);
return0;
}
staticvoid__exitds18b20_exit(void)
{
unregister_chrdev(ds18b20_MAJOR,DEVICE_NAME);//注销设备号
}
module_init(ds18b20_init);//加载驱动函数
module_exit(ds18b20_exit);//卸载驱动函数
MODULE_AUTHOR("AF");//作者
MODULE_DESCRIPTION("AsimpleHelloWorldMoudle");//描述
MODULE_ALIAS("asimplemodule");
MODULE_LICENSE("DualBSD/GPL");//许可证
总结: