[菜农助学交流] CN(菜鸟)之250助学板-->玩玩1820,就是爽啊...

[复制链接]
 楼主| chinacn1989 发表于 2011-9-24 15:08 | 显示全部楼层 |阅读模式
今天利用周末的时间,把1820弄出来了。
先还是小小的总结下吧。首先由于我在网上下载的助学板电路图可能没有更新吧,所以就把IO都弄错了,今天老是协议没有正确。后来仔细观察板子才发现自己错了。。。。。
看来以后应该仔细啊。
这次用的东西也还是板上的资源。还有个就是大叔的互联卫士。这个工具没得说的,很强大。不过我由于第一次用uart还不知道怎么原理呢。按照神龙前辈的例程来弄的.
而且跑例程都用了点时间呢。首先就是串口的设置要统一,串口助手和,软件设置要对位。然后就没有什么要注意的了。我用的是串口工具哈!
不是助学板上的东东。
如图:(直接连接,然后把右边的开关按钮选择打开就行了。使用很简单)


好了工具介绍完毕,
看看我主要的程序吧。
main程序

  1. #include"nuc1xx.h"
  2. #include"ds18b20.h"
  3. #include"drvuart.h"
  4. #include"drvgpio.h"
  5. #include"drvsys.h"
  6. #include"stdio.h"
  7. void sysinit()
  8. {
  9.   UNLOCKREG();               //unlock IC
  10.      SYSCLK->PWRCON.XTL12M_EN = 1;           //set clk
  11.      DrvSYS_Delay(5000);             //wait
  12.   DrvGPIO_Open(E_GPB, 10, E_IO_OUTPUT);                                //  设置GPB10端口为输出模式
  13.      DrvGPIO_ClrBit(E_GPB, 10);                                        //  清GPB10端口  蜂鸣器不叫唤
  14.   outpw(&SYS->GPAMFP, inpw(&SYS->GPBMFP) & ~(0x1<<4));     //gpb5 is IO
  15.   GPIOB->PMD.PMD4=3;
  16.   {
  17.   STR_UART_T param;
  18.   
  19.   DrvSYS_SelectIPClockSource(E_SYS_UART_CLKSRC, 0);    //  使能UART时钟
  20.   DrvGPIO_InitFunction(E_FUNC_UART0);        //  复用功能引脚设置
  21.    
  22.   param.u32BaudRate        = 115200;        //  波特率
  23.   param.u8cDataBits        = DRVUART_DATABITS_8;     //  数据位
  24.   param.u8cStopBits        = DRVUART_STOPBITS_1;     //  停止位
  25.   param.u8cParity          = DRVUART_PARITY_NONE;     //  校验位
  26.   param.u8cRxTriggerLevel  = DRVUART_FIFO_1BYTES;     //  FIFO存储深度 1 字节
  27.   param.u8TimeOut          = 0;         //  FIFO超时设定
  28.   DrvUART_Open(UART_PORT0, &param);        //  串口开启、结构体整体赋值
  29.   }
  30. }
  31. void delay0(int i)
  32. {
  33. int j,k;
  34. for(j=0;j<i;j++)
  35.   for(k=0;k<5000;k++);
  36. }
  37. main()
  38. {
  39. float tm;int i=1;   
  40. sysinit();
  41. while(1)
  42. {
  43. if(i==1)
  44. printf("请输入刺激信号:\n");

  45. while(UART0->ISR.RDA_IF==0);
  46. UART0->FCR.RFR=1;
  47. i++;
  48. if(i%2==0)
  49. {i=0;
  50. printf("正在检测你的信号\n");
  51. printf("......\n");
  52. delay0(500);
  53. printf("检测出信号,计算温度中.....\n");
  54. delay0(500);
  55. printf("稍后....\n");
  56. delay0(600);
  57. printf("OK\n\n");
  58.   
  59. tm=readtemp();
  60. printf("现在温度是:%6.4f°C\n",tm);
  61. printf("1820寄存器数据-->   低八位是:templ=%xH",templ);
  62. printf("      ");
  63. printf("高八位是:temph=%xH\n",temph);
  64. printf("温度计算公式:T=(temph*256+templ)*0.06125=(%xH*256+%xH)*0.0625=%6.4f\n\n",temph,templ,(temph*256+templ)*0.0625);
  65. delay0(500);
  66. }
  67. else
  68. ;
  69. }
  70. }




还有就是1820的通信哈,大家可以借鉴下。可行的哈!!!

  1. #include"nuc1xx.h"
  2. #include"drvgpio.h"
  3. #include"ds18b20.h"
  4. unsigned char templ;
  5. unsigned char temph;
  6. float temp;

  7. void delay(int time)       //delay 5*i us
  8. {
  9. int n;
  10. n=0;
  11. while(n<time)n++;
  12. return;
  13. }
  14. unsigned char init_1820(void)
  15. {unsigned char x;
  16. CLR_1820;
  17. delay(1200);
  18. SET_1820;
  19. delay(50);
  20. x=GET_1820;
  21. delay(900);
  22. return x;
  23. }
  24. unsigned char readone(void)
  25. {
  26. int i,m;
  27. unsigned char dat=0;
  28. for(i=0;i<8;i++)
  29.   {
  30.    CLR_1820;
  31.    dat>>=1;
  32.    SET_1820;
  33.    delay(30);
  34.    m=GET_1820;
  35.    if(m)dat|=0x80;
  36.    delay(75);
  37.   }
  38.   return (dat);
  39. }
  40. void writeone(unsigned char dat)
  41. {
  42. int i;
  43. for(i=0;i<8;i++)
  44.   {   
  45.    CLR_1820;
  46.    delay(18);
  47.    if(dat&0x01)
  48.     SET_1820;
  49.   else
  50.    CLR_1820;
  51.    delay(120);
  52.    SET_1820;
  53.    dat>>=1;
  54.   }
  55.   delay(40);
  56. }
  57. float readtemp(void)
  58. {

  59. init_1820();
  60. writeone(0xcc);
  61. writeone(0x44);
  62. delay(125);
  63. init_1820();
  64. writeone(0xcc);
  65. writeone(0xbe);
  66. templ=readone();
  67. temph=readone();
  68. temp=(temph*256+templ)*0.0625;
  69. delay(200);
  70. return temp;  
  71. }



其他就没有什么了
最后看看工程吧。

所有的东东都上来了....
相信你应该也可以试试了吧。只要你有助学板,就可以测试温度了。显示用串口工具。
最后还是来个总结吧!

总的来说这次熟悉了下串口工具怎么用,虽然还不知道怎么弄的,不知道为什么直接printf就出来数据了。了解熟悉了1820的通信,发现了书上的问题(本来是按照书上的来写1820通信,后来发现不行。书上的是扯蛋。完全不行,可能是片子不同吧)。按照书上的来,1820都不能初始化复位.....
那是相当的纠结啊....
还有个发现就是,在调试某个通信段的时候示波器有用,最后看结果。貌似示波器看不到差别。比如我写个初始化复位。1820应该最后拉低,能看见效果。写个数据给1820也能看出写的什么。但是协议完成后。加到main再用示波器看就发现电平一直是高....
但是结果1820计算是对的,温度我测试的是24摄氏度。这回用了uart,下次继续弄那个温度电阻吧。等有时间买个显示器。以前有个山寨手机的显示器。貌似不会用,线好细...
没资料。。。。。
对了
最后看看程序运行说明哈
首先如图打开hotisp

然后按下助学板上的复位按钮。

提示输入刺激:
就是在串口助手里面发送任意的东东。然后通过检测到有输入就会显示温度。
而且其中也有说明计算过程
和1820中的数据。如图:

你可以把程序copy去看看是不是一样的,有什么问题call me!
thank you!!!!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
lixiaoxu2meng 发表于 2011-9-24 16:41 | 显示全部楼层
顶 这个还没做 有时间 玩玩
hotpower 发表于 2011-9-24 17:35 | 显示全部楼层
新的HotISP可以在助学板的栏目中直接调试~~~
123jj 发表于 2011-9-25 14:44 | 显示全部楼层
弄的不错哈,支持~~~
 楼主| chinacn1989 发表于 2011-9-26 08:46 | 显示全部楼层
4# 123jj
谢谢123姐姐的鼓励!
我会再接再厉....
hotpower 发表于 2011-9-26 09:09 | 显示全部楼层
老版本hotisp需要右上角的串口控制和内嵌的串口助学调试。
点击dtr就是助学板上的复位,rts就是助学板的key1。

新版本的hotisp下面的虚拟控制台可以直接操作助学板!

点击图片上的复位和key1键即可操作。
它自带了一个小的串口助手。
hotpower 发表于 2011-9-26 09:11 | 显示全部楼层
新版本的hotisp可以在腾讯微群的群共享里下载。http://qun.t.qq.com/78184763/share
 楼主| chinacn1989 发表于 2011-9-26 13:24 | 显示全部楼层
哦,了解了大叔...
我今天试了下!
ok...
hotpower 发表于 2011-9-27 09:54 | 显示全部楼层
请参见老师的ds18b20的例程,

助学板的电路可以用串口1来实现“硬件单总线控制器”
老鱼探戈 发表于 2011-9-27 19:34 | 显示全部楼层
没有18b20也可以用?
 楼主| chinacn1989 发表于 2011-9-28 09:38 | 显示全部楼层
没有18b20也可以用?
老鱼探戈 发表于 2011-9-27 19:34

没有1820也可以用什么?
ddjrz 发表于 2011-9-28 10:42 | 显示全部楼层
楼主的x=GET_1820;是什么意思,看样子并不是一个函数,怎么会返回8比特数的
 楼主| chinacn1989 发表于 2011-9-29 08:25 | 显示全部楼层
本帖最后由 chinacn1989 于 2011-9-29 08:28 编辑

12# ddjrz

  1. #ifndef __DS18B20__H
  2. #define __DS18B20__H
  3. #include"nuc1xx.h"
  4. #include"drvgpio.h"
  5. #define CLR_1820     DrvGPIO_ClrBit(E_GPB,4)            //SET  DQ
  6. #define SET_1820     DrvGPIO_SetBit(E_GPB,4)            //CLS  DQ
  7. #define GET_1820  DrvGPIO_GetBit(E_GPB,4)   //GET  DQ
  8. extern float readtemp(void);
  9. extern void writeone(unsigned char dat);
  10. extern unsigned char init_1820(void);
  11. extern unsigned char readone(void);
  12. extern void delay(int time);
  13. extern unsigned char templ;
  14. extern unsigned char temph;
  15. extern float temp;
  16. #endif

就是这里的哈
我定义了的,get——1820就是获取现在总线的IO状态!
至于8bit的数据,因为函数返回值是1或者0.
所以8bit已经足够了!
mbydyjj 发表于 2011-9-30 13:18 | 显示全部楼层
下次我也把18B20g弄出来
mbydyjj 发表于 2011-9-30 13:18 | 显示全部楼层
下次我也把18B20g弄出来
hotpower 发表于 2011-12-3 01:13 | 显示全部楼层
单总线控制器不错的,李老师的DS18b20的例程大家好好看看
dong_abc 发表于 2011-12-3 19:18 | 显示全部楼层
单总线控制器
 楼主| chinacn1989 发表于 2013-7-25 13:40 | 显示全部楼层
ddjrz 发表于 2011-9-28 10:42
楼主的x=GET_1820;是什么意思,看样子并不是一个函数,怎么会返回8比特数的

GET_1820是读取总线的状态(0or1),
那里书循环8次
所以就是八位了!
缥缈九哥 发表于 2014-8-9 22:26 | 显示全部楼层
顶起
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:努力奋斗,努力学! 努力学习,努力帖! 学=学习;帖=发帖! 学习好了,就发帖和大家分享! 共同学习...

6

主题

272

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部
个人签名:努力奋斗,努力学! 努力学习,努力帖! 学=学习;帖=发帖! 学习好了,就发帖和大家分享! 共同学习...

6

主题

272

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部