運(yùn)行環(huán)境 Fedora9.0
交叉編譯 arm-linux-gcc-4.3.2
今天在各位前輩已有成就的基礎(chǔ)上花了兩天時(shí)間終于把這個(gè)驅(qū)動(dòng)給搞定了,從開(kāi)始編譯成模塊看效果,進(jìn)行調(diào)試,再到編譯進(jìn)內(nèi)核,最后又編譯了一個(gè)界面出來(lái),雖說(shuō)大多數(shù)的程序代碼是用各位前輩的成果,但坐下來(lái)自己收獲也不小,現(xiàn)在寫(xiě)下來(lái),以供以后參考,也和各位愛(ài)好者交流一下,呵呵!
一.編譯成模塊
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define DEVICE_NAME
"DS18B20"
#define DS18B20_MAJOR 250
#define DS_PIN
S3C2410_GPB1
#define OUT S3C2410_GPB1_OUTP
#define IN
S3C2410_GPB1_INP
#define DIS_UP 1
#define EN_UP 0
//#define
Search 0x00F0
#define Read_ROM 0x0033 //just for one
#define Skip_ROM
0x00CC //ds18b20的固定時(shí)序, 跳過(guò)讀序號(hào)列號(hào)的操作
#define Convert 0x0044
//ds18b20的固定時(shí)序,管腳識(shí)別到該信號(hào)是開(kāi)始對(duì)測(cè)到的溫度進(jìn)行轉(zhuǎn)換
#define Write 0x004E
//TH---TL---Config
#define Read 0x00BE //讀取溫度寄存器等(共可讀9個(gè)寄存器)
前兩個(gè)就是溫度
//#define bit_9 0x001F
//#define bit_10 0x003F
//#define
bit_11 0x005F
#define bit_12 0x007F
#define uint16 unsigned
int
//unsigned int ROM_DATA[8];
void usdelay(unsigned int i)
{
unsigned int
j;
for(i=i;i>0;i--)
for(j=90;j>0;j--);
}
void
msdelay(unsigned int i) //延時(shí) i ms
{
for(i=i;i>0;i--)
usdelay(1000);
}
void
SetL(void)
{
s3c2410_gpio_cfgpin(DS_PIN,OUT);
s3c2410_gpio_setpin(DS_PIN,0);
}
void
SetH(void)
{
s3c2410_gpio_cfgpin(DS_PIN,OUT);
s3c2410_gpio_setpin(DS_PIN,1);
}
unsigned
int Read_DS(void)
{
unsigned int
i;
s3c2410_gpio_cfgpin(DS_PIN,IN);
s3c2410_gpio_pullup(DS_PIN,EN_UP);
__asm("nop");
__asm("nop");
__asm("nop");
i=s3c2410_gpio_getpin(DS_PIN);
if(i!=0)
i=1;
return i;
}
unsigned int ds_start(void)
//初始化ds18b20
{
unsigned int flag=1;
int
err=0;
SetH();
udelay(2);
SetL();
udelay(600);
//560延時(shí)要大于480u
SetH();
udelay(60); //稍作延時(shí)
while(Read_DS()!=0)
//ds18B20初始化成功會(huì)返回一個(gè)低電平,此時(shí)跳出循環(huán),執(zhí)行下面的操作
{
printk(DEVICE_NAME
"Wait....\n");
udelay(5);
err++;
//初始化的最多次數(shù)吧,超過(guò)規(guī)定的次數(shù),說(shuō)明初始化失敗
if(err==20)
{
printk(DEVICE_NAME
"start fail\n");
return -1;
}
}
//printk(DEVICE_NAME
"start
sucess\n");
flag=0;
SetH();//初始化成功后賦為高電平準(zhǔn)備從外界讀入溫度
udelay(400);
return
flag;
}
void ds_send(unsigned int uidata)
//向18b20寫(xiě)入一個(gè)字節(jié)的數(shù)據(jù)
{
//printk("the send data is %d\n",uidata);
int
i;
for(i=0;i<8;i++)
{
SetL();
udelay(1);
if((uidata&1)!=0)
{
SetH();
udelay(80);
//等待18b20進(jìn)行數(shù)據(jù)采集
}
else
{
udelay(80);
//等待18b20進(jìn)行數(shù)據(jù)采集
SetH();
}
uidata>>=1;
}
}
unsigned int ds_read(void)
//從18b20讀一個(gè)字節(jié)的數(shù)據(jù)
{
unsigned int uidata=0;unsigned int
i;
for(i=0;i<8;i++)
{
uidata>>=1;
SetL();
udelay(1);
s3c2410_gpio_setpin(DS_PIN,1);
s3c2410_gpio_cfgpin(DS_PIN,IN);
udelay(10);
if(s3c2410_gpio_getpin(DS_PIN))
uidata=(uidata|0x80);
udelay(65);
SetH();
}
// printk("ds_read
success\n");
return uidata;
}
unsigned int
read_tem(void)
{
unsigned int th,tl;
//int
err=0;
//ds_init(100,0,bit_12);
th=tl=0;
ds_start();
ds_send(Skip_ROM);
//跳過(guò)讀序號(hào)列號(hào)的操作
ds_send(Convert);
//啟動(dòng)溫度轉(zhuǎn)換
mdelay(50);
ds_start();
ds_send(Skip_ROM);
//跳過(guò)讀序號(hào)列號(hào)的操作
ds_send(Read);
//準(zhǔn)備讀溫度
tl=ds_read();
th=ds_read();
th<<=8;
//溫度在低兩個(gè)字節(jié)中
//printk("the tl data is %d\n",tl);
tl|=th;
//獲取溫度
//printk("the th data is %d\n",th);
//printk("the tl2 data is
%d\n",tl);
//printk("read_tmp success\n");
return
tl;
}
static int ds18b20_ioctl(
struct inode
*inode,
struct file *file,
unsigned int cmd,unsigned long
arg)
{
return 0;
}
static ssize_t ds18b20_read(struct file
*pFile, uint16 __user *pData, size_t count, loff_t *off )
{
uint16
tmp,ret;
tmp =read_tem();
// printk("the tmpk data is
%d\n",tmp);
ret=copy_to_user(pData, &tmp, sizeof(tmp));
//將讀取得的DS18B20數(shù)值復(fù)制到用戶(hù)區(qū)
if(ret>0)
{
printk("copy data
failed\n");
return -1;
}
//else
// printk("copy data
succese\n");
return 0;
}
static struct file_operations
ds18b20_fops = {
.owner = THIS_MODULE,
.ioctl =
ds18b20_ioctl,
.read = ds18b20_read,
};
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;
}
s3c2410_gpio_cfgpin(DS_PIN,
OUT);
s3c2410_gpio_setpin(DS_PIN, 1);
printk(DEVICE_NAME "
initialized\n");
return 0;
}
static void __exit
ds18b20_exit(void)
{
unregister_chrdev(DS18B20_MAJOR,
DEVICE_NAME);
printk(DEVICE_NAME "
rmmodule\n");
}
module_init(ds18b20_init);
module_exit(ds18b20_exit);
MODULE_AUTHOR("benjamin_xc@163.com");
// 驅(qū)動(dòng)程序的作者
MODULE_DESCRIPTION("DS18B20 Driver"); //
一些描述信息
MODULE_LICENSE("GPL");
下面是將驅(qū)動(dòng)編譯成模塊的過(guò)程:
1.將編寫(xiě)好的驅(qū)動(dòng)代碼copy或move到你的內(nèi)核驅(qū)動(dòng)代碼中,比如我的是FriendlyARM/mini2440/linux2.6.29/drivers/char
2.編輯char目錄下的Makefile文件,添加如下obj-m += 18b20.o 注意此處紅色的部分要和你自己建的程序代碼的文件名保持一致。
3.退到Linux根目錄下,我的就是linux2.6.29,輸入命令make modules。
如果沒(méi)有錯(cuò)誤,在char目錄下就會(huì)看到編譯后的18b20.ko的模塊文件。
使用ftp或是串口將編譯好的模塊文件下載到開(kāi)發(fā)板上
接下來(lái)就是加載設(shè)備驅(qū)動(dòng)程序模塊了
1.創(chuàng)建設(shè)備驅(qū)動(dòng)程序的進(jìn)入點(diǎn)mknod /dev/DS18B20 c 250 0 此處的主設(shè)備號(hào)要和你在程序中設(shè)定的一樣,創(chuàng)建的設(shè)備接口文件要和測(cè)試程序中的保持一致啊!
2.加載驅(qū)動(dòng)程序 insmod 18b20.ko
如果上面的步驟沒(méi)出差錯(cuò),就說(shuō)明驅(qū)動(dòng)方法這塊是搞定的了。
此處說(shuō)下和本驅(qū)動(dòng)沒(méi)直接聯(lián)系的話,各位別嫌我啰嗦啊,因?yàn)槲易龅臅r(shí)候碰到了,還郁悶了好幾天的。想必有些朋友在將內(nèi)核編譯成模塊后,在加載是沒(méi)有什么錯(cuò)誤,用lsmod命令來(lái)看,自己的模塊也確實(shí)是加載進(jìn)去了,但是在用rmmod進(jìn)行卸載時(shí),卻出現(xiàn)提示說(shuō),找不到需要卸載的文件,因此在這個(gè)問(wèn)題解決之前,每次加載后,想要卸載都要重新啟動(dòng)開(kāi)發(fā)板,麻煩呀,后來(lái)終于在一個(gè)論壇里看到了解決方法,在/lib/modules/下建立Linux2.6.29.4-FriendlyARM文件夾,然后把想加載的模塊放到這個(gè)文件中,這個(gè)問(wèn)題就解決了,具體原因自己也不知道,能用就OK了吧,呵呵,感謝各位前輩的努力啊!
下面是測(cè)試代碼(這是完全從網(wǎng)上搜的哦,再次感謝各位大哥)
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define K
0.0625
int main(void)
{
int fd = -1;
char count =
5;
unsigned int tmp = 0;float res=0;
fd = open("/dev/DS18B20",
0);
if(fd < 0)
{
perror("Can't open
/dev/DS18B20 \n");
exit(1);
}
printf("open
ds18b20 success \n");
while(1){
read(fd, &tmp ,
sizeof(tmp));
res=tmp*K;
//printf("the currently data is
%d\n",tmp);
printf("the currently temperature is %f\n",res);
sleep(5);
}
close(fd);
return 0;
}
下面簡(jiǎn)單介紹一下ds18b20的東西吧:
具體可參考
大致有以下幾種形狀的
用的最多的當(dāng)然是最左邊的三針的,管腳少,操作也簡(jiǎn)單嘛。另外有一點(diǎn)注意,就是用的時(shí)候DQ(數(shù)據(jù)管腳)和VD之間要加一個(gè)4k—10k的電阻。
心情好,事情才能做得好!!
交叉編譯過(guò)之后或是用NFS或者下載到板子上都可以,沒(méi)什么差錯(cuò)的話就可以實(shí)現(xiàn)測(cè)溫了。
下面是運(yùn)行情況
以上是手離開(kāi)傳感器后溫度的變化情況。
下面簡(jiǎn)單介紹一下ds18b20的東西吧
1.DS18B20是Dallas公司生產(chǎn)的數(shù)字溫度傳感器,具有體積小、適用電壓寬、經(jīng)濟(jì)靈活的特點(diǎn)。它內(nèi)部使用了onboard專(zhuān)利技術(shù),全部傳感元件及轉(zhuǎn)換電路集成在一個(gè)形如三極管的集成電路內(nèi)。DS18B20有電源線、地線及數(shù)據(jù)線3根引腳線,工作電壓范圍為3~5.5 V,支持單總線接口。
DS18B20的結(jié)構(gòu)和工作原理
2.1DS18B20的內(nèi)外結(jié)構(gòu)
DS18B20的外部結(jié)構(gòu)如圖1所示。其中,VDD為電源輸入端,DQ為數(shù)字信號(hào)輸入/輸出端,GND為電源地。
DS18B20內(nèi)部結(jié)構(gòu)主要包括4部分:64位光刻ROM、溫度傳感器、非易失的溫度報(bào)警觸發(fā)器TH和TL、配置寄存器,如圖2所示。
64位ROM中,在產(chǎn)品出廠前就被廠家通過(guò)光刻刻錄好了64位序列號(hào)。該序列號(hào)可以看作是DS18B20的地址序列碼,用來(lái)區(qū)分每一個(gè)DS18B20,從而更好地實(shí)現(xiàn)對(duì)現(xiàn)場(chǎng)溫度的多點(diǎn)測(cè)量。
圖2中的暫存器是DS18B20中最重要的寄存器。暫存器由9個(gè)字節(jié)組成,各字節(jié)定義如表1所列。
配置寄存器用于用戶(hù)設(shè)置溫度傳感器的轉(zhuǎn)換精度,其各位定義如下:
TM位是測(cè)試模式位,用于設(shè)置DS18B20是工作模式(0)還是測(cè)試模式(1),其出廠值為0。R1、R0用于設(shè)置溫度傳感器的轉(zhuǎn)換精度:00,分辨率為9位,轉(zhuǎn)換時(shí)間為93.75ms;01,分辨率為10位,轉(zhuǎn)換時(shí)間為187.5 ms;10,分辨率為11位,轉(zhuǎn)換時(shí)間為375 ms;11,分辨為12位,轉(zhuǎn)換時(shí)間為750 ms。R1、R0的出廠值為11。其余5位值始終為1。
第0和第1字節(jié)為16位轉(zhuǎn)換后的溫度二進(jìn)制值,其中前4位為符號(hào)位,其余12位為轉(zhuǎn)換后的數(shù)據(jù)位(分辨率為12位)。如果溫度大于0,則前4位值為0,只要將測(cè)到的數(shù)值乘上0.062 5即可得到實(shí)際溫度值;如果溫度小于0,則前4位為1,需將測(cè)得的數(shù)值取反加1后,再乘上0.062 5。第0和第1字節(jié)各位的二進(jìn)制值如下:
3. DS18B20的應(yīng)用電路結(jié)構(gòu)
按DS18B20的供電方式,其應(yīng)用電路結(jié)構(gòu)可分為如下3種:寄生電源供電方式;寄生電源強(qiáng)上拉供電方式;外部電源供電方式。實(shí)際應(yīng)用中,以外部電源供電方式為主。其應(yīng)用原理圖如圖3所示。
4. DS18B20的工作原理
根據(jù)DS18B20的通信協(xié)議,MCU對(duì)其操作主要有如下3個(gè)步驟:讀寫(xiě)之前,對(duì)DS18B20發(fā)送約500 μs的低電平進(jìn)行復(fù)位;復(fù)位成功,發(fā)送ROM指令;發(fā)送RAM指令。MCU對(duì)DS18B20的具體操作流程如圖4所示。
5. 實(shí)物圖
6.具體電路
其中p1.7是指你自己選的管腳
二.編譯進(jìn)內(nèi)核
程序代碼和上面的沒(méi)有本質(zhì)的差別,就是多了一些,創(chuàng)建設(shè)備節(jié)點(diǎn)的函數(shù)
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define DS_PIN
S3C2410_GPB1
#define OUT S3C2410_GPB1_OUTP
#define IN
S3C2410_GPB1_INP
#define DIS_UP 1
#define EN_UP 0
//#define
Search 0x00F0
#define Read_ROM 0x0033 //just for one
#define Skip_ROM
0x00CC //ds18b20的固定時(shí)序,管腳識(shí)別到該信號(hào)時(shí)開(kāi)始從外界獲取溫度
#define Convert 0x0044
//ds18b20的固定時(shí)序,管腳識(shí)別到該信號(hào)是開(kāi)始對(duì)測(cè)到的溫度進(jìn)行轉(zhuǎn)換
#define Write 0x004E
//TH---TL---Config
#define Read 0x00BE
//#define bit_9
0x001F
//#define bit_10 0x003F
//#define bit_11 0x005F
#define
bit_12 0x007F
#define uint16 unsigned int
//unsigned int
ROM_DATA[8];
#define DEVICE_NAME "DS18B20"
#define DS18B20_MAJOR
0
static int device_major = DS18B20_MAJOR; //系統(tǒng)動(dòng)態(tài)生成的主設(shè)備號(hào)
void
usdelay(unsigned int i) //延時(shí) i us 對(duì)于不同系統(tǒng)可能會(huì)有所差別,請(qǐng)適當(dāng)修改
{
unsigned int
j;
for(i=i;i>0;i--)
for(j=90;j>0;j--);
}
void
msdelay(unsigned int i) //延時(shí) i ms
{
for(i=i;i>0;i--)
usdelay(1000);
}
void
SetL(void)
{
s3c2410_gpio_cfgpin(DS_PIN,OUT);
s3c2410_gpio_setpin(DS_PIN,0);
}
void
SetH(void)
{
s3c2410_gpio_cfgpin(DS_PIN,OUT);
s3c2410_gpio_setpin(DS_PIN,1);
}
unsigned
int Read_DS(void)
{
unsigned int
i;
s3c2410_gpio_cfgpin(DS_PIN,IN);
s3c2410_gpio_pullup(DS_PIN,EN_UP);
__asm("nop");
__asm("nop");
__asm("nop");
i=s3c2410_gpio_getpin(DS_PIN);
if(i!=0)
i=1;
return i;
}
unsigned int ds_start(void)
//初始化ds18b20
{
unsigned int flag=1;
int
err=0;
SetH();
udelay(2);
SetL();
udelay(600);
//560延時(shí)要大于480u
SetH();
udelay(60); //稍作延時(shí)
while(Read_DS()!=0)
//ds18B20初始化成功會(huì)返回一個(gè)低電平,此時(shí)跳出循環(huán),執(zhí)行下面的操作
{
printk(DEVICE_NAME
"Wait....\n");
udelay(5);
err++; //??應(yīng)該是初始化的最多次數(shù)吧??
if(err==20)
{
printk(DEVICE_NAME "start fail\n");
return
-1;
}
}
//printk(DEVICE_NAME "start
sucess\n");
flag=0;
SetH();//初始化成功后賦為高電平準(zhǔn)備從外界讀入溫度
udelay(400);
return
flag;
}
void ds_send(unsigned int uidata)
{
//printk("the
send data is %d\n",uidata);
int i;
for(i=0;i<8;i++)
{
SetL();
udelay(1);
if((uidata&1)!=0)
{
SetH();
udelay(80);
}
else
{
udelay(80);
SetH();
}
uidata>>=1;
}
}
unsigned int
ds_read(void)
{
unsigned int uidata=0;unsigned int
i;
for(i=0;i<8;i++)
{
uidata>>=1;
SetL();
udelay(1); //2 3
s3c2410_gpio_setpin(DS_PIN,1);
s3c2410_gpio_cfgpin(DS_PIN,IN);
udelay(10); //1 2 3 4 5(e)
if(s3c2410_gpio_getpin(DS_PIN))
uidata=(uidata|0x80);
udelay(65);
SetH();
}
// printk("ds_read
success\n");
return uidata;
}
unsigned int
read_tem(void)
{
unsigned int th,tl;
//int
err=0;
//ds_init(100,0,bit_12);
th=tl=0;
ds_start();
ds_send(Skip_ROM);
ds_send(Convert);
mdelay(50);
ds_start();
ds_send(Skip_ROM);
ds_send(Read);
tl=ds_read();
th=ds_read();
th<<=8;
//printk("the
tl data is %d\n",tl);
tl|=th;
//printk("the th data is
%d\n",th);
//printk("the tl2 data is %d\n",tl);
//printk("read_tmp
success\n");
return tl;
}
static int
ds18b20_ioctl(
struct inode *inode,
struct file *file,
unsigned
int cmd,unsigned long arg)
{
return 0;
}
static ssize_t
ds18b20_read(struct file *pFile, uint16 __user *pData, size_t count, loff_t *off
)
{
uint16 tmp,ret;
tmp =read_tem();
//
printk("the tmpk data is %d\n",tmp);
ret=copy_to_user(pData, &tmp,
sizeof(tmp)); //將讀取得的DS18B20數(shù)值復(fù)制到用戶(hù)區(qū)
if(ret>0)
{
printk("copy data failed\n");
return -1;
}
//else
//
printk("copy data succese\n");
return 0;
}
static struct
file_operations ds18b20_fops = {
.owner = THIS_MODULE,
.ioctl =
ds18b20_ioctl,
.read = ds18b20_read,
};
static struct class
*tmp_class;//從此處開(kāi)始和上面的代碼有區(qū)別了啊
static int __init
ds18b20_init(void)
{
device_major = register_chrdev(DS18B20_MAJOR,
DEVICE_NAME, &ds18b20_fops);
if (device_major < 0)
{
printk(DEVICE_NAME " can't register major number\n");
return
-1;
}
tmp_class = class_create(THIS_MODULE,
DEVICE_NAME);
if(IS_ERR(tmp_class))
{
printk(DEVICE_NAME "
register class falid!\n");
return -1;
}
//創(chuàng)建一個(gè)設(shè)備節(jié)點(diǎn),設(shè)備名為tmp_NAME,即:my2440_tmp
device_create(tmp_class, NULL,
MKDEV(device_major, 0), NULL, DEVICE_NAME);
s3c2410_gpio_cfgpin(DS_PIN,
OUT);
s3c2410_gpio_setpin(DS_PIN, 1);
printk(DEVICE_NAME "
initialized\n");
return 0;
}
static void __exit
ds18b20_exit(void)
{
unregister_chrdev(DS18B20_MAJOR,
DEVICE_NAME);
//刪除設(shè)備節(jié)點(diǎn)
device_destroy(tmp_class,
MKDEV(device_major, 0));
//注銷(xiāo)設(shè)備類(lèi)
class_destroy(tmp_class);
printk(DEVICE_NAME "
rmmodule\n");
}
module_init(ds18b20_init);
module_exit(ds18b20_exit);
MODULE_AUTHOR("BINBIN");
// 驅(qū)動(dòng)程序的作者
MODULE_DESCRIPTION("DS18B20 Driver"); //
一些描述信息
MODULE_LICENSE("GPL");
將上面的驅(qū)動(dòng)程序保存為DS18B20.c,下面有解釋?zhuān)瑸槭裁匆4娉稍撁Q(chēng)
編譯方法
1. 將驅(qū)動(dòng)程序放到FriendlyARM/mini2440/linux2.6.29/drivers/char目錄下
2. 編譯char目錄里的Kconfig文件添加如下內(nèi)容
config MY2440_TMP //在Makefile中用
tristate "My2440 TMP Device"
depends on ARCH_S3C2440
default y
---help---
My2440 TMP
3. 編譯char目錄下的Makefile文件 添加如下內(nèi)容
obj-$(CONFIG_MY2440_TMP) += DS18B20.o //這里就體現(xiàn)出了上面將驅(qū)動(dòng)保存成DS18B20.c的原因了吧
4. 編譯內(nèi)核,在Linux2.6.29目錄下執(zhí)行命令:make zImage
然后將內(nèi)核燒錄到板子里,直接運(yùn)行測(cè)試程序就可以看到和上面用加載模塊方法一樣的效果了。
三.編寫(xiě)界面
1.最終效果
運(yùn)行時(shí),會(huì)將測(cè)到的溫度顯示在上面的框中,轉(zhuǎn)換的次數(shù)會(huì)顯示在下面的框中。有程序可知按下Start按鈕,可以轉(zhuǎn)換20次,再按下會(huì)繼續(xù)測(cè)。
運(yùn)行環(huán)境 按照友善之臂的手冊(cè),安裝好Qtopia-2.2.0
1.編寫(xiě).ui文件
打開(kāi)Qtopia2.2.0編譯出入上界面,窗體名字是:TMPBaseForm,因?yàn)橄旅娴某绦蛞玫竭@個(gè)基類(lèi),如果要改名字請(qǐng)保證后面程序中用相同的名字
2.編寫(xiě)tmp.h文件
#ifndef MYHELLOFORM_H
#define
MYHELLOFORM_H
#include "tmp_base.h"
#include
class
MyTMPForm : public TMPBaseForm
{
Q_OBJECT
public:
MyTMPForm( QWidget* parent = 0, const char* name = 0, WFlags
fl = 0 );
virtual ~MyTMPForm();
//const QPixmap *eddy;
int
fd;
private slots:
void startTMP();
void stopTMP();
};
#endif // MYHELLOFORM_H
3.編寫(xiě)tmp.cpp文件
#include "tmp.h"
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define K
0.0625;
MyTMPForm::MyTMPForm( QWidget* parent, const char* name, WFlags
fl)
:TMPBaseForm(parent, name, fl)
{
fd=0;
connect(PushButton1,SIGNAL(clicked()),this,SLOT(startTMP()));
connect(PushButton2,SIGNAL(clicked()),this,SLOT(stopTMP()));
}
MyTMPForm::~MyTMPForm()
{
::close(fd);
}
void
MyTMPForm::startTMP()
{
//TextLabel1->setText("System Led is
Started");
fd = ::open("/dev/DS18B20",
0);
if (fd < 0)
{
::exit(1);
}
for(int
num=0;num<20;num++)
{
unsigned int tmp =
0;
float res=0;
read(fd, &tmp ,
sizeof(tmp));
res=tmp*K;
LCDNumber1->display(res);
sleep(3);
LCDNumber2->display(num);
}
::close(fd);
}
void
MyTMPForm::stopTMP()
{
::close(fd);
}
4.編寫(xiě)main.cpp
#include "tmp.h"
#include
QTOPIA_ADD_APPLICATION("tmp",MyTMPForm)
QTOPIA_MAIN
5.編寫(xiě)tmp.desktop
[Desktop Entry]
Comment=An Example
Program
Exec=tmp
Icon=alarmbell
Type=gaof
Name=TMP
6.編寫(xiě)tmp.pro文件
CONFIG += qtopiaapp
CONFIG -=
buildQuicklaunch
HEADERS = tmp.h
SOURCES =
tmp.cpp
SOURCES+=main.cpp
INTERFACES = tmp_base.ui
desktop.files =
tmp.desktop
desktop.path = /apps/gaof
INSTALLS += desktop
TARGET =
tmp
7.編寫(xiě)build
#!/bin/bash
source /opt/FriendlyARM/mini2440/arm-qtopia/qtopia-2.2.0-FriendlyARM/setQpeEnv
qmake -spec /opt/FriendlyARM/mini2440/arm-qtopia/qtopia-2.2.0-FriendlyARM/qtopia/mkspecs/qws/linux-arm-g++ -o Makefile *.pro
make clean
make
以上都做好后執(zhí)行./bulid
將生成的tmp可執(zhí)行文件下載到板子上,并將其移到/opt/Qtopia/bin/目錄下
將tmp.desktop下載到板子上,并移動(dòng)到/opt/Qtopia/apps/gaof/目錄下 此處的gaof是我建立的各人可能不同,自己更改
重啟板子就會(huì)看到和開(kāi)始介紹的一樣的界面效果了。
聯(lián)系人:陳威
手 機(jī):18898570612
郵 箱:haodu@haodukeji-rtd.com
公 司:PT100/PT1000溫度傳感器/溫度變送器/壓力變送器__深圳市浩渡科技有限公司
地 址:深圳市龍崗區(qū)新生社區(qū)旗勝達(dá)高新科技園B棟三層