| 今天利用周末的时间,把1820弄出来了。 先还是小小的总结下吧。首先由于我在网上下载的助学板电路图可能没有更新吧,所以就把IO都弄错了,今天老是协议没有正确。后来仔细观察板子才发现自己错了。。。。。
 看来以后应该仔细啊。
 这次用的东西也还是板上的资源。还有个就是大叔的互联卫士。这个工具没得说的,很强大。不过我由于第一次用uart还不知道怎么原理呢。按照神龙前辈的例程来弄的.
 而且跑例程都用了点时间呢。首先就是串口的设置要统一,串口助手和,软件设置要对位。然后就没有什么要注意的了。我用的是串口工具哈!
 不是助学板上的东东。
 如图:(直接连接,然后把右边的开关按钮选择打开就行了。使用很简单)
 
 
 好了工具介绍完毕,
 看看我主要的程序吧。
 main程序
 
  
#include"nuc1xx.h"
#include"ds18b20.h"
#include"drvuart.h"
#include"drvgpio.h"
#include"drvsys.h"
#include"stdio.h"
void sysinit()
 {
  UNLOCKREG();               //unlock IC
     SYSCLK->PWRCON.XTL12M_EN = 1;           //set clk
     DrvSYS_Delay(5000);             //wait
  DrvGPIO_Open(E_GPB, 10, E_IO_OUTPUT);                                //  设置GPB10端口为输出模式
     DrvGPIO_ClrBit(E_GPB, 10);                                        //  清GPB10端口  蜂鸣器不叫唤
  outpw(&SYS->GPAMFP, inpw(&SYS->GPBMFP) & ~(0x1<<4));     //gpb5 is IO
  GPIOB->PMD.PMD4=3;
  {
  STR_UART_T param;
  
  DrvSYS_SelectIPClockSource(E_SYS_UART_CLKSRC, 0);    //  使能UART时钟
  DrvGPIO_InitFunction(E_FUNC_UART0);        //  复用功能引脚设置
   
  param.u32BaudRate        = 115200;        //  波特率
  param.u8cDataBits        = DRVUART_DATABITS_8;     //  数据位
  param.u8cStopBits        = DRVUART_STOPBITS_1;     //  停止位
  param.u8cParity          = DRVUART_PARITY_NONE;     //  校验位
  param.u8cRxTriggerLevel  = DRVUART_FIFO_1BYTES;     //  FIFO存储深度 1 字节
  param.u8TimeOut          = 0;         //  FIFO超时设定
  DrvUART_Open(UART_PORT0, ¶m);        //  串口开启、结构体整体赋值
  }
 }
void delay0(int i)
 {
 int j,k;
 for(j=0;j<i;j++)
  for(k=0;k<5000;k++);
 }
main()
 {
 float tm;int i=1;   
 sysinit();
 while(1)
 {
 if(i==1)
 printf("请输入刺激信号:\n");
 
 while(UART0->ISR.RDA_IF==0);
 UART0->FCR.RFR=1;
 i++;
 if(i%2==0)
 {i=0;
 printf("正在检测你的信号\n");
 printf("......\n");
 delay0(500);
 printf("检测出信号,计算温度中.....\n");
 delay0(500);
 printf("稍后....\n");
 delay0(600);
 printf("OK\n\n");
  
 tm=readtemp();
 printf("现在温度是:%6.4f°C\n",tm);
 printf("1820寄存器数据-->   低八位是:templ=%xH",templ);
 printf("      ");
 printf("高八位是:temph=%xH\n",temph);
 printf("温度计算公式:T=(temph*256+templ)*0.06125=(%xH*256+%xH)*0.0625=%6.4f\n\n",temph,templ,(temph*256+templ)*0.0625);
 delay0(500);
 }
 else 
 ;
 }
 }
 
 还有就是1820的通信哈,大家可以借鉴下。可行的哈!!!
 
  
#include"nuc1xx.h"
#include"drvgpio.h"
#include"ds18b20.h"
 unsigned char templ;
 unsigned char temph;
 float temp;
void delay(int time)       //delay 5*i us
 {
 int n;
 n=0;
 while(n<time)n++; 
 return;
 }
unsigned char init_1820(void)
 {unsigned char x;
 CLR_1820;
 delay(1200);
 SET_1820;
 delay(50);
 x=GET_1820;
 delay(900);
 return x; 
 }
unsigned char readone(void)
 {
 int i,m;
 unsigned char dat=0;
 for(i=0;i<8;i++)
  {
   CLR_1820;
   dat>>=1;
   SET_1820;
   delay(30);
   m=GET_1820;
   if(m)dat|=0x80;
   delay(75);
  }
  return (dat);
 }
void writeone(unsigned char dat)
 {
 int i;
 for(i=0;i<8;i++)
  {   
   CLR_1820;
   delay(18);
   if(dat&0x01)
    SET_1820;
  else
   CLR_1820;
   delay(120);
   SET_1820;
   dat>>=1;
  }
  delay(40);
 }
float readtemp(void)
 {
 
 init_1820();
 writeone(0xcc);
 writeone(0x44);
 delay(125);
 init_1820();
 writeone(0xcc);
 writeone(0xbe);
 templ=readone();
 temph=readone();
 temp=(temph*256+templ)*0.0625;
 delay(200);
 return temp;  
 }
 其他就没有什么了
 最后看看工程吧。
 
 所有的东东都上来了....
 相信你应该也可以试试了吧。只要你有助学板,就可以测试温度了。显示用串口工具。
 最后还是来个总结吧!
 
 总的来说这次熟悉了下串口工具怎么用,虽然还不知道怎么弄的,不知道为什么直接printf就出来数据了。了解熟悉了1820的通信,发现了书上的问题(本来是按照书上的来写1820通信,后来发现不行。书上的是扯蛋。完全不行,可能是片子不同吧)。按照书上的来,1820都不能初始化复位.....
 那是相当的纠结啊....
 还有个发现就是,在调试某个通信段的时候示波器有用,最后看结果。貌似示波器看不到差别。比如我写个初始化复位。1820应该最后拉低,能看见效果。写个数据给1820也能看出写的什么。但是协议完成后。加到main再用示波器看就发现电平一直是高....
 但是结果1820计算是对的,温度我测试的是24摄氏度。这回用了uart,下次继续弄那个温度电阻吧。等有时间买个显示器。以前有个山寨手机的显示器。貌似不会用,线好细...
 没资料。。。。。
 对了
 最后看看程序运行说明哈
 首先如图打开hotisp
 
 然后按下助学板上的复位按钮。
 
 提示输入刺激:
 就是在串口助手里面发送任意的东东。然后通过检测到有输入就会显示温度。
 而且其中也有说明计算过程
 和1820中的数据。如图:
 
 你可以把程序copy去看看是不是一样的,有什么问题call me!
 thank you!!!!
 |