首页 最新 热门 推荐

  • 首页
  • 最新
  • 热门
  • 推荐

蓝桥杯第十五届省赛单片机组真题及相关代码(基于西风代码)

  • 25-03-07 21:43
  • 2177
  • 6512
blog.csdn.net

题目分析

1.各模块分析

        本次蓝桥杯程序设计题难度相比去年有了明显的下降,大部分功能比较常规(如按键模块没有出现要求长按,多击等形式),主要考的模块包括:数码管,按键,led, DAC输出电压 ,频率测量,ds1302时钟芯片模块。

2.重难点分析

        其中重点在于频率的测量与显示,所以按键模块不能对P34引脚做手脚(因为是用P34来进行频率测量的会导致误差)。

        本次比赛存在设置校准值(有负有正)对实际频率进行矫正(第十四届国赛考点),我是选择设置一个标志位变量来判断频率校准值为正还是负,就可以把测量的频率变量定义为unsigned int 类型来实现频率上限的增加(如果定义成int类型在加上校准值的话可能会存在溢出的问题),还有比较基本的,所有参数真正意义上的修改只有在退出参数界面才能实现(西风哥的视频有讲)。

        然后再扣一点细节的话,就是数码管的减速变量的值应当选择100以下(题目要求,响应时间<0.1s),但具体会不会影响很大也是不到嘞。

  1. if(++Key_Slow_Down==10){Key_Slow_Down=0;} //每10ms检测按键
  2. if(++Seg_Slow_Down==100){Seg_Slow_Down=0;} //每100ms检测数码管

小白代码参考

(由于是比赛时写的,加上作者还是小白,也许仍然存在一些缺陷,欢迎指正批评!)

1. main.c

  1. #include
  2. #include "Seg.h"
  3. #include "Key.h"
  4. #include "Led.h"
  5. #include "iic.h"
  6. #include "ds1302.h"
  7. #include "intrins.h"
  8. unsigned char Key_Val,Key_Down,Key_Up,Key_Old; //按键相关变量
  9. unsigned char Key_Slow_Down; //按键减速变量
  10. unsigned char Seg_Buf[8]={16,16,16,16,16,16,16,16}; //数码管各位置数据
  11. unsigned char Seg_Point[8]={0,0,0,0,0,0,0,0}; //数码管各位置小数点亮灭情况
  12. unsigned int Seg_Slow_Down; //数码管减速变量
  13. unsigned char Seg_Pos; //数码管位置
  14. unsigned char Led_Buf[8]={0,0,0,0,0,0,0,0}; //led显示情况
  15. bit Dat_Mode=0; //参数界面切换 0是参数 1是校准值
  16. bit Dat_Flag=0; //判断参数是正还是负 0是正 1是负
  17. bit Final_Flag=0; //回显模式的变换 0是最大频率 1记录时间
  18. bit Error_Flag=0; //判断是否错误中间变量
  19. bit Error_Real=0; //判断是否错误变量
  20. unsigned char Mode_Show=0; //总模式切换
  21. unsigned int Freq_Set=2000; //设置的频率参数
  22. unsigned int Freq_Set_Temp=2000; //设置的频率参数中间变量
  23. unsigned int Freq_Fix=0; //设置的频率校准值
  24. unsigned int Freq_Fix_Temp=0; //设置的频率校准值中间变量
  25. unsigned int Freq; //测量得到的频率
  26. unsigned int Freq_Max=0; //频率最大值
  27. unsigned char Time[3]={0x05,0x02,0x13}; //存放时间变量
  28. unsigned char Max_Time[3]={0,0,0}; //存放频率最大值的时间数组
  29. unsigned int Time_1s=0; //用于每1秒读取频率
  30. unsigned char Time_200ms=0; //用于灯闪烁
  31. unsigned char Time_200ms_L1=0; //用于灯闪烁
  32. void Key_Proc()
  33. {
  34. if(Key_Slow_Down)
  35. {
  36. return;
  37. }
  38. Key_Slow_Down=1;
  39. Key_Val=Key_Choose();
  40. Key_Down=Key_Val & (Key_Old ^ Key_Val);
  41. Key_Up=~Key_Val & (Key_Old ^ Key_Val);
  42. Key_Old=Key_Val;
  43. switch(Key_Down)
  44. {
  45. case 4:
  46. if(++Mode_Show==4)
  47. {
  48. Mode_Show=0;
  49. }
  50. break;
  51. case 5:
  52. if(Mode_Show==1)
  53. {
  54. Dat_Mode^=1;
  55. }
  56. else if(Mode_Show==3)
  57. {
  58. Final_Flag^=1;
  59. }
  60. break;
  61. case 8:
  62. if(Mode_Show==1)
  63. {
  64. if(Dat_Mode==0)
  65. {
  66. Freq_Set_Temp+=1000;
  67. if(Freq_Set_Temp>9000)
  68. {
  69. Freq_Set_Temp=9000;
  70. }
  71. }
  72. else if(Dat_Mode==1)
  73. {
  74. if(Dat_Flag==0)
  75. {
  76. Freq_Fix_Temp+=100;
  77. }
  78. if(Dat_Flag==1&&Freq_Fix_Temp<=100)
  79. {
  80. Freq_Fix_Temp-=100;
  81. Dat_Flag=0;
  82. }
  83. if(Dat_Flag==1&&Freq_Fix_Temp>100)
  84. {
  85. Freq_Fix_Temp-=100;
  86. }
  87. if(Freq_Fix_Temp>900)
  88. {
  89. Freq_Fix_Temp=900;
  90. }
  91. }
  92. }
  93. break;
  94. case 9:
  95. if(Mode_Show==1)
  96. {
  97. if(Dat_Mode==0)
  98. {
  99. Freq_Set_Temp-=1000;
  100. if(Freq_Set_Temp<1000)
  101. {
  102. Freq_Set_Temp=1000;
  103. }
  104. }
  105. else if(Dat_Mode==1)
  106. {
  107. if(Dat_Flag==1&&Freq_Fix_Temp>=100)
  108. {
  109. Freq_Fix_Temp+=100;
  110. }
  111. if(Dat_Flag==0&&Freq_Fix_Temp<100)
  112. {
  113. Dat_Flag=1;
  114. Freq_Fix_Temp+=100;
  115. }
  116. if(Dat_Flag==0&&Freq_Fix_Temp>=100)
  117. {
  118. Freq_Fix_Temp-=100;
  119. }
  120. if(Freq_Fix_Temp>900)
  121. {
  122. Freq_Fix_Temp=900;
  123. }
  124. }
  125. }
  126. break;
  127. }
  128. }
  129. void Seg_Proc()
  130. {
  131. if(Seg_Slow_Down)
  132. {
  133. return;
  134. }
  135. Seg_Slow_Down=1;
  136. Ds1302_Read(Time);
  137. switch(Mode_Show)
  138. {
  139. case 0:
  140. if(Error_Flag==0)
  141. {
  142. Seg_Buf[0]=15;
  143. Seg_Buf[1]=16;
  144. Seg_Buf[2]=16;
  145. if(Freq/10000==0)
  146. {
  147. Seg_Buf[3]=16;
  148. }
  149. else
  150. {
  151. Seg_Buf[3]=Freq/10000;
  152. }
  153. if(Freq/10000==0&&Freq/1000%10==0)
  154. {
  155. Seg_Buf[4]=16;
  156. }
  157. else
  158. {
  159. Seg_Buf[4]=Freq/1000%10;
  160. }
  161. if(Freq/100%10==0&&Freq/10000==0&&Freq/1000%10==0)
  162. {
  163. Seg_Buf[5]=16;
  164. }
  165. else
  166. {
  167. Seg_Buf[5]=Freq/100%10;
  168. }
  169. if(Freq/10%10==0&&Freq/100%10==0&&Freq/10000==0&&Freq/1000%10==0)
  170. {
  171. Seg_Buf[6]=16;
  172. }
  173. else
  174. {
  175. Seg_Buf[6]=Freq/10%10;
  176. }
  177. Seg_Buf[7]=Freq%10;
  178. }
  179. else if(Error_Flag==1)
  180. {
  181. Seg_Buf[0]=15;
  182. Seg_Buf[1]=16;
  183. Seg_Buf[2]=16;
  184. Seg_Buf[3]=16;
  185. Seg_Buf[4]=16;
  186. Seg_Buf[5]=16;
  187. Seg_Buf[6]=20;
  188. Seg_Buf[7]=20;
  189. }
  190. break;
  191. case 1:
  192. if(Dat_Mode==0)
  193. {
  194. Seg_Buf[0]=19;
  195. Seg_Buf[1]=1;
  196. Seg_Buf[2]=16;
  197. Seg_Buf[3]=16;
  198. Seg_Buf[4]=Freq_Set_Temp/1000;
  199. Seg_Buf[5]=Freq_Set_Temp/100%10;
  200. Seg_Buf[6]=Freq_Set_Temp/10%10;
  201. Seg_Buf[7]=Freq_Set_Temp%10;
  202. }
  203. else if(Dat_Mode==1)
  204. {
  205. Seg_Buf[0]=19;
  206. Seg_Buf[1]=2;
  207. Seg_Buf[2]=16;
  208. Seg_Buf[3]=16;
  209. if(Dat_Flag==0)
  210. {
  211. Seg_Buf[4]=16;
  212. }
  213. if(Dat_Flag==1)
  214. {
  215. Seg_Buf[4]=17;
  216. }
  217. if(Freq_Fix_Temp/100%10==0)
  218. {
  219. Seg_Buf[5]=16;
  220. }
  221. else
  222. {
  223. Seg_Buf[5]=Freq_Fix_Temp/100%10;
  224. }
  225. if(Freq_Set_Temp/10%10==0&&Freq_Fix_Temp/100%10==0)
  226. {
  227. Seg_Buf[6]=16;
  228. }
  229. else
  230. {
  231. Seg_Buf[6]=Freq_Set_Temp/10%10;
  232. }
  233. Seg_Buf[7]=Freq_Set_Temp%10;
  234. }
  235. break;
  236. case 2:
  237. Seg_Buf[0]=Time[2]/16;
  238. Seg_Buf[1]=Time[2]%16;
  239. Seg_Buf[2]=17;
  240. Seg_Buf[3]=Time[1]/16;
  241. Seg_Buf[4]=Time[1]%16;
  242. Seg_Buf[5]=17;
  243. Seg_Buf[6]=Time[0]/16;
  244. Seg_Buf[7]=Time[0]%16;
  245. break;
  246. case 3:
  247. if(Final_Flag==0)
  248. {
  249. Seg_Buf[0]=18;
  250. Seg_Buf[1]=15;
  251. Seg_Buf[2]=16;
  252. if(Freq_Max/10000==0)
  253. {
  254. Seg_Buf[3]=16;
  255. }
  256. else
  257. {
  258. Seg_Buf[3]=Freq_Max/10000;
  259. }
  260. if(Freq_Max/10000==0&&Freq_Max/1000%10==0)
  261. {
  262. Seg_Buf[4]=16;
  263. }
  264. else
  265. {
  266. Seg_Buf[4]=Freq_Max/1000%10;
  267. }
  268. if(Freq_Max/100%10==0&&Freq_Max/10000==0&&Freq_Max/1000%10==0)
  269. {
  270. Seg_Buf[5]=16;
  271. }
  272. else
  273. {
  274. Seg_Buf[5]=Freq_Max/100%10;
  275. }
  276. if(Freq_Max/10%10==0&&Freq_Max/100%10==0&&Freq_Max/10000==0&&Freq_Max/1000%10==0)
  277. {
  278. Seg_Buf[6]=16;
  279. }
  280. else
  281. {
  282. Seg_Buf[6]=Freq_Max/10%10;
  283. }
  284. Seg_Buf[7]=Freq_Max%10;
  285. }
  286. else if(Final_Flag==1)
  287. {
  288. Seg_Buf[0]=18;
  289. Seg_Buf[1]=10;
  290. Seg_Buf[2]=Max_Time[2]/16;
  291. Seg_Buf[3]=Max_Time[2]%16;
  292. Seg_Buf[4]=Max_Time[1]/16;
  293. Seg_Buf[5]=Max_Time[1]%16;
  294. Seg_Buf[6]=Max_Time[0]/16;
  295. Seg_Buf[7]=Max_Time[0]%16;
  296. }
  297. break;
  298. }
  299. }
  300. void Led_Proc()
  301. {
  302. if(Freq<=500&&Error_Flag==0)
  303. {
  304. DA_Write(51);
  305. }
  306. else if(Freq>500&&Freq<=Freq_Set&&Error_Flag==0)
  307. {
  308. DA_Write(((4*(Freq-500.0))/(Freq_Set-500)+1.0)*51);
  309. }
  310. else if(Freq>500&&Error_Flag==0)
  311. {
  312. DA_Write(255);
  313. }
  314. else if(Error_Flag==1)
  315. {
  316. DA_Write(0);
  317. }
  318. if(Freq<=Freq_Set)
  319. {
  320. Led_Buf[1]=0;
  321. }
  322. if(Error_Flag)
  323. {
  324. Led_Buf[1]=1;
  325. }
  326. if(Freq<=Freq_Set&&Error_Real==0)
  327. {
  328. Led_Buf[1]=0;
  329. }
  330. }
  331. //
  332. void Timer1Init(void) //1毫秒@12.000MHz
  333. {
  334. AUXR &= 0x7F; //定时器1时钟12T模式
  335. AUXR &= 0xBF; //定时器0时钟12T模式
  336. TMOD |= 0x05; //设置定时器模式
  337. TL1 = 0x18; //设置定时初值
  338. TH1 = 0xFC; //设置定时初值
  339. TF1 = 0; //清除TF1标志
  340. TR1 = 1; //定时器1开始计时
  341. ET1=1;
  342. EA=1;
  343. TL0 = 0; //设置定时初值
  344. TH0 = 0; //设置定时初值
  345. TF0 = 0; //清除TF0标志
  346. TR0 = 1; //定时器0开始计时
  347. }
  348. void Timer1_Rountine(void) interrupt 3
  349. {
  350. TL1 = 0x18; //设置定时初值
  351. TH1 = 0xFC; //设置定时初值
  352. if(++Key_Slow_Down==10){Key_Slow_Down=0;}
  353. if(++Seg_Slow_Down==100){Seg_Slow_Down=0;}
  354. if(++Seg_Pos==8){Seg_Pos=0;}
  355. if(Mode_Show==0)
  356. {
  357. Freq_Set_Temp=Freq_Set;
  358. Freq_Fix_Temp=Freq_Fix;
  359. Dat_Mode=0;
  360. Error_Flag=Error_Real;
  361. }
  362. if(Mode_Show==2)
  363. {
  364. Freq_Set=Freq_Set_Temp;
  365. Freq_Fix=Freq_Fix_Temp;
  366. Final_Flag=0;
  367. Error_Real=Error_Flag;
  368. }
  369. if(++Time_1s>1000)
  370. {
  371. Time_1s=0;
  372. Freq=(TH0<<8)|TL0;
  373. if(Dat_Flag==0)
  374. {
  375. Error_Flag=0;
  376. Freq=(TH0<<8)|TL0+Freq_Fix;
  377. }
  378. else if(Dat_Flag==1&&Freq>=Freq_Fix)
  379. {
  380. Error_Flag=0;
  381. Freq=(TH0<<8)|TL0-Freq_Fix;
  382. }
  383. else if(Dat_Flag==1&&Freq
  384. {
  385. Error_Flag=1;
  386. }
  387. if(Freq>Freq_Max)
  388. {
  389. Freq_Max=Freq;
  390. Max_Time[0]=Time[0];
  391. Max_Time[1]=Time[1];
  392. Max_Time[2]=Time[2];
  393. }
  394. TL0=0;
  395. TH0=0;
  396. }
  397. if(Mode_Show==0)
  398. {
  399. Time_200ms++;
  400. if(Time_200ms<=200)
  401. {
  402. Led_Buf[0]=1;
  403. }
  404. if(Time_200ms>200&&Time_200ms<400)
  405. {
  406. Led_Buf[0]=0;
  407. }
  408. if(Time_200ms>=400)
  409. {
  410. Time_200ms=0;
  411. }
  412. }
  413. else
  414. {
  415. Led_Buf[0]=0;
  416. }
  417. if(Freq>Freq_Set&&Error_Flag==0)
  418. {
  419. Time_200ms_L1++;
  420. if(Time_200ms_L1<=200)
  421. {
  422. Led_Buf[1]=1;
  423. }
  424. if(Time_200ms_L1>200&&Time_200ms_L1<400)
  425. {
  426. Led_Buf[1]=0;
  427. }
  428. if(Time_200ms_L1>=400)
  429. {
  430. Time_200ms_L1=0;
  431. }
  432. }
  433. else if(Freq<=Freq_Set&&Error_Real==0)
  434. {
  435. Led_Buf[1]=0;
  436. }
  437. else if(Error_Real==1)
  438. {
  439. Led_Buf[1]=1;
  440. }
  441. Seg_Choose(Seg_Pos,Seg_Buf[Seg_Pos],Seg_Point[Seg_Pos]);
  442. Led_Choose(Seg_Pos,Led_Buf[Seg_Pos]);
  443. }
  444. void main()
  445. {
  446. P0=0xff;
  447. P2=P2&0x1f|0x9f;
  448. P2&=0x1f;
  449. P0=0x00;
  450. P2=P2&0x1f|0xa0;
  451. P2&=0x1f;
  452. Freq=0;
  453. Timer1Init();
  454. Ds1302_Set(Time);
  455. while(1)
  456. {
  457. Key_Proc();
  458. Seg_Proc();
  459. Led_Proc();
  460. }
  461. }

 2.数码管

  1. #include
  2. unsigned char Seg_Table[]={
  3. // 0 1 2 3 4 5 6 7 8 9 A B C D E F
  4. 0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71,
  5. //black - H P L
  6. 0x00,0x40,0x76,0x73,0x38};
  7. unsigned char Seg_Location[8]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
  8. void Seg_Choose(unsigned char Location,Dat,Point)
  9. {
  10. //实现数码管清零
  11. P0=0x00;
  12. P2=P2&0x1f|0xe0;
  13. P2&=0x1f;
  14. //实现数码管选择位置
  15. P0=Seg_Location[Location];
  16. P2=P2&0x1f|0xc0;
  17. P2&=0x1f;
  18. //实现数码管选择数据
  19. P0=~Seg_Table[Dat];
  20. if(Point)
  21. {
  22. P0&=0x7f;
  23. }
  24. P2=P2&0x1f|0xe0;
  25. P2&=0x1f;
  26. }

 3.按键

  1. #include
  2. unsigned char Key_Choose()
  3. {
  4. unsigned char Temp;
  5. EA=0;
  6. P44=0;P42=1;P35=1;
  7. if(P30==0){Temp=7;}
  8. if(P31==0){Temp=6;}
  9. if(P32==0){Temp=5;}
  10. if(P33==0){Temp=4;}
  11. P44=1;P42=0;P35=1;
  12. if(P30==0){Temp=11;}
  13. if(P31==0){Temp=10;}
  14. if(P32==0){Temp=9;}
  15. if(P33==0){Temp=8;}
  16. P44=1;P42=1;P35=0;
  17. if(P30==0){Temp=15;}
  18. if(P31==0){Temp=14;}
  19. if(P32==0){Temp=13;}
  20. if(P33==0){Temp=12;}
  21. // P44=1;P42=1;P35=1;P34=0;
  22. // if(P30==0){Temp=19;}
  23. // if(P31==0){Temp=18;}
  24. // if(P32==0){Temp=17;}
  25. // if(P33==0){Temp=16;}
  26. EA=1;
  27. P3=0xff;
  28. return Temp;
  29. }

4.Led灯显示

  1. #include
  2. void Led_Choose(unsigned char Location,Enable)
  3. {
  4. static unsigned char Temp=0x00;
  5. static unsigned char Temp_Old=0xff;
  6. if(Enable)
  7. {
  8. Temp|=0x01<
  9. }
  10. else
  11. {
  12. Temp&=~(0x01<
  13. }
  14. if(Temp!=Temp_Old)
  15. {
  16. P0=~Temp;
  17. P2=P2&0x1f|0x80;
  18. P2&=0x1f;
  19. Temp_Old=Temp;
  20. }
  21. }

5.iic

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

 6.ds1302

  1. #include
  2. #include "intrins.h"
  3. sbit SCK=P1^7;
  4. sbit SDA=P2^3;
  5. sbit RST=P1^3;
  6. //
  7. void Write_Ds1302(unsigned char temp)
  8. {
  9. unsigned char i;
  10. for (i=0;i<8;i++)
  11. {
  12. SCK = 0;
  13. SDA = temp&0x01;
  14. temp>>=1;
  15. SCK=1;
  16. }
  17. }
  18. //
  19. void Write_Ds1302_Byte( unsigned char address,unsigned char dat )
  20. {
  21. RST=0; _nop_();
  22. SCK=0; _nop_();
  23. RST=1; _nop_();
  24. Write_Ds1302(address);
  25. Write_Ds1302(dat);
  26. RST=0;
  27. }
  28. //
  29. unsigned char Read_Ds1302_Byte ( unsigned char address )
  30. {
  31. unsigned char i,temp=0x00;
  32. RST=0; _nop_();
  33. SCK=0; _nop_();
  34. RST=1; _nop_();
  35. Write_Ds1302(address);
  36. for (i=0;i<8;i++)
  37. {
  38. SCK=0;
  39. temp>>=1;
  40. if(SDA)
  41. temp|=0x80;
  42. SCK=1;
  43. }
  44. RST=0; _nop_();
  45. SCK=0; _nop_();
  46. SCK=1; _nop_();
  47. SDA=0; _nop_();
  48. SDA=1; _nop_();
  49. return (temp);
  50. }
  51. //
  52. void Ds1302_Set(unsigned char *Time)
  53. {
  54. Write_Ds1302_Byte( 0x8e,0x00 );
  55. Write_Ds1302_Byte( 0x80,Time[0] );
  56. Write_Ds1302_Byte( 0x82,Time[1] );
  57. Write_Ds1302_Byte( 0x84,Time[2] );
  58. Write_Ds1302_Byte( 0x8e,0x80 );
  59. }
  60. //
  61. void Ds1302_Read(unsigned char *Time)
  62. {
  63. Time[0]=Read_Ds1302_Byte ( 0x81 );
  64. Time[1]=Read_Ds1302_Byte ( 0x83 );
  65. Time[2]=Read_Ds1302_Byte ( 0x85 );
  66. }

文章知识点与官方知识档案匹配,可进一步学习相关知识
算法技能树首页概览60483 人正在系统学习中
注:本文转载自blog.csdn.net的多睡午觉的文章"https://blog.csdn.net/2401_83340925/article/details/137744937"。版权归原作者所有,此博客不拥有其著作权,亦不承担相应法律责任。如有侵权,请联系我们删除。
复制链接
复制链接
相关推荐
发表评论
登录后才能发表评论和回复 注册

/ 登录

评论记录:

未查询到任何数据!
回复评论:

分类栏目

后端 (14832) 前端 (14280) 移动开发 (3760) 编程语言 (3851) Java (3904) Python (3298) 人工智能 (10119) AIGC (2810) 大数据 (3499) 数据库 (3945) 数据结构与算法 (3757) 音视频 (2669) 云原生 (3145) 云平台 (2965) 前沿技术 (2993) 开源 (2160) 小程序 (2860) 运维 (2533) 服务器 (2698) 操作系统 (2325) 硬件开发 (2492) 嵌入式 (2955) 微软技术 (2769) 软件工程 (2056) 测试 (2865) 网络空间安全 (2948) 网络与通信 (2797) 用户体验设计 (2592) 学习和成长 (2593) 搜索 (2744) 开发工具 (7108) 游戏 (2829) HarmonyOS (2935) 区块链 (2782) 数学 (3112) 3C硬件 (2759) 资讯 (2909) Android (4709) iOS (1850) 代码人生 (3043) 阅读 (2841)

热门文章

124
嵌入式
关于我们 隐私政策 免责声明 联系我们
Copyright © 2020-2025 蚁人论坛 (iYenn.com) All Rights Reserved.
Scroll to Top