基于ARM芯片s3c2410的简易测温系统设计
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
基于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 <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/ioctl.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
int main(void)
{
int fd,tempa;
unsigned char buf[2];
unsigned char tempH,tempL;
fd = open("/dev/ds18b20",O_RDWR);
if (fd < 0) {
perror("open device /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 <linux/module.h> //支持printk输出
#include <linux/kernel.h>
#include <linux/fs.h>
#include <linux/init.h>
#include <linux/miscdevice.h>
#include <linux/delay.h>
#include <asm/arch-s3c2410/regs-gpio.h>
#include <asm/hardware.h>
#include<asm/irq.h>
#include<linux/irq.h>
#include<linux/interrupt.h>
#define DEVICE_NAME "ds18b20"
#define ds18b20_MAJOR 231
static char devicecount=0; //计数器,防止被多个人多次打开
char table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
char table1[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef};
unsigned char data[2]={0};
unsigned char flag=0;
/******************************************************************** *****************/
static int ds18b20_write(struct file *file, const char __user *buffer, size_t count, loff_t * ppos)
{
return 0;
}
/****************************************************************/ static int ds18b20_open(struct inode *inode,struct file *file)
{
if(devicecount >0) return -ERESTARTSYS;
printk("device open : success\n");
devicecount++;
return 0;
}
static int ds18b20_release(struct inode *inode, struct file *filp)
{
devicecount--;
printk("device release\n");
return 0;
}
static void Init_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);
}
static char Read_bit(void)
{
unsigned char b;
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);
return b;
}
unsigned char ReadOneChar(void)
{
unsigned char i,j,dat=0;
for(i=0;i<8;i++)
{
j=Read_bit();
dat=j|(dat>>1);
// dat=(j<<7)|(dat>>1); duiying
}
return dat;
}
void WriteOneChar(unsigned char dat)
{
unsigned int i;
unsigned char a;
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);
}
}
}
static unsigned short ReadTemperature(void)
{
unsigned short tempa;
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);
return tempa;
}
void deat(char dat)
{
int i;
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);
}
void display(int num)
{
int d,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);
}
}
/******************************************************************/ static int ds18b20_ioctl(struct inode *inode,struct file *file,unsigned int cmd,unsigned long arg)
{
int i;
unsigned int a;
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);
}
return 0;
}
/******************************************************************** *****************/
static int ds18b20_read(struct file *filp, char __user *buffer, size_t count, loff_t *ppos)
{
unsigned short tempa;
tempa=ReadTemperature();
buffer[0]=data[0];
buffer[1]=data[1];
return tempa;
}
/******************************************************************** *****************/
static struct file_operations ds18b20_fops = { //file_operations结构体
.owner = THIS_MODULE,
.ioctl = ds18b20_ioctl,
.write = ds18b20_write,
.read = ds18b20_read,
.open = ds18b20_open,
.release = ds18b20_release,
};
static int __init ds18b20_init(void)
{
int ret;
ret = register_chrdev(ds18b20_MAJOR, DEVICE_NAME, &ds18b20_fops); //注册设备号
if (ret < 0) {
printk(DEVICE_NAME " can't register major number\n");
return ret;
}
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);
return 0;
}
static void __exit ds18b20_exit(void)
{
unregister_chrdev(ds18b20_MAJOR, DEVICE_NAME); //注销设备号
}
module_init(ds18b20_init); //加载驱动函数
module_exit(ds18b20_exit); //卸载驱动函数
MODULE_AUTHOR("AF"); //作者
MODULE_DESCRIPTION("A simple Hello World Moudle"); //描述
MODULE_ALIAS("a simple module");
MODULE_LICENSE("Dual BSD/GPL"); //许可证总结:。