亚欧成人毛片一区二区三区四区-亚欧成人乱码一区二区-亚久久伊人精品青青草原2020-亚飞与亚基在线观看-国产综合成人观看在线-国产综合91天堂亚洲国产

技術(shù)文章

Linux下的ds18b20驅(qū)動(dòng)

運(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的東西吧:

具體可參考

大致有以下幾種形狀的

1.jpg

用的最多的當(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)行情況

2.jpg

以上是手離開(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為電源地。

3.jpg

DS18B20內(nèi)部結(jié)構(gòu)主要包括4部分:64位光刻ROM、溫度傳感器、非易失的溫度報(bào)警觸發(fā)器TH和TL、配置寄存器,如圖2所示。

4.jpg

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所列。

5.jpg

配置寄存器用于用戶(hù)設(shè)置溫度傳感器的轉(zhuǎn)換精度,其各位定義如下:

6.jpg

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)制值如下:

7.jpg

3. DS18B20的應(yīng)用電路結(jié)構(gòu)

按DS18B20的供電方式,其應(yīng)用電路結(jié)構(gòu)可分為如下3種:寄生電源供電方式;寄生電源強(qiáng)上拉供電方式;外部電源供電方式。實(shí)際應(yīng)用中,以外部電源供電方式為主。其應(yīng)用原理圖如圖3所示。

8.jpg

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所示。

9.jpg

5. 實(shí)物圖

10.jpg

6.具體電路

11.jpg

其中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.最終效果

12.jpg

運(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)始介紹的一樣的界面效果了。

導(dǎo)航欄目

聯(lián)系我們

聯(lián)系人:陳威

手 機(jī):18898570612

郵 箱:haodu@haodukeji-rtd.com

公 司:PT100/PT1000溫度傳感器/溫度變送器/壓力變送器__深圳市浩渡科技有限公司

地 址:深圳市龍崗區(qū)新生社區(qū)旗勝達(dá)高新科技園B棟三層

用手機(jī)掃描二維碼關(guān)閉
二維碼
亚洲国产精品无码久久久秋霞1| 人人妻人人澡人人爽人人精品电影| 免费下载破解看片APP的软件| 内射后入在线观看一区| 日本XXXX裸体XXXX自慰| 天堂影院在线观看高清在线| 性欧美GAYSEⅩ| 亚洲国产精品久久久天堂不卡海量| 一区二区三区精品视频日本| 啊灬啊灬啊灬快灬高潮了视频网站| 饭桌上故意张开腿让公在线观| 国精产品999一区二区三区有限| 久久婷婷五月综合色99啪AK| 人妻少妇AV无码一区二区 | 欧洲乱码一卡2卡三卡4卡高清| 十八禁羞羞视频爽爽爽| 亚洲男人第一无码AV网站| 696969大但人文艺术来源| 国产成人精品一区二区秒播| 久久精品人人做人人爽电影蜜月| 欧美一区二区在线视频| 无码熟妇人妻AV在线影片| 一区二区三区无码被窝影院 | 欧美高清熟妇啪啪内射不卡自拍| 撕开奶罩揉吮奶头免费视频| 亚洲中文久久久久久精品| 差差差很疼视频30分钟应用| 韩国免费A级毛片| 欧美丰满熟妇BBBBBB性亚洲| 午马视频影院1区2区3区4区| 中文字幕AV无码人妻| 国产成人精品日本亚洲语音| 久久夜色精品国产噜噜麻豆| 撒尿特写XXXⅩ| 亚洲中文字幕久久精品无码A | 亚洲一区二区三区自拍公司| 边做边爱完整版MP3在线下载| 国内精品久久久久久99| 欧美性操大鸡狠狠| 亚洲成人AV免费| 成 人 网 站 在线 看 免费| 精品一区二区三区无码免费直播 | 99西方37大但人文艺术| 欧美人与动牲交A免费| 影音先锋新男人AV资源站| 班主任掀开裙子让我桶的| 极品少妇被猛得白浆直流草莓| 秋霞鲁丝片AⅤ无码入口| 亚洲妇女行蜜桃AV网网站| 办公室爆乳女秘在线观看| 精品熟妇无码av免费久久| 日韩精品一区二区亚洲AV观看 | 一区二区日韩视频| 国产成人精品一区二区三区| 免费观看大片的APP视频| 亚洲AV蜜桃永久无码精品| 把腿扒开做爽爽视频| 久久久久人妻一区二区三区| 我和亲妺妺乱的性视频| 99精产国品一二三产区区别网站| 果冻传媒剧国产剧在线看| 日本久久三级电影院| 一二三四在线观看免费中文| 国产口爆吞精在线视频| 人妻少妇看A偷人无码精品视频 | 日木AV无码专区亚洲AV毛片| 尤物永久免费AV无码网站| 国产未成女YOUNV仙踪林| 人妻无码中文字幕| 呦女IUU极品资源| 国产在线无码一区二区三区| 日韩精品免费一线在线观看| 中文字幕乱码亚洲∧V日本 | 差差漫画网页登录页面弹窗| 老师掀起裙子让我挺进| 亚洲AV无码成人精品涩涩| 丰满岳跪趴高撅肥臀| 欧美精品少妇XXXXⅩ另类| 伊人久久大香线蕉精品| 狠狠躁夜夜躁人人爽碰AV| 特黄熟妇丰满人妻无码| とらぶるだいありぴーち在线| 久久婷婷五月国产色综合| 亚洲AV无码一区二区高潮| 国产99久久久久久免费看| 欧美性猛交XXXX黑人猛交| 伊人久久综合无码成人网| 狠狠色丁香婷婷久久综合不卡| 四十路の五十路熟女豊満AV| 宝贝腿开大点我添添公视频免费 | 一区二区三区无码免费看| 国产又爽又黄又爽又刺激 | 大又大粗又爽又黄少妇毛片免费 | 国内精品乱码卡一卡2卡三卡| 少妇高潮喷水惨叫久久久久电影| CHINESE新版少妇嫖妓VI| 毛多水多肥胖老太婆| 亚洲影院丰满少妇中文字幕无码| 国内少妇BBWBBW黑森林| 无人区码一码二码三码在线 | 国产又色又爽又黄的在线观看 | 成人永久免费高清视频在线观看| 欧美精产国品一二三类产品特点 | ZOOM另一类ZZO0| 内射精品无码中文字幕| 岳两腿之间白嫩的小缝| 久久无码人妻一区二区三区| 亚洲日韩国产AV无码无码精品| 国内少妇BBWBBW黑森林| 亚洲AV乱码一区二区三区按摩 | ASIAN艳丽的少妇PICS| 麻豆极品JK丝袜自慰喷水久久| 野花视频免费观看完整版| 九九久久精品国产免费看小说| 亚洲AV日韩精品一区二区三区| 国产乱色国产精品免费视频 | 亚洲国产成人AV网站| 国产日韩未满十八禁止观看| 无码G0G0大胆啪啪艺术| 国产精品视频永久免费播放| 无码人妻久久一区二区三区APP| 国产草草影院CCYYCOM| 特级毛片A级毛片免费播放| 国产 国语对白 露脸| 日韩精品一区二区亚洲蜜桃| 粗大的内捧猛烈进出视频| 色婷婷成人AV电影| 国产Chinese男男视频| 无码AV熟妇素人内射vr在线| 国产精选午睡沙发系列999| 小雪的L3又嫩又紧又多水图| 国产又大又黑又粗免费视频| 亚洲AV永久无码精品桃花岛| 精品国产乱码久久久久软件| 亚洲手机看片AV| 亂倫近親相姦中文字幕AV| 2022精品久久久久久中文字幕| 欧美黑人又粗又大高潮喷水| MD豆传媒一二三区进站口在线看 | A级黑粗大硬长爽 猛视频,| 欧美人与性动交XXⅩXX| 成年女人毛片免费视频| 特级毛片A级毛片免费观看网站| 国产精品一区二区久久国产| 亚洲AV永久纯肉无码精品动漫| 精品国产V无码大片在线观看| 亚洲中文字幕在线第六区| 蜜桃国产乱码精品一区二区三区 | 亚洲欧美丝袜 动漫专区| 久久夜色精品国产噜噜麻豆| 8Ⅹ8X擦拨擦拨成人免费视频| 人妻夜夜添夜夜无码AV| 国产成人精品无码播放| 亚洲AV永久天码精品天堂DL| 久久久久99精品国产片| 7777色情XXXX欧美| 日日噜噜夜夜狠狠VA视频 | 久久久久无码国产精品一区 | 成人免费A级毛片免费| 无码人妻丰满熟妇精品区| 精品久久久久久无码中文字幕一区| 又粗又黄又猛又爽大片APP | 精品久久久久久中文墓无码| 在教室伦流澡到高潮H强圩| 人妻AV一区二区| 国产精品午睡沙发系列| 亚洲一线产区二线产区区| 欧美国产成人精品一区二区三区 | 日产精品1区2区3区| 国产精品久久国产三级国| 亚洲欧美日韩国产成人| 欧美极品性饥渴少妇大战黑人| 国产96在线 | 亚洲| 亚洲国产激情一区二区三区| 蜜桃AV无码乱码精品| 公交车上穿短裙被狂C| 亚洲精品456在线播放| 欧美精品VIDEOSSEX少妇| 国产精品V片在线观看不卡| 亚洲一线产区二线产区区别在哪儿 | 久久精品国产99精品国产亚洲性| AV天堂东京热无码专区| 无码人妻丰满熟妇惹区| 老师你的兔子好软水好多的图片 | 伊人色综合久久天天| 日本三线和韩国三线品牌对比| 国产一区二区三区水蜜桃| 最新国产AV无码专区亚洲AVY| 少妇被躁C至高潮HD| 久久精品国产99国产精品澳门| XXXX18HD亚洲HD护士| 亚洲 日本 欧美 中文幕| 免费夜色污私人网站在线观看| 国产成人AV一区二区三区| 野花香视频在线观看免费高清版| 日韩加勒比一本无码精品| 精品中文字幕久久久无码中文Av| 锕锕锕锕锕锕锕好疼视频真人| 亚洲AV永久无码精品无码电影| 欧美日韩国产精品自在自线|