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