今天利用周末的时间,把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!!!!
|