找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3353|回复: 2
收起左侧

51单片机+vb上位机的ds1820温度采集系统程序

  [复制链接]
ID:641160 发表于 2020-5-14 21:01 | 显示全部楼层 |阅读模式
51hei.png 51hei.png

单片机源程序如下:
  1. #include <reg52.h>//头文件
  2. #include <intrins.h>
  3. #include <math.h>
  4. #define uchar unsigned char//宏定义
  5. #define uint unsigned short int//宏定义
  6. #define sint short int
  7. #define nop _nop_()
  8. void delay(uint z);//延时1MS
  9. void delay1(uchar x2);//延时7us左右;
  10. void write_Directive(uchar a);//写LCD指令
  11. void write_Data(uchar a);//写LCD数据
  12. void write_lcd_com_date(uchar addr,uchar date);//实现LCD写指令及数据
  13. void LCD_init();//LCD初始化
  14. void start(); //AT24C02开始程序
  15. void send(uchar send_data);//AT24C02发送一个字节
  16. uchar receive();//AT24C02接收一个程序
  17. void ack();//AT24C02是否应答
  18. void yack();//AT24C02应答
  19. void nack();//AT24C02无应答
  20. void stop();//AT24C02停止
  21. void write(uchar xaddress,sint temp);//AT24C02写入温度
  22. uint read(uchar daddress);//AT24C02读出温度
  23. void send_str(sint cc,uchar chflag);  // 传送字串
  24. void DB18B20_init_1();//DB18B20_1复位
  25. void write_DB18B20_1(uchar dat);//写DB18B20_1
  26. uchar read_DB18B20_1();//读DB18B20_1
  27. void DB18B20_init_1();//DB18B20_2复位
  28. void write_DB18B20_1(uchar dat);//写DB18B20_2
  29. uchar read_DB18B20_1();//读DB18B20_2
  30. void tempzh_1();  //温度转换1
  31. void tempzh_2();  //温度转换2
  32. void tempread_1();  //读取温度1
  33. void tempread_2();  //读取温度2
  34. void temp(sint TEMPS,uchar t,bit fuflag);//显示温度函数
  35. void readcc();     //读取存储芯片中最高及最低温度
  36. void keyscan(); //键扫描程序
  37. void write_ds1302(uchar addr, uchar date);//写DS1302
  38. uchar read_ds1302(uchar addr);//读DS1302
  39. void init_ds1302();//DS1302初始化
  40. void time();//时间显示
  41. void timekey();//时间部分功能键
  42. void tempkey();//温度部分功能键
  43. void shuma(uchar addr,uchar xz,bit flag);//1302调节函数及转换
  44. void flash(uchar bz);//字符闪烁函数
  45. void tempbj();  //温度比较
  46. uchar bdata ch;//定义可位寻址空间,用于24c02的读取
  47. sbit RS=P1^4;//1602数据/命令选择
  48. sbit RW=P1^5;//1602读写命令选择
  49. sbit E=P1^6;//1602使能端
  50. sbit led=P0^1;//发光二极管
  51. sbit beep=P0^0;//蜂鸣器
  52. sbit SDA=P0^2;//24c02数据总线
  53. sbit SCL=P0^3;//24c02时钟总线
  54. sbit DQ1=P1^0;//温度传感器1
  55. sbit DQ2=P3^2;//温度传感器2
  56. sbit DSIO=P1^2;//1302输入输出口
  57. sbit DSCLK=P1^1;//1302脉冲
  58. sbit DSRST=P1^3;//1302复位
  59. sbit key1=P3^7;//五个按键及其标志
  60. sbit key2=P0^7;
  61. sbit key3=P0^6;
  62. sbit key4=P0^5;
  63. sbit key5=P0^4;
  64. bit  k1flag=0;
  65. bit  k2flag=0;
  66. bit  k3flag=0;
  67. bit  k4flag=0;
  68. bit  k5flag=0;
  69. sbit a0=ch^0;//定义ch各位
  70. sbit a1=ch^1;
  71. sbit a2=ch^2;
  72. sbit a3=ch^3;
  73. sbit a4=ch^4;
  74. sbit a5=ch^5;
  75. sbit a6=ch^6;
  76. sbit a7=ch^7;
  77. bit fuflag1=0;//负温度标志1
  78. bit fuflag2=0;//负温度标志2
  79. bit ackflag=0;//24c02应答是否标志
  80. bit sendflag=0;//串口发送标志
  81. sint temps1,temps2,tempd1,tempd2,tempx1,tempx2,uptem1,downtem1,uptem2,downtem2;//温度参数
  82. uchar count=0,tcount=0,scount=0,t=0;
  83. uchar secondh,secondl,minuteh,minutel,hourh,hourl,second,minute,hour;//时钟参数
  84. uchar monthl,monthh,month,dayl,dayh,day,year,yearl,yearh,week;
  85. uchar code DispTab_1[12]={'0','1','2','3','4','5','6','7','8','9',' ','-'};//1602:0-9 数字
  86. uchar DispBuf[5]; //5字节的显示缓冲区
  87. uchar code zzz[] = {"Made In Gao J C"};//定义字符串
  88. uchar code cc1[4] = {"DQ1:"};
  89. uchar code cc2[4] = {"DQ2:"};
  90. uchar code cc3[14] = {"DQ1 is so high"};
  91. uchar code cc4[13] = {"DQ1 is so low"};
  92. uchar code cc5[14] = {"DQ2 is so high"};
  93. uchar code cc6[13] = {"DQ2 is so low"};

  94. void delay(uint z)//1ms延时
  95. {
  96. uchar i;
  97. while(z--)
  98. for(i = 120;i > 0;i--);
  99. }

  100. void delay1(uchar x2)//短延时,由于18b20
  101. {
  102. while(x2--);
  103. }

  104. void write_Directive(uchar a)//写LCD指令
  105. {
  106. RS = 0;
  107. RW = 0;
  108. delay(1);
  109. E = 0;
  110. P2 = a;
  111. delay(1);
  112. E = 1;
  113. delay(1);
  114. E = 0;
  115. delay(1);
  116. }

  117. void write_Data(uchar a)//写LCD数据
  118. {
  119. RS = 1;
  120. RW = 0;
  121. delay(1);
  122. E = 0;
  123. P2 = a;
  124. delay(1);
  125. E = 1;
  126. delay(1);
  127. E = 0;
  128. delay(1);
  129. }

  130. void write_lcd_com_date(uchar addr,uchar date)//实现LCD写指令及数据
  131. {
  132. write_Directive(addr);
  133. delay(1);
  134. write_Data(date);
  135. }

  136. void LCD_init()//LCD初始化
  137. {
  138. uchar i;
  139. delay(15);
  140. write_Directive(0x38);
  141. delay(5);
  142. write_Directive(0x38);
  143. delay(5);
  144. write_Directive(0x38);
  145. write_Directive(0x01);
  146. write_Directive(0x02);//光标复位
  147. write_Directive(0x0c);//不显示光标
  148. //write_Directive(0x0f);//显示光标
  149. write_Directive(0x84);//显示字符串
  150. for(i = 0;i < 7;i++)
  151. write_Data(zzz[i]);
  152. write_Directive(0xc3);
  153. for(i = 8;i < 15;i++)
  154. write_Data(zzz[i]);
  155. }

  156. void start() //AT24C02开始程序
  157. {
  158. SCL = 1;
  159. SDA = 1;
  160. nop;
  161. nop;
  162. SDA = 0;
  163. nop;
  164. nop;
  165. SCL = 0;
  166. }

  167. void send(uchar send_data)//AT24C02发送一个字节
  168. {
  169. ch = send_data;
  170. SDA = a7; SCL = 1; nop;nop; SCL = 0;
  171. SDA = a6; SCL = 1; nop;nop; SCL = 0;
  172. SDA = a5; SCL = 1; nop;nop; SCL = 0;
  173. SDA = a4; SCL = 1; nop;nop; SCL = 0;
  174. SDA = a3; SCL = 1; nop;nop; SCL = 0;
  175. SDA = a2; SCL = 1; nop;nop; SCL = 0;
  176. SDA = a1; SCL = 1; nop;nop; SCL = 0;
  177. SDA = a0; SCL = 1; nop;nop; SCL = 0;
  178. }

  179. uchar receive()//AT24C02接收一个程序
  180. {
  181. SDA = 1;
  182. SCL = 1; nop;nop; a7 = SDA; SCL = 0;
  183. SCL = 1; nop;nop; a6 = SDA; SCL = 0;
  184. SCL = 1; nop;nop; a5 = SDA; SCL = 0;
  185. SCL = 1; nop;nop; a4 = SDA; SCL = 0;
  186. SCL = 1; nop;nop; a3 = SDA; SCL = 0;
  187. SCL = 1; nop;nop; a2 = SDA; SCL = 0;
  188. SCL = 1; nop;nop; a1 = SDA; SCL = 0;
  189. SCL = 1; nop;nop; a0 = SDA; SCL = 0;
  190. return(ch);
  191. }

  192. void ack()//AT24C02是否应答
  193. {
  194. SDA = 1;
  195. SCL = 1;
  196. nop;
  197. nop;
  198. if(SDA)
  199. ackflag = 1;
  200. else
  201. ackflag = 0;
  202. SCL=0;
  203. }

  204. void yack()//AT24C02应答
  205. {
  206. SDA = 0;
  207. SCL = 1;
  208. nop;
  209. nop;
  210. SCL = 0;
  211. SDA = 1;
  212. }
  213. void nack()//AT24C02无应答
  214. {
  215. SDA = 1;
  216. SCL = 1;
  217. nop;
  218. nop;
  219. SCL = 0;
  220. SDA = 0;
  221. }

  222. void stop()//AT24C02停止
  223. {
  224. SDA = 0;
  225. SCL = 1;
  226. nop;
  227. nop;
  228. SDA = 1;
  229. nop;
  230. nop;
  231. SCL = 0;
  232. SDA = 0;
  233. }

  234. void write(uchar xaddress,sint temp)//AT24C02写入温度
  235. {
  236. uchar a,b;
  237. do{
  238. start();
  239. send(0xa0);
  240. ack();
  241. } while(ackflag);

  242. do{
  243. send(xaddress);
  244. ack();
  245. }while(ackflag);
  246. a = temp;
  247. temp >>= 8;
  248. b = temp;
  249. do{
  250. send(a);
  251. ack();
  252. }while(ackflag);
  253. do{
  254. send(b);
  255. ack();
  256. }while(ackflag);
  257. stop();
  258. }

  259. uint read(uchar daddress)//AT24C02读出温度
  260. {
  261. uchar a,b;
  262. sint temp;
  263. do{
  264. start();
  265. send(0XA0);
  266. ack();
  267. }while(ackflag);     

  268. do{
  269. send(daddress);
  270. ack();
  271. }while(ackflag);

  272. do{
  273. start();
  274. send(0XA1);
  275. ack();
  276. }while(ackflag);   
  277. a = receive();
  278. yack();
  279. b = receive();
  280. yack();
  281. nack();
  282. stop();
  283. temp = b;
  284. temp <<= 8;
  285. temp |= a;
  286. return temp;     
  287. }

  288. void send_str(sint cc,uchar chflag)  // 传送字串
  289. {
  290. uchar i,a,b,ch[4];
  291. ES=0;
  292. cc = abs(cc);
  293. a = cc / 100;
  294. b = cc % 100;
  295. ch[1] = b;
  296. ch[2] = a;
  297. ch[3] = chflag;
  298. for(i = 3;i > 0;i--){
  299. SBUF = ch[i];
  300. while(!TI);    // 等特数据传送
  301. TI = 0;       // 清除数据传送标志
  302. ES=1;
  303. }      
  304. }


  305. /*void serial() interrupt 4
  306. {a=SBUF;
  307. RI=0;
  308. flag=1;
  309. }
  310. */

  311. void DB18B20_init_1()//DB18B20复位
  312. {
  313. DQ1 = 1;
  314. delay1(20);
  315. DQ1 = 0;
  316. delay1(80);
  317. DQ1 = 1;
  318. delay1(15);
  319. }

  320. void write_DB18B20_1(uchar dat)//写DB18B20
  321. {
  322. uchar i;
  323. for(i = 8;i > 0;i--){
  324. DQ1 = 1;
  325. delay1(10);
  326. DQ1 = 0;
  327. nop;
  328. DQ1 = dat&0x01;
  329. delay1(10);
  330. DQ1 = 1;
  331. dat >>= 1;
  332. }
  333. delay1(7);
  334. }

  335. uchar read_DB18B20_1()//读DB18B20
  336. {
  337. uchar i,date;
  338. for(i = 8;i > 0;i--){
  339. DQ1 = 0;
  340. date >>= 1;
  341. DQ1 = 1;
  342. if(DQ1)
  343. date |= 0x80;
  344. delay(4);
  345. }
  346. return date;//返回温度值
  347. }

  348. void DB18B20_init_2()//DB18B20复位
  349. {
  350. DQ2=1;
  351. delay1(20);
  352. DQ2=0;
  353. delay1(80);
  354. DQ2=1;
  355. delay1(15);
  356. }

  357. void write_DB18B20_2(uchar dat)//写DB18B20
  358. {
  359. uchar i;
  360. for(i = 8;i > 0;i--){
  361. DQ2 = 1;
  362. delay1(10);
  363. DQ2 = 0;
  364. nop;
  365. DQ2 = dat&0x01;
  366. delay1(10);
  367. DQ2 = 1;
  368. dat >>= 1;
  369. }
  370. delay1(7);
  371. }

  372. uchar read_DB18B20_2()//读DB18B20
  373. {
  374. uchar i,date;
  375. for(i = 8;i > 0;i--){
  376. DQ2 = 0;
  377. date >>= 1;
  378. DQ2 = 1;
  379. if(DQ2)
  380. date |= 0x80;
  381. delay(4);
  382. }
  383. return date;//返回温度值
  384. }

  385. void tempzh_1()               //温度转换
  386. {       
  387. DB18B20_init_1();//DB18B20复位
  388. write_DB18B20_1(0xcc);//写DB18B20;0xcc 跳过 ROM 指令
  389. write_DB18B20_1(0x44);//写DB18B20;0x44 启动温度转换指令
  390. }
  391. void tempzh_2()               //温度转换
  392. {       
  393. DB18B20_init_2();//DB18B20复位
  394. write_DB18B20_2(0xcc);//写DB18B20;0xcc 跳过 ROM 指令
  395. write_DB18B20_2(0x44);//写DB18B20;0x44 启动温度转换指令
  396. }

  397. void tempread_1()//温度读取
  398. {
  399. uint temp;
  400. uchar a,b;
  401. fuflag1 = 0;
  402. DB18B20_init_1();//DB18B20复位
  403. write_DB18B20_1(0xcc);//写DB18B20;0xcc 跳过 ROM 指令
  404. write_DB18B20_1(0xbe);//写DB18B20;0xbe 读温度指令
  405. a = read_DB18B20_1(); //a为低字节8位
  406. b = read_DB18B20_1(); //b为高字节8位
  407. temp = b;     //temp为温度值UINT 16bit
  408. temp <<= 8;       //两个字节组合到一起
  409. temp |= a;//此处可以直接把补码转换过来,只是关于负数标志的问题需要考虑   
  410. if(b > 7){  //判断正负,因为负温度高五位是1,故而可得
  411. fuflag1 = 1;
  412. temps1 = (temp*0.0625-4096)*10-0.5;
  413. }
  414. else{
  415. fuflag1 = 0;
  416. temps1 = temp*0.0625*10+0.5;
  417. }
  418. if(tempd1 < temps1){
  419. tempd1 = temps1;
  420. write(0x00,tempd1);
  421. }
  422. else if(tempx1 > temps1){
  423.            tempx1 = temps1;
  424.        write(0x04,tempx1);
  425.            }

  426. if(sendflag){
  427.         t++;
  428.         if(t == 5){
  429.     send_str(temps1,1);
  430.     send_str(tempd1,2);
  431.     send_str(tempx1,3);
  432.         }   
  433. }
  434. }

  435. void tempread_2()
  436. {
  437. uint temp;
  438. uchar a,b;
  439. fuflag2 = 0;
  440. DB18B20_init_2();//DB18B20复位
  441. write_DB18B20_2(0xcc);//写DB18B20;0xcc 跳过 ROM 指令
  442. write_DB18B20_2(0xbe);//写DB18B20;0xbe 读温度指令
  443. a = read_DB18B20_2(); //a为低字节8位
  444. b = read_DB18B20_2(); //b为高字节8位
  445. temp = b;     //temp为温度值UINT 16bit
  446. temp <<= 8;       //两个字节组合到一起
  447. temp |= a;//此处可以直接把补码转换过来,只是关于负数标志的问题需要考虑   
  448. if(b>7){
  449. fuflag2 = 1;
  450. temps2=(temp*0.0625-4096)*10-0.5;
  451. }
  452. else{
  453. fuflag2=0;
  454. temps2=temp*0.0625*10+0.5;
  455. }
  456. if(tempd2<temps2){
  457. tempd2=temps2;
  458. write(0x08,tempd2);
  459. }
  460. else if(tempx2>temps2){
  461.      tempx2=temps2;
  462.      write(0x0c,tempx2);
  463.          }
  464. if(sendflag){
  465.         if(t == 5){
  466.         t = 0;
  467.     send_str(temps2,4);
  468.     send_str(tempd2,5);
  469.     send_str(tempx2,6);
  470.         }
  471. }
  472. }

  473. void temp(sint temps,uchar t,bit fuflag)//显示温度函数
  474. {
  475. uchar i;
  476. uint mm;
  477. temps = abs(temps);
  478. DispBuf[0] = temps / 1000;//显示百位
  479. mm = temps % 1000;
  480. DispBuf[1] = mm / 100;//显示十位
  481. mm = mm % 100;
  482. DispBuf[2] = mm / 10;//显示个位
  483. DispBuf[3] = mm % 10;//显示小数点:0.1
  484. i = DispBuf[0];//百位判断,如果为0,则消隐
  485. if(i == 0) i = 10;
  486. if(fuflag)//负温度判断,如果为0,则温度为负的,显示负号
  487. i = 11;
  488. DispBuf[0] = DispTab_1[i];//查表,取字符
  489. i = DispBuf[1];
  490. DispBuf[1] = DispTab_1[i];
  491. i = DispBuf[2];
  492. DispBuf[2] = DispTab_1[i];
  493. i = DispBuf[3];
  494. DispBuf[3] = DispTab_1[i];
  495. i = DispBuf[4];
  496. DispBuf[4] = DispTab_1[i];
  497. write_Directive(0x84+t);//第一行,第五个位置地址
  498. write_Data(DispBuf[0]);//第一行,第五个位置
  499. write_Data(DispBuf[1]);//第一行,第六个位置
  500. write_Data(DispBuf[2]);//第一行,第八个位置
  501. write_Data('.');//第一行,第七个位置
  502. write_Data(DispBuf[3]);//第一行,第九个位置
  503. }

  504. void readcc()//读24c02中最高和最低温度并显示
  505. {          
  506. bit flag;
  507. tempd1 = read(0x00);
  508. if(tempd1 > 0) flag = 0;
  509. else flag = 1;
  510. temp(tempd1,0x00,flag);
  511. tempx1 = read(0x04);
  512. if(tempx1 > 0) flag = 0;
  513. else flag=1;
  514. temp(tempx1,0x06,flag);
  515. tempd2 = read(0x08);
  516. if(tempd2 > 0) flag = 0;
  517. else flag = 1;
  518. temp(tempd2,0x40,flag);
  519. tempx2 = read(0x0c);
  520. if(tempx2 > 0) flag = 0;
  521. else flag = 1;
  522. temp(tempx2,0x46,flag);
  523. }

  524. void keyscan() //键扫描程序
  525. {
  526. bit flag = 0;
  527. if(!key1){          //按键1
  528. delay(30);
  529.         if(!key1){         
  530.     while(!key1);
  531.     k1flag = 1;
  532.     flag = 1;   
  533.     }
  534. }
  535. if(!key2){       //按键2
  536. delay(30);
  537.         if(!key2){
  538.     while(!key2);
  539.     k2flag = 1;
  540.     flag = 1;  
  541.     }
  542. }
  543. if(!key3){         //按键3
  544. delay(30);               
  545.         if(!key3){
  546.     while(!key3);
  547.     k3flag = 1;
  548.     flag = 1;
  549.     }
  550. }
  551. if(!key4){          //按键4
  552. delay(30);
  553.     if(!key4){         
  554.     while(!key4);
  555.     k4flag = !k4flag;
  556.     flag = 1;      
  557.     }
  558. }
  559. if(!key5){          //按键5
  560. delay(30);
  561.         if(!key5){         
  562.     while(!key5);
  563.     k5flag=!k5flag;
  564.     flag=1;
  565.     write_Directive(0x01);                   
  566.     }
  567. }
  568. if(flag){
  569. beep=0;
  570. delay(100);
  571. beep=1;
  572. }
  573. }

  574. uchar read_ds1302(uchar addr)//读DS1302
  575. {
  576. uchar i,temp = 0x00;
  577. DSRST = 0;
  578. DSIO = 1;
  579. DSCLK = 0;
  580. DSRST = 1;
  581. for(i = 8;i > 0;i--){               //循环8次 写入地址数据
  582. DSCLK = 0;
  583. DSIO = addr&0x01;             //每次传输低字节
  584. addr >>= 1;                  //右移一位
  585. DSCLK = 1;
  586. }
  587. delay(1);
  588. if(DSIO)
  589. temp |= 0x80;                        //每次传输低字节
  590. DSCLK = 0;
  591. temp >>= 1;
  592. for(i = 7;i > 0;i--){                   //循环7次 读取数据此处如果读8次就会出现乱码
  593. DSCLK = 0;
  594. if(DSIO)
  595. temp |= 0x80;                        //每次传输低字节
  596. DSCLK = 1;
  597. temp >>= 1;                        //右移一位
  598. }
  599. DSCLK = 1;
  600. DSRST = 0;
  601. DSIO = 0;
  602. return temp;               
  603. }

  604. void write_ds1302(uchar addr, uchar date)//写DS1302
  605. {       
  606. uchar i;
  607. DSRST = 0;
  608. DSCLK = 0;
  609. DSRST = 1;       
  610. for (i = 8;i > 0;i--){             //循环8次 写入地址数据
  611. DSCLK = 0;
  612. nop;
  613. DSIO = addr&0x01;             //每次传输低字节
  614. addr >>= 1;                  //右移一位
  615. DSCLK = 1;
  616. nop;
  617. }
  618. for (i = 8;i > 0;i--){              //循环8次 写入数据
  619. DSCLK = 0;
  620. nop;
  621. DSIO = date&0x01;             //每次传输低字节
  622. date >>= 1;                  //右移一位                DSCLK=1
  623. DSCLK = 1;
  624. nop;
  625. }
  626. DSRST = 0;
  627. delay(1);
  628. }

  629. void init_ds1302()//DS1302初始化
  630. {
  631. write_ds1302(0x8e,0x00);
  632. write_ds1302(0x90,0xa5);
  633. /*write_ds1302(0x80,0x00);    //00秒
  634. write_ds1302(0x82,0x54);    //54分
  635. write_ds1302(0x84,0x17);    //17点
  636. write_ds1302(0x86,0x13);    //13日
  637. write_ds1302(0x88,0x03);    //3月
  638. write_ds1302(0x8a,0x05);    //星期五
  639. write_ds1302(0x8c,0x12);    //2012年*/
  640. }

  641. void time()//时间显示
  642. {
  643. write_lcd_com_date(0x81,'2');
  644. write_lcd_com_date(0x82,'0');

  645. second = read_ds1302(0x81);
  646. secondl = second & 0x0f;
  647. secondh  = second >> 4;
  648.        
  649. minute = read_ds1302(0x83);
  650. minutel = minute & 0x0f;
  651. minuteh  = minute >> 4;
  652.        
  653. hour = read_ds1302(0x85);
  654. hourl = hour & 0x0f;
  655. hourh  = hour >> 4;       

  656. month = read_ds1302(0x89);
  657. monthl = month & 0x0f;
  658. monthh = month >> 4;
  659.        
  660. year = read_ds1302(0x8d);
  661. yearl = year & 0x0f;
  662. yearh = year >> 4;

  663. day = read_ds1302(0x87);
  664. dayl = day & 0x0f;
  665. dayh = day >> 4;       

  666. week = read_ds1302(0x8b);
  667. week = week&0x0f;

  668. write_lcd_com_date(0xca,0x30 + secondl);
  669. write_lcd_com_date(0xc9,0x30 + secondh);
  670. write_lcd_com_date(0xc8,':');                 
  671. write_lcd_com_date(0xc7,0x30 + minutel);
  672. write_lcd_com_date(0xc6,0x30 + minuteh);                               
  673. write_lcd_com_date(0xc5,':');       
  674. write_lcd_com_date(0xc4,0x30 + hourl);
  675. write_lcd_com_date(0xc3,0x30 + hourh);
  676. write_lcd_com_date(0x84,0x30 + yearl);
  677. write_lcd_com_date(0x83,0x30 + yearh);
  678. write_lcd_com_date(0x85,'-');         
  679. write_lcd_com_date(0x87,0x30 + monthl);
  680. write_lcd_com_date(0x86,0x30 + monthh);               
  681. write_lcd_com_date(0x88,'-');
  682. write_lcd_com_date(0x8a,0x30 + dayl);
  683. write_lcd_com_date(0x89,0x30 + dayh);       
  684. write_lcd_com_date(0x8c,0x30 + week);       
  685. }

  686. void shuma(uchar addr,uchar xz,bit flag)
  687. {
  688. char date;
  689. uchar day=0;
  690. date = read_ds1302(addr + 1);  //读分寄存器上的数据
  691. date = ((date >> 4) * 10) + (date & 0x0f); //BCD Convert to shi
  692. if(flag == 0) date++;
  693. else date--;
  694. switch(xz)
  695. {
  696. case 0:if(date > 59) date=0;if(date < 0) date = 59;break;//分秒
  697. case 1:if(date > 23) date=0;if(date < 0) date = 23;break;//时
  698. case 2:if(date > 12) date=0;if(date < 0) date = 12;break;//月
  699. case 3:if(date > 99) date=0;if(date < 0) date = 99;break;//年
  700. case 4:if(date > 7)  date=1;if(date < 1) date = 7;break;//星期
  701. case 5:
  702. day = read_ds1302(0X87);
  703. day = ((day >> 4) * 10) + (day & 0x0f);
  704. if(day != 2){
  705.         if(day % 2 == 1){
  706.             if(date > 31)
  707.                 date = 0;
  708.                 else if(date < 0)
  709.                 date = 31;
  710.     }
  711.     else{
  712.             if(date > 30)
  713.             date = 0;
  714.                 else if(date < 0)
  715.             date = 30;
  716.     }
  717. }
  718. else{  
  719.         if(date > 29)
  720.         date = 0;
  721.     else if(date < 0)
  722.     date = 29;
  723. }
  724. break;
  725. ……………………

  726. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
51hei.png

以上是仿真报错,求大神指导修改一下

所有资料51hei提供下载:
资料.7z (4.42 MB, 下载次数: 80)
回复

使用道具 举报

ID:1030689 发表于 2022-6-15 20:49 | 显示全部楼层
这个思路好
回复

使用道具 举报

ID:326998 发表于 2024-4-13 19:44 | 显示全部楼层
VB没过时
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表