单片机基础知识

冷不防 2024-04-24 23:18 134阅读 0赞

文章目录

  • 51单片机之点灯
  • 51单片机之灯的亮灭交替
  • 51单片机之灯的流水灯
  • 51单片机之数码管数字显示
  • 51单片机之数码管数字的流水灯
  • 51单片机之数码管数字的0-7显示
  • 51单片机之蜂鸣器的鸣叫与关闭
  • 51单片机之DS1302时钟设置
  • 51单片机之读出温度传感器温度
  • 代码模块化汇总
    • 主函数
      • main.c
    • 延时函数Delay
      • Delay.c
      • Delay.h
    • 矩阵键盘MatriXKey
      • MatriXKey.c
      • MatriXKey.h
    • 数码管NiXie
      • NiXie.c
      • NiXie.h
    • 时钟DS1302
      • DS1302.c
      • DS1302.h

51单片机之点灯

控制矩阵键盘的第一个按键,从而实现LED_1 电灯亮。

这里给出代码:

  1. KeyNum = MatriXie();
  2. if(KeyNum == 1)
  3. {
  4. LED_1=~LED_1;
  5. }

51单片机之灯的亮灭交替

控制矩阵键盘的第二个按键,从而实现LED_2电灯的5毫秒的亮灭交替。

这里给出代码:

  1. if(KeyNum == 2)
  2. {
  3. KeyNum = 0;
  4. while(1)
  5. {
  6. LED_1 = 0;
  7. Delay(100);
  8. LED_1 = 1;
  9. Delay(100);
  10. KeyNum = MatriXie();
  11. if(KeyNum == 2)
  12. {
  13. LED_1 = 1;
  14. break;
  15. }
  16. }
  17. }

51单片机之灯的流水灯

控制矩阵键盘的第三个按键,从而实现LED的流水灯效果,默认是从左到右流水灯,这里没说延迟多少,所以默认就是Delay(1000) ms。

流水灯这里可以补充一些基础的知识,就是P2 控制的是LED灯,所以只需要对P2 进行赋值16进制的数字即可。

这里给出代码:

  1. if(KeyNum == 3)
  2. {
  3. while(1)
  4. {
  5. P2 = 0xFE; // 1111 1110
  6. Delay(100);
  7. KeyNum = MatriXie();
  8. if(KeyNum == 3)
  9. {
  10. P2 = 0xFF;
  11. break;
  12. }
  13. P2 = 0xFD; // 1111 1101
  14. Delay(100);
  15. KeyNum = MatriXie();
  16. if(KeyNum == 3)
  17. {
  18. P2 = 0xFF;
  19. break;
  20. }
  21. P2 = 0xFB; // 1111 1011
  22. Delay(100);
  23. KeyNum = MatriXie();
  24. if(KeyNum == 3)
  25. {
  26. P2 = 0xFF;
  27. break;
  28. }
  29. P2 = 0xF7; // 1111 0111
  30. Delay(100);
  31. KeyNum = MatriXie();
  32. if(KeyNum == 3)
  33. {
  34. P2 = 0xFF;
  35. break;
  36. }
  37. P2 = 0xEF; // 1110 1111
  38. Delay(100);
  39. KeyNum = MatriXie();
  40. if(KeyNum == 3)
  41. {
  42. P2 = 0xFF;
  43. break;
  44. }
  45. P2 = 0xDF; // 1101 1111
  46. Delay(100);
  47. KeyNum = MatriXie();
  48. if(KeyNum == 3)
  49. {
  50. P2 = 0xFF;
  51. break;
  52. }
  53. P2 = 0xBF; // 1011 1111
  54. Delay(100);
  55. KeyNum = MatriXie();
  56. if(KeyNum == 3)
  57. {
  58. P2 = 0xFF;
  59. break;
  60. }
  61. P2 = 0x7F; // 0111 1111
  62. Delay(100);
  63. //flag=1;
  64. KeyNum = MatriXie();
  65. if(KeyNum == 3)
  66. {
  67. P2 = 0xFF;
  68. break;
  69. }
  70. }
  71. }

51单片机之数码管数字显示

控制矩阵键盘的第四个按键,从而实现数码管显示数字0。

数码管这里补充一些基础知识,就是数码管的数字显示是分为A、B、C、D、E、F、G 以及DP的,详细的可以查看下面这个图片来学习,(这个图片来自江科大的PPT),A、B、C、D对应的16进制的低四位,所以不难得出E、F、G、DP控制的是16进制的高四位。

这里给出代码:

  1. if(KeyNum == 4)
  2. {
  3. KeyNum = 0;
  4. P2_4 = 1;
  5. P2_3 = 1;
  6. P2_2 = 1;
  7. while(1)
  8. {
  9. P0 = 0x66; // 0111 1101
  10. KeyNum = MatriXie();
  11. if(KeyNum == 4)
  12. {
  13. P0 = 0xFF;
  14. break;
  15. }
  16. }
  17. }

51单片机之数码管数字的流水灯

控制矩阵键盘的第五个按键,从而实现数码管显示数字0,并且进行“流水灯”的效果,这里显然很简单,可以封装一个函数NiXie来表示数码管在哪一个位置显示哪一个数字,然后去Delay多少毫秒,就可以完成流水灯的效果。

这里给出代码:

  1. if(KeyNum == 5)
  2. {
  3. KeyNum = 0;
  4. while(1)
  5. {
  6. NiXie(1,4);
  7. Delay(100);
  8. KeyNum = MatriXie();
  9. if(KeyNum == 5)
  10. {
  11. P2_4 = 1;
  12. P2_3 = 1;
  13. P2_2 = 1;
  14. P0 = 0xFF;
  15. break;
  16. }
  17. NiXie(2,4);
  18. Delay(100);
  19. KeyNum = MatriXie();
  20. if(KeyNum == 5)
  21. {
  22. P2_4 = 1;
  23. P2_3 = 1;
  24. P2_2 = 1;
  25. P0 = 0xFF;
  26. break;
  27. }
  28. NiXie(3,4);
  29. Delay(100);
  30. KeyNum = MatriXie();
  31. if(KeyNum == 5)
  32. {
  33. P2_4 = 1;
  34. P2_3 = 1;
  35. P2_2 = 1;
  36. P0 = 0xFF;
  37. break;
  38. }
  39. NiXie(4,4);
  40. Delay(100);
  41. KeyNum = MatriXie();
  42. if(KeyNum == 5)
  43. {
  44. P2_4 = 1;
  45. P2_3 = 1;
  46. P2_2 = 1;
  47. P0 = 0xFF;
  48. break;
  49. }
  50. NiXie(5,4);
  51. Delay(100);
  52. KeyNum = MatriXie();
  53. if(KeyNum == 5)
  54. {
  55. P2_4 = 1;
  56. P2_3 = 1;
  57. P2_2 = 1;
  58. P0 = 0xFF;
  59. break;
  60. }
  61. NiXie(6,4);
  62. Delay(100);
  63. KeyNum = MatriXie();
  64. if(KeyNum == 5)
  65. {
  66. P2_4 = 1;
  67. P2_3 = 1;
  68. P2_2 = 1;
  69. P0 = 0xFF;
  70. break;
  71. }
  72. NiXie(7,4);
  73. Delay(100);
  74. KeyNum = MatriXie();
  75. if(KeyNum == 5)
  76. {
  77. P2_4 = 1;
  78. P2_3 = 1;
  79. P2_2 = 1;
  80. P0 = 0xFF;
  81. break;
  82. }
  83. NiXie(8,4);
  84. Delay(100);
  85. KeyNum = MatriXie();
  86. if(KeyNum == 5)
  87. {
  88. P2_4 = 1;
  89. P2_3 = 1;
  90. P2_2 = 1;
  91. P0 = 0xFF;
  92. break;
  93. }
  94. }
  95. }

51单片机之数码管数字的0-7显示

控制矩阵键盘的第六个按键,这道题更是送分题了,没什么思考难度,直接不断调用NiXie函数去显示数码管即可。

这里给出代码:

  1. if(KeyNum == 6)
  2. {
  3. KeyNum = 0;
  4. while(1)
  5. {
  6. NiXie(1,0);
  7. NiXie(2,1);
  8. NiXie(3,2);
  9. NiXie(4,3);
  10. NiXie(5,4);
  11. NiXie(6,5);
  12. NiXie(7,6);
  13. NiXie(8,7);
  14. KeyNum = MatriXie();
  15. if(KeyNum == 6)
  16. {
  17. P2_4 = 1;
  18. P2_3 = 1;
  19. P2_2 = 1;
  20. P0 = 0xFF;
  21. break;
  22. }
  23. }
  24. }

51单片机之蜂鸣器的鸣叫与关闭

控制矩阵键盘的第七个按键,从而实现蜂鸣器的鸣叫,再次按下第七个按键,实现蜂鸣器的关闭。

蜂鸣器这里补充一些基础知识,蜂鸣器,我的理解就是不断的在一定的振幅改变下才去鸣叫,所以可以利用一个for循环来触发蜂鸣器的鸣叫

这里给出代码:

  1. if(KeyNum == 7)
  2. {
  3. KeyNum = 0;
  4. while(1)
  5. {
  6. BuzzerTime();
  7. Delay(1);
  8. KeyNum = MatriXie();
  9. if(KeyNum == 7)
  10. {
  11. BuzzerTime();
  12. break;
  13. }
  14. }
  15. }

51单片机之DS1302时钟设置

控制矩阵键盘的第八个按键,从而实现DS1302时钟功能,让数码管显示时钟,并且秒是可以动的,可以进位到分钟,小时,所以这道题目是很困难的,也是江科大UP主讲了好长时间的课程,一节课1.5h总共两节课,给我学的很困哈哈哈哈不过多学的话就会了。

这里给出代码:

  1. //main函数
  2. if(KeyNum == 8)
  3. {
  4. DS1302_SetTime();
  5. KeyNum = 0;
  6. while(1)
  7. {
  8. DS1302_ReadTime();
  9. NiXie(1,DS1302_Time[0]/10);
  10. NiXie(2,DS1302_Time[0]%10);
  11. NiXie(3,10);
  12. NiXie(4,DS1302_Time[1]/10);
  13. NiXie(5,DS1302_Time[1]%10);
  14. NiXie(6,10);
  15. NiXie(7,DS1302_Time[2]/10);
  16. NiXie(8,DS1302_Time[2]%10);
  17. KeyNum = MatriXie();
  18. if(KeyNum == 8)
  19. {
  20. P2_2 = 1;
  21. P2_3 = 1;
  22. P2_4 = 1;
  23. P0 = 0xFF;
  24. break;
  25. }
  26. }
  27. }

51单片机之读出温度传感器温度

控制矩阵键盘的第九个按键,从而实现温度传感器读取温度的功能,这道题我当时没有写出来是因为这里我学的不够扎实,当时并没有思路去写出来这个题目。。。。看看小伙伴谁会写的话可以给大家讲出来。

代码模块化汇总

主函数

main.c

  1. #include <REGX52.H>
  2. #include "Delay.h"
  3. #include "MatriXie.h"
  4. #include "NiXie.h"
  5. #include "BuzzerTime.h"
  6. #include "DS1302.h"
  7. //定义LED
  8. sbit LED_1 = P2^0;
  9. sbit LED_2 = P2^1;
  10. sbit LED_3 = P2^2;
  11. sbit LED_4 = P2^3;
  12. sbit LED_5 = P2^4;
  13. sbit LED_6 = P2^5;
  14. sbit LED_7 = P2^6;
  15. sbit LED_8 = P2^7;
  16. //定义独立按键
  17. sbit K_3 = P3^2;
  18. sbit K_4 = P3^3;
  19. sbit K_2 = P3^0;
  20. sbit K1 = P3^1;
  21. unsigned char KeyNum,flag=0;
  22. void main()
  23. {
  24. //P2 = 0xFE; // 1111 0111
  25. while(1)
  26. {
  27. KeyNum = MatriXie();
  28. if(KeyNum == 1)
  29. {
  30. LED_1=~LED_1;
  31. }
  32. if(KeyNum == 2)
  33. {
  34. KeyNum = 0;
  35. while(1)
  36. {
  37. LED_1 = 0;
  38. Delay(100);
  39. LED_1 = 1;
  40. Delay(100);
  41. KeyNum = MatriXie();
  42. if(KeyNum == 2)
  43. {
  44. LED_1 = 1;
  45. break;
  46. }
  47. }
  48. }
  49. if(KeyNum == 3)
  50. {
  51. while(1)
  52. {
  53. P2 = 0xFE; // 1111 1110
  54. Delay(100);
  55. KeyNum = MatriXie();
  56. if(KeyNum == 3)
  57. {
  58. P2 = 0xFF;
  59. break;
  60. }
  61. P2 = 0xFD; // 1111 1101
  62. Delay(100);
  63. KeyNum = MatriXie();
  64. if(KeyNum == 3)
  65. {
  66. P2 = 0xFF;
  67. break;
  68. }
  69. P2 = 0xFB; // 1111 1011
  70. Delay(100);
  71. KeyNum = MatriXie();
  72. if(KeyNum == 3)
  73. {
  74. P2 = 0xFF;
  75. break;
  76. }
  77. P2 = 0xF7; // 1111 0111
  78. Delay(100);
  79. KeyNum = MatriXie();
  80. if(KeyNum == 3)
  81. {
  82. P2 = 0xFF;
  83. break;
  84. }
  85. P2 = 0xEF; // 1110 1111
  86. Delay(100);
  87. KeyNum = MatriXie();
  88. if(KeyNum == 3)
  89. {
  90. P2 = 0xFF;
  91. break;
  92. }
  93. P2 = 0xDF; // 1101 1111
  94. Delay(100);
  95. KeyNum = MatriXie();
  96. if(KeyNum == 3)
  97. {
  98. P2 = 0xFF;
  99. break;
  100. }
  101. P2 = 0xBF; // 1011 1111
  102. Delay(100);
  103. KeyNum = MatriXie();
  104. if(KeyNum == 3)
  105. {
  106. P2 = 0xFF;
  107. break;
  108. }
  109. P2 = 0x7F; // 0111 1111
  110. Delay(100);
  111. //flag=1;
  112. KeyNum = MatriXie();
  113. if(KeyNum == 3)
  114. {
  115. P2 = 0xFF;
  116. break;
  117. }
  118. }
  119. }
  120. if(KeyNum == 4)
  121. {
  122. KeyNum = 0;
  123. P2_4 = 1;
  124. P2_3 = 1;
  125. P2_2 = 1;
  126. while(1)
  127. {
  128. P0 = 0x66; // 0111 1101
  129. KeyNum = MatriXie();
  130. if(KeyNum == 4)
  131. {
  132. P0 = 0xFF;
  133. break;
  134. }
  135. }
  136. }
  137. if(KeyNum == 5)
  138. {
  139. KeyNum = 0;
  140. while(1)
  141. {
  142. NiXie(1,4);
  143. Delay(100);
  144. KeyNum = MatriXie();
  145. if(KeyNum == 5)
  146. {
  147. P2_4 = 1;
  148. P2_3 = 1;
  149. P2_2 = 1;
  150. P0 = 0xFF;
  151. break;
  152. }
  153. NiXie(2,4);
  154. Delay(100);
  155. KeyNum = MatriXie();
  156. if(KeyNum == 5)
  157. {
  158. P2_4 = 1;
  159. P2_3 = 1;
  160. P2_2 = 1;
  161. P0 = 0xFF;
  162. break;
  163. }
  164. NiXie(3,4);
  165. Delay(100);
  166. KeyNum = MatriXie();
  167. if(KeyNum == 5)
  168. {
  169. P2_4 = 1;
  170. P2_3 = 1;
  171. P2_2 = 1;
  172. P0 = 0xFF;
  173. break;
  174. }
  175. NiXie(4,4);
  176. Delay(100);
  177. KeyNum = MatriXie();
  178. if(KeyNum == 5)
  179. {
  180. P2_4 = 1;
  181. P2_3 = 1;
  182. P2_2 = 1;
  183. P0 = 0xFF;
  184. break;
  185. }
  186. NiXie(5,4);
  187. Delay(100);
  188. KeyNum = MatriXie();
  189. if(KeyNum == 5)
  190. {
  191. P2_4 = 1;
  192. P2_3 = 1;
  193. P2_2 = 1;
  194. P0 = 0xFF;
  195. break;
  196. }
  197. NiXie(6,4);
  198. Delay(100);
  199. KeyNum = MatriXie();
  200. if(KeyNum == 5)
  201. {
  202. P2_4 = 1;
  203. P2_3 = 1;
  204. P2_2 = 1;
  205. P0 = 0xFF;
  206. break;
  207. }
  208. NiXie(7,4);
  209. Delay(100);
  210. KeyNum = MatriXie();
  211. if(KeyNum == 5)
  212. {
  213. P2_4 = 1;
  214. P2_3 = 1;
  215. P2_2 = 1;
  216. P0 = 0xFF;
  217. break;
  218. }
  219. NiXie(8,4);
  220. Delay(100);
  221. KeyNum = MatriXie();
  222. if(KeyNum == 5)
  223. {
  224. P2_4 = 1;
  225. P2_3 = 1;
  226. P2_2 = 1;
  227. P0 = 0xFF;
  228. break;
  229. }
  230. }
  231. }
  232. if(KeyNum == 6)
  233. {
  234. KeyNum = 0;
  235. while(1)
  236. {
  237. NiXie(1,0);
  238. NiXie(2,1);
  239. NiXie(3,2);
  240. NiXie(4,3);
  241. NiXie(5,4);
  242. NiXie(6,5);
  243. NiXie(7,6);
  244. NiXie(8,7);
  245. KeyNum = MatriXie();
  246. if(KeyNum == 6)
  247. {
  248. P2_4 = 1;
  249. P2_3 = 1;
  250. P2_2 = 1;
  251. P0 = 0xFF;
  252. break;
  253. }
  254. }
  255. }
  256. if(KeyNum == 7)
  257. {
  258. KeyNum = 0;
  259. while(1)
  260. {
  261. BuzzerTime();
  262. Delay(1);
  263. KeyNum = MatriXie();
  264. if(KeyNum == 7)
  265. {
  266. BuzzerTime();
  267. break;
  268. }
  269. }
  270. }
  271. if(KeyNum == 8)
  272. {
  273. DS1302_SetTime();
  274. KeyNum = 0;
  275. while(1)
  276. {
  277. DS1302_ReadTime();
  278. NiXie(1,DS1302_Time[0]/10);
  279. NiXie(2,DS1302_Time[0]%10);
  280. NiXie(3,10);
  281. NiXie(4,DS1302_Time[1]/10);
  282. NiXie(5,DS1302_Time[1]%10);
  283. NiXie(6,10);
  284. NiXie(7,DS1302_Time[2]/10);
  285. NiXie(8,DS1302_Time[2]%10);
  286. KeyNum = MatriXie();
  287. if(KeyNum == 8)
  288. {
  289. P2_2 = 1;
  290. P2_3 = 1;
  291. P2_4 = 1;
  292. P0 = 0xFF;
  293. break;
  294. }
  295. }
  296. }
  297. }
  298. }

延时函数Delay

Delay.c

  1. void Delay1ms(void) //@12.000MHz
  2. {
  3. unsigned char data i, j;
  4. i = 2;
  5. j = 239;
  6. do
  7. {
  8. while (--j);
  9. } while (--i);
  10. }
  11. void Delay(unsigned int x)
  12. {
  13. while(x--)
  14. {
  15. Delay1ms();
  16. }
  17. }

Delay.h

  1. void Delay1ms(void);
  2. void Delay(unsigned int x);

矩阵键盘MatriXKey

MatriXKey.c

  1. #include <REGX52.H>
  2. #include "Delay.h"
  3. unsigned int MatriXie()
  4. {
  5. unsigned char KeyNumber = 0;
  6. P1 = 0xFF;
  7. P1_7 = 0;
  8. if(P1_3 == 0) {
  9. Delay(20);while(P1_3==0);Delay(20);KeyNumber=1;}
  10. if(P1_2 == 0) {
  11. Delay(20);while(P1_2==0);Delay(20);KeyNumber=2;}
  12. if(P1_1 == 0) {
  13. Delay(20);while(P1_1==0);Delay(20);KeyNumber=3;}
  14. if(P1_0 == 0) {
  15. Delay(20);while(P1_0==0);Delay(20);KeyNumber=4;}
  16. P1 = 0xFF;
  17. P1_6 = 0;
  18. if(P1_3 == 0) {
  19. Delay(20);while(P1_3==0);Delay(20);KeyNumber=5;}
  20. if(P1_2 == 0) {
  21. Delay(20);while(P1_2==0);Delay(20);KeyNumber=6;}
  22. if(P1_1 == 0) {
  23. Delay(20);while(P1_1==0);Delay(20);KeyNumber=7;}
  24. if(P1_0 == 0) {
  25. Delay(20);while(P1_0==0);Delay(20);KeyNumber=8;}
  26. P1 = 0xFF;
  27. P1_5 = 0;
  28. if(P1_3 == 0) {
  29. Delay(20);while(P1_3==0);Delay(20);KeyNumber=9;}
  30. if(P1_2 == 0) {
  31. Delay(20);while(P1_2==0);Delay(20);KeyNumber=10;}
  32. if(P1_1 == 0) {
  33. Delay(20);while(P1_1==0);Delay(20);KeyNumber=11;}
  34. if(P1_0 == 0) {
  35. Delay(20);while(P1_0==0);Delay(20);KeyNumber=12;}
  36. P1 = 0xFF;
  37. P1_4 = 0;
  38. if(P1_3 == 0) {
  39. Delay(20);while(P1_3==0);Delay(20);KeyNumber=13;}
  40. if(P1_2 == 0) {
  41. Delay(20);while(P1_2==0);Delay(20);KeyNumber=14;}
  42. if(P1_1 == 0) {
  43. Delay(20);while(P1_1==0);Delay(20);KeyNumber=15;}
  44. if(P1_0 == 0) {
  45. Delay(20);while(P1_0==0);Delay(20);KeyNumber=16;}
  46. return KeyNumber;
  47. }

MatriXKey.h

  1. unsigned int MatriXie(void);

数码管NiXie

NiXie.c

  1. #include <REGX52.H>
  2. #include "Delay.h"
  3. #include "MatriXie.h"
  4. #include "NiXie.h"
  5. unsigned char NiXieTable[]={
  6. 0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x40};
  7. void NiXie(unsigned char pos,unsigned char number)
  8. {
  9. switch(pos)
  10. {
  11. case 1:P2_4=1;P2_3=1;P2_2=1;break;
  12. case 2:P2_4=1;P2_3=1;P2_2=0;break;
  13. case 3:P2_4=1;P2_3=0;P2_2=1;break;
  14. case 4:P2_4=1;P2_3=0;P2_2=0;break;
  15. case 5:P2_4=0;P2_3=1;P2_2=1;break;
  16. case 6:P2_4=0;P2_3=1;P2_2=0;break;
  17. case 7:P2_4=0;P2_3=0;P2_2=1;break;
  18. case 8:P2_4=0;P2_3=0;P2_2=0;break;
  19. }
  20. P0 = NiXieTable[number];
  21. Delay(1);//显示一段时间//消影
  22. //P0 = 0x00;
  23. }

NiXie.h

  1. void NiXie(unsigned char pos,unsigned char number);

时钟DS1302

DS1302.c

  1. #include <REGX52.H>
  2. //引脚定义
  3. sbit DS1302_SCLK=P3^6;
  4. sbit DS1302_IO=P3^4;
  5. sbit DS1302_CE=P3^5;
  6. //寄存器写入地址/指令定义
  7. #define DS1302_SECOND 0x80
  8. #define DS1302_MINUTE 0x82
  9. #define DS1302_HOUR 0x84
  10. #define DS1302_DATE 0x86
  11. #define DS1302_MONTH 0x88
  12. #define DS1302_DAY 0x8A
  13. #define DS1302_YEAR 0x8C
  14. #define DS1302_WP 0x8E
  15. //时间数组,索引0~6分别为年、月、日、时、分、秒、星期
  16. unsigned char DS1302_Time[]={
  17. 15,22,00};
  18. /**
  19. * @brief DS1302初始化
  20. * @param 无
  21. * @retval 无
  22. */
  23. void DS1302_Init(void)
  24. {
  25. DS1302_CE=0;
  26. DS1302_SCLK=0;
  27. }
  28. /**
  29. * @brief DS1302写一个字节
  30. * @param Command 命令字/地址
  31. * @param Data 要写入的数据
  32. * @retval 无
  33. */
  34. void DS1302_WriteByte(unsigned char Command,Data)
  35. {
  36. unsigned char i;
  37. DS1302_CE=1;
  38. for(i=0;i<8;i++)
  39. {
  40. DS1302_IO=Command&(0x01<<i);
  41. DS1302_SCLK=1;
  42. DS1302_SCLK=0;
  43. }
  44. for(i=0;i<8;i++)
  45. {
  46. DS1302_IO=Data&(0x01<<i);
  47. DS1302_SCLK=1;
  48. DS1302_SCLK=0;
  49. }
  50. DS1302_CE=0;
  51. }
  52. /**
  53. * @brief DS1302读一个字节
  54. * @param Command 命令字/地址
  55. * @retval 读出的数据
  56. */
  57. unsigned char DS1302_ReadByte(unsigned char Command)
  58. {
  59. unsigned char i,Data=0x00;
  60. Command|=0x01; //将指令转换为读指令
  61. DS1302_CE=1;
  62. for(i=0;i<8;i++)
  63. {
  64. DS1302_IO=Command&(0x01<<i);
  65. DS1302_SCLK=0;
  66. DS1302_SCLK=1;
  67. }
  68. for(i=0;i<8;i++)
  69. {
  70. DS1302_SCLK=1;
  71. DS1302_SCLK=0;
  72. if(DS1302_IO){
  73. Data|=(0x01<<i);}
  74. }
  75. DS1302_CE=0;
  76. DS1302_IO=0; //读取后将IO设置为0,否则读出的数据会出错
  77. return Data;
  78. }
  79. /**
  80. * @brief DS1302设置时间,调用之后,DS1302_Time数组的数字会被设置到DS1302中
  81. * @param 无
  82. * @retval 无
  83. */
  84. void DS1302_SetTime(void)
  85. {
  86. DS1302_WriteByte(DS1302_WP,0x00);
  87. DS1302_WriteByte(DS1302_HOUR,DS1302_Time[0]/10*16+DS1302_Time[0]%10);
  88. DS1302_WriteByte(DS1302_MINUTE,DS1302_Time[1]/10*16+DS1302_Time[1]%10);
  89. DS1302_WriteByte(DS1302_SECOND,DS1302_Time[2]/10*16+DS1302_Time[2]%10);
  90. DS1302_WriteByte(DS1302_WP,0x80);
  91. }
  92. /**
  93. * @brief DS1302读取时间,调用之后,DS1302中的数据会被读取到DS1302_Time数组中
  94. * @param 无
  95. * @retval 无
  96. */
  97. void DS1302_ReadTime(void)
  98. {
  99. unsigned char Temp;;
  100. Temp=DS1302_ReadByte(DS1302_HOUR);
  101. DS1302_Time[0]=Temp/16*10+Temp%16;
  102. Temp=DS1302_ReadByte(DS1302_MINUTE);
  103. DS1302_Time[1]=Temp/16*10+Temp%16;
  104. Temp=DS1302_ReadByte(DS1302_SECOND);
  105. DS1302_Time[2]=Temp/16*10+Temp%16;
  106. }

DS1302.h

  1. #ifndef __DS1302_H__
  2. #define __DS1302_H__
  3. //外部可调用时间数组,索引0~6分别为年、月、日、时、分、秒、星期
  4. extern unsigned char DS1302_Time[];
  5. void DS1302_Init(void);
  6. void DS1302_WriteByte(unsigned char Command,Data);
  7. unsigned char DS1302_ReadByte(unsigned char Command);
  8. void DS1302_SetTime(void);
  9. void DS1302_ReadTime(void);
  10. #endif

在这里插入图片描述

  1. ? [ 笔者 ] 夏目浅石.
  2. ? [ 更新 ] 2024.1
  3. [ 勘误 ] /* 暂无 */
  4. ? [ 声明 ] 由于作者水平有限,本文有错误和不准确之处在所难免,
  5. 本人也很想知道这些错误,恳望读者批评指正!

? 参考文献:

B站江科大51单片机入门视频
AYIT嵌入式实验室出题
CSDN嵌入式领域博主:謓泽(学习笔记超级建议看这位大佬的博客,复习很快,学习视频的成本也会低)

在这里插入图片描述如果侵权,请联系作者夏目浅石,立刻删除

发表评论

表情:
评论列表 (有 0 条评论,134人围观)

还没有评论,来说两句吧...

相关阅读

    相关 单片机==回顾基础

      作为一个学硬件的学生,我感觉自己实在是太弱了,由于硬件的学习成本较高,一直以来我都是在自己写一些偏软件方面的小项目,对硬件的了解也仅限于学校的课堂了。   在我的感觉中,