当前位置:   article > 正文

蓝桥杯学习笔记 单片机CT107D 新驱动代码的使用._蓝桥杯单片机给的底层驱动怎么使用

蓝桥杯单片机给的底层驱动怎么使用
1.前言

在第十四届蓝桥杯中,比赛更换了底层驱动代码,不再提供 onewire iic ds1302的头文件,需要自行编写,同时在.c文件中也进行了一些改动(如引脚的缺失)。需要提前注意。

2.代码更改
1.onewire:

老版代码:

  1. /*
  2. 程序说明: 单总线驱动程序
  3. 软件环境: Keil uVision 4.10
  4. 硬件环境: CT107单片机综合实训平台(外部晶振12MHz) STC89C52RC单片机
  5. 日 期: 2011-8-9
  6. */
  7. #include "reg52.h"
  8. sbit DQ = P1^4; //单总线接口(新代码已经删除,需对照原理图补充)
  9. //单总线延时函数
  10. void Delay_OneWire(unsigned int t) //STC89C52RC
  11. {
  12. while(t--);//在老板代码中,为满足要求需要t*=12;
  13. }
  14. //通过单总线向DS18B20写一个字节
  15. void Write_DS18B20(unsigned char dat)
  16. {
  17. unsigned char i;
  18. for(i=0;i<8;i++)
  19. {
  20. DQ = 0;
  21. DQ = dat&0x01;
  22. Delay_OneWire(5);
  23. DQ = 1;
  24. dat >>= 1;
  25. }
  26. Delay_OneWire(5);
  27. }
  28. //从DS18B20读取一个字节
  29. unsigned char Read_DS18B20(void)
  30. {
  31. unsigned char i;
  32. unsigned char dat;
  33. for(i=0;i<8;i++)
  34. {
  35. DQ = 0;
  36. dat >>= 1;
  37. DQ = 1;
  38. if(DQ)
  39. {
  40. dat |= 0x80;
  41. }
  42. Delay_OneWire(5);
  43. }
  44. return dat;
  45. }
  46. //DS18B20设备初始化
  47. bit init_ds18b20(void)
  48. {
  49. bit initflag = 0;
  50. DQ = 1;
  51. Delay_OneWire(12);
  52. DQ = 0;
  53. Delay_OneWire(80);
  54. DQ = 1;
  55. Delay_OneWire(10);
  56. initflag = DQ;
  57. Delay_OneWire(5);
  58. return initflag;
  59. }

新版代码:(仅需添加头文件和DQ的定义)可以先编译一下看缺少什么东西以便进行补充(注意大小写)

  1. /* # 单总线代码片段说明
  2. 1. 本文件夹中提供的驱动代码供参赛选手完成程序设计参考。
  3. 2. 参赛选手可以自行编写相关代码或以该代码为基础,根据所选单片机类型、运行速度和试题
  4. 中对单片机时钟频率的要求,进行代码调试和修改。
  5. */
  6. //
  7. #include <REGX52.H>//自行添加头文件
  8. sbit DQ=P1^4;//对照原理图DS18B20接口补充
  9. void Delay_OneWire(unsigned int t)
  10. {
  11. unsigned char i;
  12. while(t--){
  13. for(i=0;i<12;i++);
  14. }
  15. }
  16. //
  17. void Write_DS18B20(unsigned char dat)
  18. {
  19. unsigned char i;
  20. for(i=0;i<8;i++)
  21. {
  22. DQ = 0;
  23. DQ = dat&0x01;
  24. Delay_OneWire(5);
  25. DQ = 1;
  26. dat >>= 1;
  27. }
  28. Delay_OneWire(5);
  29. }
  30. //
  31. unsigned char Read_DS18B20(void)
  32. {
  33. unsigned char i;
  34. unsigned char dat;
  35. for(i=0;i<8;i++)
  36. {
  37. DQ = 0;
  38. dat >>= 1;
  39. DQ = 1;
  40. if(DQ)
  41. {
  42. dat |= 0x80;
  43. }
  44. Delay_OneWire(5);
  45. }
  46. return dat;
  47. }
  48. //
  49. bit init_ds18b20(void)
  50. {
  51. bit initflag = 0;
  52. DQ = 1;
  53. Delay_OneWire(12);
  54. DQ = 0;
  55. Delay_OneWire(80);
  56. DQ = 1;
  57. Delay_OneWire(10);
  58. initflag = DQ;
  59. Delay_OneWire(5);
  60. return initflag;
  61. }

onewire.h

  1. #ifndef __ONEWIRE_H_
  2. #define __ONEWIRE_H_
  3. void Delay_OneWire(unsigned int t);
  4. void Write_DS18B20(unsigned char dat);
  5. unsigned char Read_DS18B20(void);
  6. bit init_ds18b20(void);
  7. #endif

为节省篇幅以下代码只给出新代码及其改动.

2.DS1302:

  1. /* # DS1302代码片段说明
  2. 1. 本文件夹中提供的驱动代码供参赛选手完成程序设计参考。
  3. 2. 参赛选手可以自行编写相关代码或以该代码为基础,根据所选单片机类型、运行速度和试题
  4. 中对单片机时钟频率的要求,进行代码调试和修改。
  5. */
  6. #include <REGX52.H>//自行添加
  7. #include <intrins.h>//由于使用nop,所以需要额外添加该头文件
  8. sbit SCK=P1^7;//对照原理图补充
  9. sbit SDA=P2^3;
  10. sbit RST=P1^3;
  11. //
  12. void Write_Ds1302(unsigned char temp)
  13. {
  14. unsigned char i;
  15. for (i=0;i<8;i++)
  16. {
  17. SCK = 0;
  18. SDA = temp&0x01;
  19. temp>>=1;
  20. SCK=1;
  21. }
  22. }
  23. //
  24. void Write_Ds1302_Byte( unsigned char address,unsigned char dat )
  25. {
  26. RST=0; _nop_();
  27. SCK=0; _nop_();
  28. RST=1; _nop_();
  29. Write_Ds1302(address);
  30. Write_Ds1302(dat);
  31. RST=0;
  32. }
  33. //
  34. unsigned char Read_Ds1302_Byte ( unsigned char address )
  35. {
  36. unsigned char i,temp=0x00;
  37. RST=0; _nop_();
  38. SCK=0; _nop_();
  39. RST=1; _nop_();
  40. Write_Ds1302(address);
  41. for (i=0;i<8;i++)
  42. {
  43. SCK=0;
  44. temp>>=1;
  45. if(SDA)
  46. temp|=0x80;
  47. SCK=1;
  48. }
  49. RST=0; _nop_();
  50. SCK=0; _nop_();
  51. SCK=1; _nop_();
  52. SDA=0; _nop_();
  53. SDA=1; _nop_();
  54. return (temp);
  55. }

ds1302.h

  1. #ifndef __DS1302_H
  2. #define __DS1302_H
  3. void Write_Ds1302(unsigned char temp);
  4. void Write_Ds1302_Byte( unsigned char address,unsigned char dat );
  5. unsigned char Read_Ds1302_Byte( unsigned char address );
  6. #endif
3.iic:

iic.c

 iic的代码我觉得是在名称方面改动最大的代码,所以在新老代码更替的时候需要特别注意,但如果编写新的主函数照旧即可

  1. /* # I2C代码片段说明
  2. 1. 本文件夹中提供的驱动代码供参赛选手完成程序设计参考。
  3. 2. 参赛选手可以自行编写相关代码或以该代码为基础,根据所选单片机类型、运行速度和试题
  4. 中对单片机时钟频率的要求,进行代码调试和修改。
  5. */
  6. #include <REGX52.H>
  7. #include "intrins.h"//代码中有nop代码
  8. #define DELAY_TIME 5
  9. sbit scl=P2^0;//对照原理图补充引脚
  10. sbit sda=P2^1;
  11. //老代码中还有读写地址的宏定义,但可以对照手册直接写出,加不加实际无所谓
  12. //
  13. static void I2C_Delay(unsigned char n)
  14. {
  15. do
  16. {
  17. _nop_();_nop_();_nop_();_nop_();_nop_();
  18. _nop_();_nop_();_nop_();_nop_();_nop_();
  19. _nop_();_nop_();_nop_();_nop_();_nop_();
  20. }
  21. while(n--);
  22. }
  23. //
  24. void I2CStart(void)
  25. {
  26. sda = 1;
  27. scl = 1;
  28. I2C_Delay(DELAY_TIME);
  29. sda = 0;
  30. I2C_Delay(DELAY_TIME);
  31. scl = 0;
  32. }
  33. //
  34. void I2CStop(void)
  35. {
  36. sda = 0;
  37. scl = 1;
  38. I2C_Delay(DELAY_TIME);
  39. sda = 1;
  40. I2C_Delay(DELAY_TIME);
  41. }
  42. //
  43. void I2CSendByte(unsigned char byt)
  44. {
  45. unsigned char i;
  46. for(i=0; i<8; i++){
  47. scl = 0;
  48. I2C_Delay(DELAY_TIME);
  49. if(byt & 0x80){
  50. sda = 1;
  51. }
  52. else{
  53. sda = 0;
  54. }
  55. I2C_Delay(DELAY_TIME);
  56. scl = 1;
  57. byt <<= 1;
  58. I2C_Delay(DELAY_TIME);
  59. }
  60. scl = 0;
  61. }
  62. //
  63. unsigned char I2CReceiveByte(void)
  64. {
  65. unsigned char da;
  66. unsigned char i;
  67. for(i=0;i<8;i++){
  68. scl = 1;
  69. I2C_Delay(DELAY_TIME);
  70. da <<= 1;
  71. if(sda)
  72. da |= 0x01;
  73. scl = 0;
  74. I2C_Delay(DELAY_TIME);
  75. }
  76. return da;
  77. }
  78. //
  79. unsigned char I2CWaitAck(void)
  80. {
  81. unsigned char ackbit;
  82. scl = 1;
  83. I2C_Delay(DELAY_TIME);
  84. ackbit = sda;
  85. scl = 0;
  86. I2C_Delay(DELAY_TIME);
  87. return ackbit;
  88. }
  89. //
  90. void I2CSendAck(unsigned char ackbit)
  91. {
  92. scl = 0;
  93. sda = ackbit;
  94. I2C_Delay(DELAY_TIME);
  95. scl = 1;
  96. I2C_Delay(DELAY_TIME);
  97. scl = 0;
  98. sda = 1;
  99. I2C_Delay(DELAY_TIME);
  100. }

iic.h

  1. #ifndef _IIC_H
  2. #define _IIC_H
  3. void I2CStart(void);
  4. void I2CStop(void);
  5. unsigned char I2CWaitAck(void);
  6. void I2CSendAck(unsigned char ackbit);
  7. void I2CSendByte(unsigned char byt);
  8. unsigned char I2CReceiveByte(void);
  9. #endif
3.总结:

在比赛中更换了驱动代码,但最具体实现还是由官方给出,只需对照原理图和已给出的代码进行补充和头文件的编写即可。

4.资料包下载地址:(来自蓝桥杯官网)

 第十四届蓝桥杯大赛个人赛省赛(电子类)选手资源数据包

链接: https://pan.baidu.com/s/1cDqH-5il_ca5lCBzMpnCEg 提取码:lq14

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小蓝xlanll/article/detail/430540
推荐阅读
相关标签
  

闽ICP备14008679号