[菜农助学交流] 菜鸟学习M0第二十一帖——M0+温湿度传感器

[复制链接]
4563|14
 楼主| lixiaoxu2meng 发表于 2011-12-7 15:48 | 显示全部楼层 |阅读模式
最近没有怎么在玩M0了惭愧  传一个前一阵弄得 用助学板进行温湿度采集的
代码
main函数
  1. /*---------------------------------------------------------------------------------------------------------*/
  2. /* */
  3. /* Copyright(c) 2011 Nuvoton Technology Corp. All rights reserved. */
  4. /* */
  5. /*---------------------------------------------------------------------------------------------------------*/
  6. #include "includes.h" //包含所需的头文件
  7. /*************************************************************************************
  8. ** Function name: main
  9. ** Descriptions:
  10. ** input parameters: 无
  11. ** output parameters: 无
  12. ** Returned value: 无
  13. *************************************************************************************/
  14. #define Slave_Add 0xB8 //器件地址
  15. #define Time 600
  16. FATFS fs;
  17. FIL file;
  18. FRESULT res;
  19. uint8_t Last_time =0;
  20. uint8_t RW_Buf[6][40];
  21. uint8_t Rrad_Buf[10];
  22. S_DRVRTC_TIME_DATA_T Curren_Time;
  23. int32_t AD_Value;
  24. UINT rr;
  25. uint8_t Command[3] = {0x03,0x00,0x04};//功能代码:0x03读传感器的多路寄存器 0x00 起始地址 0x04读取的寄存器个数
  26. uint8_t Recive[20]= {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1};//接收代码: Recive[0]功能代码 Recive[1]返回字节数 Recive[2] 湿度高字节Recive[3]湿度低字节 Recive[4] 温度高字节Recive[5] 温度低字节
  27. uint16_t count1 = 0;
  28. uint16_t AM23_Temp;
  29. uint16_t AM23_Humidity;
  30. float x,y;
  31. int main (void)
  32. {
  33. uint8_t funselect= 1,i;
  34. Set_System(); //封装一些初始化模块
  35. if(DrvGPIO_GetBit(E_GPA, 13)== 0) //检测SD卡是否插入
  36. printf("SD卡已插入\n");
  37. else printf("SD卡未插入\n");
  38. while(SD_Init()!=0) //等待SD卡初始化完成
  39. {
  40. DrvSYS_Delay(600000);
  41. printf("等待SD卡初始化\n");
  42. }
  43. printf("初始化成功\n");
  44. res = f_mount(0, &fs); //注册工作区
  45. if(res == FR_OK) //如果注册工作区成功
  46. {
  47. res = f_open(&file, "test2.txt", FA_OPEN_EXISTING | FA_READ); //打开文件
  48. switch(res)
  49. {
  50. case FR_OK: //如果"li.txt"存在,关闭文件
  51. printf("文件存在\n");
  52. f_close(&file);
  53. break;
  54. case FR_NO_FILESYSTEM: //如果文件系统不存在,格式化SD
  55. printf("文件系统不存在\n");
  56. res = f_mkfs(0 , 0, _MAX_SS);
  57. printf("%d",res);
  58. case FR_NO_FILE: //如果"LI.txt"不存在,创建该文件并写入初值
  59. printf("文件不存在\n");
  60. if(f_open(&file, "test2.txt", FA_OPEN_ALWAYS | FA_WRITE) == FR_OK)
  61. {
  62. f_printf(&file, "%s\n", "温湿度记录");
  63. f_close(&file);
  64. }
  65. break;
  66. default: break;
  67. }
  68. f_mount(0, 0); //关闭工作区
  69. }

  70. res = f_mount(0, &fs);
  71. /*f_open(&file, "li.txt", FA_OPEN_ALWAYS | FA_WRITE);//打开文件li.txt
  72. f_lseek(&file, f_size(&file)); //将指针移到文件末尾
  73. f_printf(&file, "%s\n", "李晓旭文本文档...");
  74. f_close(&file);//关闭文件li.txt */


  75. /*if(f_open(&file, "book1.txt", FA_OPEN_ALWAYS | FA_WRITE) == FR_OK)
  76. {
  77. f_printf(&file, "%s","内容");
  78. }
  79. f_close(&file);*/

  80. f_mount(0, 0);//关闭工作区



  81. while(1)
  82. {
  83. if(ShowPage == 0)
  84. {
  85. switch(funselect)
  86. {
  87. case 1:WriteStringToLCM(1,0,"->");
  88. break;
  89. case 2:WriteStringToLCM(2,0,"->");
  90. break;
  91. case 3:WriteStringToLCM(3,0,"->");
  92. break;
  93. case 4:WriteStringToLCM(4,0,"->");
  94. break;
  95. default:break;
  96. }
  97. WriteStringToLCM(1,1,"1.日历");
  98. WriteStringToLCM(2,1,"2.小说");
  99. WriteStringToLCM(3,1,"3.游戏");
  100. WriteStringToLCM(4,1,"4.测试");

  101. while(ShowPage == 0)
  102. {
  103. KeyCode = GetKey();
  104. switch(KeyCode)
  105. {
  106. case KEY1_DOWN_USER:
  107. {
  108. if(funselect<4) funselect++;
  109. else funselect= 1;
  110. WriteStringToLCM(1,0," ");//清选择表头
  111. WriteStringToLCM(2,0," ");
  112. WriteStringToLCM(3,0," ");
  113. WriteStringToLCM(4,0," ");
  114. switch(funselect)
  115. {
  116. case 1:WriteStringToLCM(1,0,"->");
  117. break;
  118. case 2:WriteStringToLCM(2,0,"->");
  119. break;
  120. case 3:WriteStringToLCM(3,0,"->");
  121. break;
  122. case 4:WriteStringToLCM(4,0,"->");
  123. break;
  124. default:break;
  125. }
  126. }
  127. break;
  128. case KEY2_DOWN_USER:
  129. {
  130. switch(funselect)
  131. {
  132. case 1:ShowPage = DatePage; break;
  133. case 2:ShowPage = BookPage;break;
  134. case 3:ShowPage = GamePage;break;
  135. case 4:ShowPage = MusicPage; break;
  136. default:break;
  137. }
  138. }
  139. break;
  140. default:break;
  141. }
  142. }
  143. }
  144. if(ShowPage == DatePage)
  145. {
  146. DrvRTC_Read(DRVRTC_CURRENT_TIME, &Curren_Time); //读取当前时间
  147. value = read_temp();//读取当前温度
  148. value = value/10;
  149. WriteCommandToLCM(0x01); //清屏指令
  150. delay_ms(10);
  151. WriteStringToLCM(1,0,"星期 晴 C");
  152. WriteStringToLCM(2,0," 年 月 日");
  153. WriteStringToLCM(3,0," 时 分 秒");
  154. //WriteStringToLCM(4,0,&RW_Buf[3][0]);
  155. switch(Curren_Time.u32cDayOfWeek)
  156. {
  157. case 0:WriteStringToLCM(1,2,"日");break;
  158. case 1:WriteStringToLCM(1,2,"一");break;
  159. case 2:WriteStringToLCM(1,2,"二");break;
  160. case 3:WriteStringToLCM(1,2,"三");break;
  161. case 4:WriteStringToLCM(1,2,"四");break;
  162. case 5:WriteStringToLCM(1,2,"五");break;
  163. case 6:WriteStringToLCM(1,2,"六");break;
  164. default:break;
  165. }
  166. while(ShowPage == DatePage)
  167. {
  168. WriteStringToLCM(3,6,"秒 ");
  169. DrvRTC_Read(DRVRTC_CURRENT_TIME, &Curren_Time); //读取当前时间
  170. value = read_temp();//读取当前温度
  171. value = value/10;
  172. if(value >100)
  173. value = 99;
  174. WriteValueToLCM(1,5,"%1f",value);
  175. //WriteValueToLCM(4,0,"%2f",value);
  176. WriteValueToLCM(2,0,"%2d",Curren_Time.u32Year);
  177. WriteValueToLCM(2,3,"%2d",Curren_Time.u32cMonth);
  178. WriteValueToLCM(2,5,"%2d",Curren_Time.u32cDay);
  179. WriteValueToLCM(3,1,"%2d",Curren_Time.u32cHour);
  180. WriteValueToLCM(3,3,"%2d",Curren_Time.u32cMinute);
  181. WriteValueToLCM(3,5,"%2d",Curren_Time.u32cSecond);
  182. KeyCode = GetKey();
  183. switch(KeyCode)
  184. {
  185. case KEY1_DOWN_USER:
  186. {
  187. ShowPage = 0;
  188. funselect = 1;
  189. WriteCommandToLCM(0x01); //清屏指令
  190. delay_ms(10);
  191. }
  192. break;
  193. case KEY2_DOWN_USER:
  194. {}
  195. break;
  196. default:break;
  197. }
  198. }/*while(ShowPage == DatePage)*/
  199. }/*if(ShowPage == DatePage)*/
  200. if(ShowPage == BookPage)
  201. {
  202. WriteCommandToLCM(0x01); //清屏指令
  203. delay_ms(10);
  204. WriteStringToLCM(1,2,"电子书");
  205. WriteStringToLCM(2,2,"人生.txt");
  206. WriteStringToLCM(3,3,"作者—路遥");
  207. f_mount(0, &fs); //注册工作区//注册工作区
  208. f_open(&file, "book1.txt", FA_OPEN_EXISTING | FA_READ);//打开电子书记事本
  209. while(ShowPage == BookPage)
  210. {
  211. KeyCode = GetKey();
  212. switch(KeyCode)
  213. {
  214. case KEY1_DOWN_USER:
  215. {
  216. f_close(&file);//关闭电子书记事本
  217. f_mount(0, 0);//关闭工作区
  218. ShowPage = 0;
  219. funselect = 2;
  220. WriteCommandToLCM(0x01); //清屏指令
  221. delay_ms(10);
  222. }
  223. break;
  224. case KEY2_DOWN_USER:
  225. {
  226. WriteCommandToLCM(0x01); //清屏指令
  227. delay_ms(10);
  228. for(i=1;i<=4;i++)//
  229. {
  230. f_read(&file,&RW_Buf[i][0],16,&rr);
  231. printf("%s\n",&RW_Buf[i][0]);
  232. WriteStringToLCM(i,0,&RW_Buf[i][0]);
  233. }
  234. }
  235. break;
  236. default:break;
  237. }

  238. } /*while(ShowPage == BookPage)*/
  239. }/*if(ShowPage == BookPage)*/
  240. if(ShowPage == GamePage)
  241. {
  242. WriteCommandToLCM(0x01); //清屏指令
  243. delay_ms(10);
  244. WriteStringToLCM(1,3,"游戏");
  245. WriteStringToLCM(2,0,"->1.贪吃蛇");
  246. WriteStringToLCM(3,1,"2.俄罗斯方块");
  247. while(ShowPage == GamePage)
  248. {
  249. KeyCode = GetKey();
  250. switch(KeyCode)
  251. {
  252. case KEY1_DOWN_USER:
  253. {
  254. ShowPage = 0;
  255. funselect = 3;
  256. WriteCommandToLCM(0x01); //清屏指令
  257. delay_ms(10);
  258. }
  259. break;
  260. case KEY2_DOWN_USER:
  261. {}
  262. break;
  263. default:break;
  264. }

  265. } /*while(ShowPage == MusicPage)*/
  266. }/*if(ShowPage == MusicPage)*/
  267. if(ShowPage == MusicPage)
  268. {
  269. WriteCommandToLCM(0x01); //清屏指令
  270. delay_ms(10);
  271. WriteStringToLCM(1,3,"测试");
  272. WriteStringToLCM(2,0,"湿度:");
  273. WriteStringToLCM(3,0,"温度:");
  274. count1 = Time-3; //为了每第一次进来都读一次
  275. Last_time = 80;
  276. while(ShowPage == MusicPage)
  277. {
  278. DrvRTC_Read(DRVRTC_CURRENT_TIME, &Curren_Time); //读取当前时间
  279. if(Last_time !=Curren_Time.u32cSecond)
  280. {
  281. Last_time = Curren_Time.u32cSecond;
  282. count1++;
  283. }

  284. if(count1>=Time-2) //每3分钟采集一次温湿度值
  285. {
  286. if(count1 == Time-2) //长时间(大于4秒)没读取温度值 待下次再要读取时 必须读两次
  287. {
  288. I2C_Write_N_Byte(Slave_Add,Command,3);
  289. delay_ms(10);//等待
  290. I2C_Read_NByte(Slave_Add,Recive,8);
  291. delay_ms(10);//等待
  292. }
  293. if(count1==Time)
  294. {
  295. count1 = 0;
  296. I2C_Write_N_Byte(Slave_Add,Command,3);
  297. delay_ms(10);//等待
  298. I2C_Read_NByte(Slave_Add,Recive,8);
  299. delay_ms(100);//等待
  300. AM23_Humidity = (Recive[2]*0x100+Recive[3]);
  301. AM23_Temp = (Recive[4]*0x100+Recive[5]);
  302. x = AM23_Humidity;
  303. y = AM23_Temp;
  304. printf("%d",AM23_Humidity/10);
  305. printf(".%d\n",AM23_Humidity%10);
  306. printf("%d",AM23_Temp/10);
  307. printf(".%d\n",AM23_Temp%10);
  308. WriteValueToLCM(2,3,"%1f",x/10);
  309. WriteValueToLCM(3,3,"%1f",y/10);

  310. res = f_mount(0, &fs);//注册工作区
  311. f_open(&file, "test2.txt", FA_OPEN_ALWAYS | FA_WRITE);//打开文件TEST2.txt 写属性
  312. f_lseek(&file, f_size(&file)); //将指针移到文件末尾
  313. f_printf(&file, " %02d",AM23_Humidity/10);//AM23_Humidity/10
  314. f_printf(&file, ".");
  315. f_printf(&file, " %d\n",AM23_Humidity%10);//AM23_Humidity%10

  316. f_printf(&file, " %02d",AM23_Temp/10);//AM23_Temp/10
  317. f_printf(&file, ".");
  318. f_printf(&file, " %d\n",AM23_Temp%10);//AM23_Temp%10

  319. f_close(&file);//关闭文件test2.txt */
  320. /* f_open(&file, "test2.txt", FA_OPEN_EXISTING | FA_READ);//打开文件TEST2.txt 读属性
  321. while( f_gets(Rrad_Buf, 10, &file) )
  322. {
  323. //WriteStringToLCM(4,0,Rrad_Buf);
  324. printf("%s\n",Rrad_Buf);
  325. }
  326. f_close(&file);//关闭文件test.txt */

  327. f_mount(0, 0);//关闭工作区
  328. }
  329. }
  330. KeyCode = GetKey();
  331. switch(KeyCode)
  332. {
  333. case KEY1_DOWN_USER:
  334. {
  335. ShowPage = 0;
  336. funselect = 4;
  337. WriteCommandToLCM(0x01); //清屏指令
  338. delay_ms(10);
  339. }
  340. break;
  341. case KEY2_DOWN_USER:
  342. {}
  343. break;
  344. default:break;
  345. }

  346. } /*while(ShowPage == MusicPage)*/
  347. }/*if(ShowPage == MusicPage)*/

  348. }/*while*/
  349. }/*main*/



这就是在第二十贴基础上更改的  工程就不 传了  就那个工程就可以了

下面上图

本帖子中包含更多资源

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

×
 楼主| lixiaoxu2meng 发表于 2011-12-7 15:48 | 显示全部楼层
hw_config.c文件
  1. #include "includes.h" //包含所需的头文件
  2. #define Enable_SPI_CS DrvGPIO_ClrBit(E_GPA,14)
  3. #define DISABLE_SPI_CS DrvGPIO_SetBit(E_GPA,14)
  4. /*************************************************************************************
  5. ** Function name: Set_System
  6. ** Descriptions: 封装一些初始化模块
  7. ** input parameters: count
  8. ** output parameters: 无
  9. ** Returned value: 无
  10. *************************************************************************************/
  11. void Set_System(void)
  12. {
  13. RCC_Configuration(); //配置系统时钟

  14. GPIO_Configuration(); //配置GPIO

  15. USRAT_Configuration(); //配置TIMER

  16. InitButtonVar(); //按键初始化

  17. TIMER_Configuration(); //配置TIMER

  18. RTC_Configuration(); //配置RTC

  19. I2C_Configuration(); //配置I2C模块

  20. LCMInit(); //初始化液晶
  21. }
  22. /*************************************************************************************
  23. ** Function name: RCC_Configuration
  24. ** Descriptions: 系统时钟源设置
  25. ** input parameters: none
  26. ** output parameters: none
  27. ** Returned value: none
  28. *************************************************************************************/
  29. void RCC_Configuration(void)
  30. {
  31. UNLOCKREG(); // 对写保护位操作时 需要一次向0x50000 0100写入 0x59,0x16,0x88,
  32. DrvSYS_SetOscCtrl(E_SYS_XTL12M, 1);// 与其 SYSCLK->PWRCON.XTL12M_EN = 1; 等同
  33. // PWRCON寄存器(这些寄存器在上电复位到用户解锁定之前是锁定的)除了 BIT[6]位其他位都受写保护
  34. // 解除这些需要向 0x50000 0100写入 0x59,0x16,0x88,
  35. // 令PWRCON寄存器的BITP[0]为1(即设定12M外部晶振)
  36. delay_ms(100); // while (DrvSYS_GetChipClockSourceStatus(E_SYS_XTL12M) != 1);//等待外部12MHZ晶振就绪
  37. LOCKREG(); // 向“0x5000_0100”写入任何值,就可以重锁保护寄存器
  38. }
  39. /*************************************************************************************
  40. ** Function name: GPIO_Configuration
  41. ** Descriptions: GPIO配置
  42. ** input parameters: none
  43. ** output parameters: none
  44. ** Returned value: none
  45. *************************************************************************************/
  46. void GPIO_Configuration()
  47. {
  48. DrvGPIO_Open( E_GPA, 13, E_IO_INPUT );

  49. DrvGPIO_Open( E_GPC, 8, E_IO_OUTPUT );

  50. DrvGPIO_Open( E_GPA, 2, E_IO_OUTPUT ); //DB0~DB7
  51. DrvGPIO_Open( E_GPA, 3, E_IO_OUTPUT );
  52. DrvGPIO_Open( E_GPA, 4, E_IO_OUTPUT );
  53. DrvGPIO_Open( E_GPA, 5, E_IO_OUTPUT );
  54. DrvGPIO_Open( E_GPA, 6, E_IO_OUTPUT );
  55. DrvGPIO_Open( E_GPA, 7, E_IO_OUTPUT );
  56. DrvGPIO_Open( E_GPA, 8, E_IO_OUTPUT );
  57. DrvGPIO_Open( E_GPA, 9, E_IO_OUTPUT );
  58. DrvGPIO_Open( E_GPC, 15,E_IO_OUTPUT ); //RS
  59. DrvGPIO_Open( E_GPC, 6, E_IO_OUTPUT ); //R/W
  60. DrvGPIO_Open( E_GPC, 7,E_IO_OUTPUT ); //EN

  61. DrvGPIO_Open( E_GPB, 14, E_IO_INPUT ); //按键端口设置为输入
  62. DrvGPIO_Open( E_GPB, 15, E_IO_INPUT );
  63. DrvGPIO_Open( E_GPA, 0, E_IO_INPUT );
  64. DrvGPIO_Open( E_GPB, 10, E_IO_OUTPUT );//蜂鸣器引脚设置为输出
  65. DrvGPIO_ClrBit(E_GPB,10); //关闭蜂鸣器
  66. }
  67. /*************************************************************************************
  68. ** Function name: USRAT_Configuration
  69. ** Descriptions: USRAT配置
  70. ** input parameters: none
  71. ** output parameters: none
  72. ** Returned value: none
  73. *************************************************************************************/
  74. void USRAT_Configuration()
  75. {
  76. STR_UART_T param;
  77. DrvSYS_SelectIPClockSource(E_SYS_UART_CLKSRC, 0); //使用外设时注意必须设置该外设的时钟 设置USART的时钟源为外部12MHZ
  78. DrvGPIO_InitFunction(E_FUNC_UART0); // 复用功能引脚设置
  79. param.u32BaudRate = 9600; // 波特率 9600
  80. param.u8cDataBits = DRVUART_DATABITS_8; // 数据位
  81. param.u8cStopBits = DRVUART_STOPBITS_1; // 停止位
  82. param.u8cParity = DRVUART_PARITY_NONE; // 校验位
  83. param.u8cRxTriggerLevel = DRVUART_FIFO_1BYTES; // FIFO存储深度 1 字节
  84. param.u8TimeOut = 0; // FIFO超时设定
  85. DrvUART_Open(UART_PORT0, ¶m); // 串口usart0开启、结构体整体赋值

  86. }
  87. void TIMER_Configuration()
  88. {
  89. DrvTIMER_Init(); //初始化定时器

  90. DrvSYS_SelectIPClockSource(E_SYS_TMR0_CLKSRC,0); //使用外设时注意必须设置该外设的时钟 设置TMR0的时钟源为外部12MHZ

  91. DrvTIMER_Open(E_TMR0,1000,E_PERIODIC_MODE); //设定定时器timer0的tick周期,并且启动定时器:定时器通道 TMR0 每秒1000次 周期模式

  92. DrvTIMER_SetTimerEvent(E_TMR0,10,(TIMER_CALLBACK) Timer0_Callback,0); //安装一个10ms定时处理事件到 timer0通道

  93. DrvTIMER_EnableInt(E_TMR0); //使能定时器中断 //TIMER0->TCSR.IE = 1

  94. DrvTIMER_Start(E_TMR0); //定时器timer0开始计数 //TIMER0->TCSR.CEN = 1;
  95. }
  96. void Timer0_Callback (void)
  97. {
  98. KeyPro(); //按键扫描 该函数在 button.c 中实现
  99. }
  100. void SPI_Configuration()
  101. {
  102. DrvSYS_SetIPClock(E_SYS_SPI1_CLK,1); //使用外设时注意必须设置该外设的时钟
  103. DrvGPIO_InitFunction(E_FUNC_SPI1); //复用功能引脚设置 设置引脚为SPI功能
  104. //此功能是用来打开SPI模块。它决定了SPI工作在主或从模式,SPI总线时序 和每传输比特长度
  105. //指定SPI端口为SPI1 并配置SPI1为主模式 TYPE1总线时序(时钟的空闲状态为低;在串行时钟的下降沿驱动器的数据,在串行时钟上升沿锁存数据) 8位传输
  106. DrvSPI_Open(eDRVSPI_PORT1,eDRVSPI_MASTER,eDRVSPI_TYPE1,8, FALSE);
  107. DrvSPI_DisableAutoSS(eDRVSPI_PORT1); //禁止自动片选功能
  108. DrvSPI_SetSlaveSelectActiveLevel(eDRVSPI_PORT1, eDRVSPI_ACTIVE_LOW_FALLING);
  109. DrvSPI_SetEndian(eDRVSPI_PORT1, eDRVSPI_MSB_FIRST); //配置SPI1传输比特的顺序:优先发送/接收MSB
  110. DrvSPI_SetClockFreq(eDRVSPI_PORT1,300000,300000);
  111. }
  112. /*************************************************************************************
  113. ** Function name: I2C_Configuration
  114. ** Descriptions: I2C配置(注:一些配置都在 读写I2C的子程序里了)
  115. ** input parameters: none
  116. ** output parameters: none
  117. ** Returned value: none
  118. *************************************************************************************/
  119. void I2C_Configuration()
  120. {
  121. DrvGPIO_InitFunction(E_FUNC_I2C1);//注意:在使用引脚特殊功能时 必须进行复用功能引脚设置(此时I2C1引脚为开漏输出)
  122. DrvGPIO_SetBit(E_GPA,10); //在使用之前需将 I2C1_SDA 置高
  123. DrvGPIO_SetBit(E_GPA,11); //在使用之前需将 I2C1_SCL 置高
  124. }
  125. /*************************************************************************************
  126. ** Function name: I2C_Start_Chec
  127. ** Descriptions: 启动I2C并检测是否应答
  128. ** input parameters: none
  129. ** output parameters: ack or nack
  130. ** Returned value: none
  131. *************************************************************************************/
  132. uint8_t I2C_Start_Chec()
  133. {
  134. DrvI2C_Open(I2C_PORT1, 100000); //打开I2C1功能,并配置 I2C总线时钟为50KHZ (该函数进行了四舍五入操作)
  135. /* Parameters:port - [in] I2C_PORT0 / I2C_PORT1 */
  136. /* u32BusClock - [in] I2C bus clock frequency (Hz) */
  137. DrvI2C_Ctrl(I2C_PORT1, 1, 0, 0, 0); //设定I2C控制位 START
  138. /* Parameters:port - [in] I2C_PORT0 / I2C_PORT1 */
  139. /* start - [in] 1:Enable / 0:Disable I2C开始 进入主机模式 */
  140. /* stop - [in] 1:Enable / 0:Disable I2C停止 */
  141. /* intFlag - [in] Wrtie '1' to clear this flag (I2C_SI) */
  142. /* ack - [in] 1:Enable / 0:Disable 应答位 */
  143. delay_ms(10);//等待
  144. while (I2C1->CON.SI == 0); //查询中断标志位 SI 如果忙则一直等待
  145. return I2C1->CON.SI;
  146. }
  147. /*************************************************************************************
  148. ** Function name: I2C_Stop
  149. ** Descriptions: 停止I2C
  150. ** input parameters: none
  151. ** output parameters: none
  152. ** Returned value: none
  153. *************************************************************************************/
  154. void I2C_Stop()
  155. {
  156. DrvI2C_Ctrl(I2C_PORT1, 0, 1, 1, 0); //清标志位 SI 并STOP
  157. DrvI2C_Close(I2C_PORT1); //关闭I2C1功能
  158. delay_ms(10);//等待
  159. }
  160. /*************************************************************************************
  161. ** Function name: I2C_Write_N_Byte
  162. ** Descriptions: I2C向写count个字节函数
  163. ** input parameters: 从器件地址:address 要写入的字节首地址:P 写入的字节个数count
  164. ** output parameters: none
  165. ** Returned value: none
  166. *************************************************************************************/
  167. void I2C_Write_N_Byte (uint8_t address,uint8_t *P ,uint8_t count )
  168. {
  169. I2C_Start_Chec();

  170. //I2C1->DATA = ;
  171. DrvI2C_WriteData (I2C_PORT1, address);//发送从器件地址
  172. DrvI2C_Ctrl(I2C_PORT1, 0, 0, 1, 1); //清标志位 SI 并使能应答 2011-11-28
  173. while( I2C1->CON.SI == 0 ); //查询中断标志位 SI

  174. while(count)
  175. {
  176. //I2C1->DATA =*P; //发送待写内容
  177. DrvI2C_WriteData (I2C_PORT1, *P); //发送写入的数据
  178. P++;
  179. DrvI2C_Ctrl(I2C_PORT1, 0, 0, 1, 1); //清标志位 SI 并使能应答
  180. while( I2C1->CON.SI == 0 ); //查询中断标志位 SI 如果忙则一直等待
  181. count--;
  182. }
  183. I2C_Stop();
  184. }

  185. /*************************************************************************************
  186. ** Function name: I2C_Read_NByte
  187. ** Descriptions: I2C读出N单字节
  188. ** input parameters: 从器件地址:address 存放读出字节的首地址:P 读出的字节个数count
  189. ** output parameters: DATA
  190. ** Returned value: none
  191. *************************************************************************************/
  192. void I2C_Read_NByte ( uint8_t address,uint8_t *p,uint8_t count )
  193. {
  194. uint8_t data;
  195. I2C_Start_Chec();

  196. DrvI2C_WriteData (I2C_PORT1, address| 0x01); //发送从器件地址 读时最低位置一
  197. DrvI2C_Ctrl(I2C_PORT1, 0, 0, 1, 1); //清标志位 SI 并使能应答 2011-11-28
  198. while( I2C1->CON.SI == 0 ); //查询中断标志位 SI 如果忙则一直等待

  199. while(count)
  200. {
  201. data = 0;
  202. DrvI2C_Ctrl(I2C_PORT1, 0, 0, 1, 1); //清标志位 SI 并使能应答 2011-11-28
  203. while( I2C1->CON.SI == 0 ); //查询中断标志位 SI 如果忙则一直等待
  204. *p = DrvI2C_ReadData(I2C_PORT1); //读数据
  205. data = DrvI2C_ReadData(I2C_PORT1); //读数据
  206. //printf("%d\n",data);
  207. p++;
  208. count--;
  209. }
  210. //printf("%d",0xf3);
  211. I2C_Stop();
  212. }
 楼主| lixiaoxu2meng 发表于 2011-12-7 15:49 | 显示全部楼层
说我超限制了 只能拿二楼来发了
具体功能 采集温湿度 并保存到sd卡中
dong_abc 发表于 2011-12-7 16:34 | 显示全部楼层
顶一下,起个哄!
Ryanhsiung 发表于 2011-12-7 18:13 | 显示全部楼层
这个要顶!
hotpower 发表于 2011-12-8 01:10 | 显示全部楼层
本帖最后由 hotpower 于 2011-12-8 01:15 编辑

经过鉴定:
楼主已无人品问题!!!


只要不作弊,不违反规则,为何放弃选美???
怕得奖,怕别人说你为了钱????


好!!!
下次俺在二个月内的基础上,在加上有俺或你自己提供最多三篇的参赛笔记!!!

以后新生选美也如此,这样就杜绝了外行看数量的弊病!!!

谢谢你的想法使俺有更好的规则制定的方法和对策!!!
hotpower 发表于 2011-12-8 01:27 | 显示全部楼层
楼主请注意:
    学习什么不重要,重要的在于自己掌握了多少,学到了什么技能。
既然参加了TI的活动,也应该好好学习,上传更多的笔记!!!
    不要认为俺推广新唐的M0俺就介意你再去TI学习,那就小看菜农了!!!
记住俺说的人品问题!!!
    有时间也学点园地的LOOK,李老师的LOOK早已可以在M3上应用。
我们先在新唐的M0上实现,然后再向其他领域扩展。
    再我将组成网络团队,如有兴趣可以参见。

祝好!!!希望拿下TI的$100,为园地和群里的网友争光!!!


菜农 HotPower@126.com 2011.12.8 于雁塔菜地
 楼主| lixiaoxu2meng 发表于 2011-12-8 07:15 | 显示全部楼层
本帖最后由 lixiaoxu2meng 于 2011-12-8 07:21 编辑

7# hotpower
我丝毫不会怀疑老师所说的人品问题也不怀疑老师会介意我玩TI的产品,因为老师一直鼓励我学习,也帮我顶贴,我最近不论TI的还是M0都没怎么玩了,呵呵TI的奖品就算了,向老师说的为了学习而学习,不是为了奖品而学习。TI的我以后有时间会继续玩的。呵呵谢谢老师
老师说的LOOK我也看了看 因为没有C++基础 看起来比较费劲啊 有时间一边看一边学习C++吧
老师真辛苦啊 昨晚又没怎么休息啊 注意身体啊
weshiluwei6 发表于 2011-12-8 10:10 | 显示全部楼层
兄弟给力啊  支持
plc_avr 发表于 2011-12-8 12:20 | 显示全部楼层
顶!我好象也有买过2个温湿度传感器,不知和楼主的型号是否一样。
murex 发表于 2011-12-8 12:32 | 显示全部楼层
非常的给力啊
 楼主| lixiaoxu2meng 发表于 2011-12-8 12:47 | 显示全部楼层
9# weshiluwei6
呵呵 3Q
 楼主| lixiaoxu2meng 发表于 2011-12-8 12:48 | 显示全部楼层
10# plc_avr
烈火哥  我的型号是 AM2311 I2C接口的 好像还有AM2301单总线的
 楼主| lixiaoxu2meng 发表于 2011-12-8 12:48 | 显示全部楼层
11# murex
谢谢
mcs8098 发表于 2011-12-20 13:40 | 显示全部楼层
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

1679

帖子

2

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