2497|0

1

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

基于ARMLPC2103的温度采集与显示设计 [复制链接]

用LPC2103处理器 设计显示当前温度和时间,用ds18b20   显示时间用ds1302   显示用16x64点阵
如何用C语言编写全部程序我有基于51的但是不会改  求助!!江湖告急!!有重谢


  1. //#include<AT89x51.H>
  2. #include"NEW_8051.H"
  3. #define uchar unsigned char
  4. #define uint unsigned int
  5. #define light 3 //定义亮度
  6. uchar code hanzi[]; //汉字字模
  7. uchar code shengri[]; //生日字模
  8. uchar code timer[13][16]; //0~9数字
  9. uchar code sw[]; //138驱动数据
  10. void Show_word(); //待机显示按三秒间隔分别显示年、月日、星期、时分秒。
  11. void Show_pass(); //不显示一个字
  12. void Send_data(unsigned char *d); /*发送一个字节红色数据*/
  13. void Send_data1(unsigned char *d); /*发送一个字节绿色数据*/
  14. void Send_data2(unsigned char *d);/*发送一个字节黄色色数据*/
  15. uchar Mode_count=0;
  16. /******************************************/
  17. #define DataOut P0 //定义扫描口 占用 P0.0~P0.3
  18. /*按键定义*/
  19. sbit resget=P3^4; //时钟复位
  20. sbit key_moda=P2^1; //模式转换
  21. sbit key_up=P2^2; //时钟加
  22. sbit key_Down=P2^3; //时钟减
  23. /*DS1302 数据IO定义*/
  24. sbit T_CLK=P1^2;//DS1302引脚连接
  25. sbit T_IO =P1^3;
  26. sbit T_RST=P1^4;
  27. sbit ACC0=ACC^0;//1bit数据存储位
  28. sbit ACC7=ACC^7;
  29. /*点阵数据IO定义*/
  30. sbit STR=P1^7; //锁存
  31. sbit SCK=P1^6; //时钟
  32. sbit SERr= P0^4; //红色数据线
  33. sbit SERg= P0^4; //绿色数据线
  34. sbit E=P0^4;
  35. sbit IA =P0^0; //行控制线A
  36. sbit IB =P0^1; //行控制线B
  37. sbit IC =P0^2; //行控制线C
  38. sbit ID =P0^3; //行控制线D
  39. /*定义DS18B20 IO接口*/
  40. sbit DQ= P3^1;//ds1820data(单总线) 请根据实际 定义接口
  41. #define scan0 {IA=0;IB=0;IC=0;ID=0;}
  42. #define scan1 {IA=1;IB=0;IC=0;ID=0;}
  43. #define scan2 {IA=0;IB=1;IC=0;ID=0;}
  44. #define scan3 {IA=1;IB=1;IC=0;ID=0;}
  45. #define scan4 {IA=0;IB=0;IC=1;ID=0;}
  46. #define scan5 {IA=1;IB=0;IC=1;ID=0;}
  47. #define scan6 {IA=0;IB=1;IC=1;ID=0;}
  48. #define scan7 {IA=1;IB=1;IC=1;ID=0;}
  49. #define scan8 {IA=0;IB=0;IC=0;ID=1;}
  50. #define scan9 {IA=1;IB=0;IC=0;ID=1;}
  51. #define scan10 {IA=0;IB=1;IC=0;ID=1;}
  52. #define scan11 {IA=1;IB=1;IC=0;ID=1;}
  53. #define scan12 {IA=0;IB=0;IC=1;ID=1;}
  54. #define scan13 {IA=1;IB=0;IC=1;ID=1;}
  55. #define scan14 {IA=0;IB=1;IC=1;ID=1;}
  56. #define scan15 {IA=1;IB=1;IC=1;ID=1;}
  57. bit new_code;
  58. /*结构体*/ /* 保存一次解码后接收到的四字节数据*/
  59. static struct IR_data //红外接收的数据结构
  60. {
  61. unsigned char addr1; // 地址1(客户码1)
  62. unsigned char addr2; // 地址2(客户码2)
  63. unsigned char data1; // 数据1(数据码)
  64. unsigned char data2; // 数据2(数据码反码)
  65. } IR_DATA;
  66. #define GTime 53
  67. #define CTime 114
  68. #define D0MinTime 4
  69. #define D0MaxTime 9
  70. #define D1MinTime 11
  71. #define D1MaxTime 16
  72. #define TimeOut_cnt 250
  73. /*全局公共变量*/
  74. unsigned char T0_CNT; // 定时器计数值
  75. unsigned char T0_CNT_bk; // 计数备份
  76. bit TimeOut; // 超时标志
  77. bit Guide; // 引导码有效
  78. bit Continuous; // 连_发码
  79. unsigned char idata IR_Time[33]; // 保存每两个下降沿之间的时间间隔
  80. uchar key_code;
  81. //秒 分 时 日 月 星期 年 所以初始化时间是 12年-7月24日-星期2-22点10分0秒
  82. uchar starts_time[7]={0x00,0x10,0x22,0x24,0x07,0x02,0x12}; //初始化后设置
  83. uchar Move,Speed,Flicker,line,Sec,Cent,Hour,Year,Month,Day,Week; //时间温度变量
  84. uchar a,b=1,f=3,h,msec,id,x; //标志计数器 a为自动转换显示时间,b为手动与自动标志
  85. uint zimuo,tvalue; //字模计数器
  86. uchar BUFF[10]; //缓存
  87. void RTInputByte(uchar); //* 输入 1Byte */
  88. uchar RTOutputByte(void); //* 输出 1Byte */
  89. void W1302(uchar, uchar); // 向DS1302写入一个字节
  90. uchar R1302(uchar); // 从DS1302读出一个字节
  91. void Set1302(uchar *); // 写DS1302时间
  92. void du1302(); // 读时间
  93. void DelayMs(void); // 延时
  94. void Set(uchar,uchar ); // 变量调整
  95. void in_data(); // 调整移动数据
  96. void rxd_data(); // 串口发送移动数据
  97. read_temp(); //*读取温度值并转换*/
  98. /**********************************/
  99. //void Send_RX(unsigned char d) /*从串口发送数据*/
  100. //{
  101. // // ES=0;
  102. // SBUF=d;
  103. // while(TI==0); //等待发送完毕
  104. // TI=0;
  105. // // ES=1;
  106. //}
  107. /*****不影响其他端口的扫描*************************/
  108. void scan(unsigned char Value)
  109. {switch(Value)
  110. {case 0: scan0;break;
  111. case 1: scan1;break;
  112. case 2: scan2;break;
  113. case 3: scan3;break;
  114. case 4: scan4;break;
  115. case 5: scan5;break;
  116. case 6: scan6;break;
  117. case 7: scan7;break;
  118. case 8: scan8;break;
  119. case 9: scan9;break;
  120. case 10:scan10;break;
  121. case 11:scan11;break;
  122. case 12:scan12;break;
  123. case 13:scan13;break;
  124. case 14:scan14;break;
  125. case 15:scan15;break;
  126. default:break;
  127. }
  128. }
  129. /*主函数*/
  130. void main()
  131. {
  132. Move=0;
  133. zimuo=0;
  134. TMOD|=0x01; //16位定时
  135. TH0=0xC5; //15ms晶振为12M
  136. TL0=0x68;
  137. IT0 = 1; //外部中断1为边沿触发
  138. EX0 = 1; //允许外部1中断

  139. EA=1; //开总中断
  140. TR0=1; //开定时器计数
  141. ET0=1; //开定时器中断0
  142. TMOD|=0X20;//8位自动重载模式
  143. ET1=1; //定时器0开中断
  144. TH1=0x00;//定时160us 晶振18.432M
  145. TL1=0x00;
  146. // SCON = 0x50;
  147. //TMOD|= 0x20;
  148. //BRT = 0xfb; //0xfb: 18.432MHz,12T,SMOD=0,9600bps
  149. //AUXR |= 0x11; // 使用独立波特率发生器
  150. //Send_RX(0x55);
  151. while(zimuo<512) //上电显示一段汉字
  152. {
  153. while(Move<16) //数据移位。
  154. {
  155. for(Speed=0;Speed<3;Speed++) //移动速度
  156. {
  157. for(line=0;line<16;line++)
  158. {
  159. in_data(); //调整移动数据
  160. rxd_data();
  161. scan(line);
  162. STR=1;//锁存
  163. STR=0;
  164. STR=1;
  165. DelayMs(); //延时,等待
  166. }
  167. }
  168. Move++; //移动一步
  169. }
  170. Move=0;
  171. zimuo=zimuo+32;
  172. }
  173. zimuo=0;
  174. //}
  175. while(1) //重复(无限)循环显示
  176. {

  177. if(f==5)
  178. {
  179. while(zimuo<512) //上电显示一段广告
  180. {
  181. while(Move<16) //数据移位。
  182. {
  183. if(f!=5)break;
  184. if (key_up==0) //增加
  185. {
  186. DelayMs();
  187. if(key_up==0)
  188. {
  189. while(key_up==0)
  190. {Show_word();} //调用显示
  191. h=0;msec=0; //清闪烁标志
  192. // if(b!=0) //手动调整显示的内容
  193. // {
  194. Mode_count++;
  195. if(Mode_count>3)
  196. Mode_count=0;
  197. switch (Mode_count)
  198. {
  199. case 0:
  200. f=0; b=0;
  201. break;
  202. case 1:
  203. f=3;b=1;
  204. break;
  205. case 2:
  206. f=4;b=1;
  207. break;
  208. case 3:
  209. f=5;b=1;
  210. break;
  211. default:
  212. break;
  213. }

  214. }
  215. }
  216. for(Speed=0;Speed<3;Speed++) //移动速度
  217. {
  218. for(line=0;line<16;line++)
  219. {
  220. in_data(); //调整移动数据
  221. rxd_data();
  222. scan(line);
  223. STR=1;//锁存
  224. STR=0;
  225. STR=1;
  226. DelayMs(); //延时,等待一问奔洌?谜饬邢允镜哪谌菰谌搜勰诓??笆泳踉萘簟毕窒蟆?/
  227. }
  228. }
  229. Move++; //移动一步
  230. }
  231. Move=0;
  232. zimuo=zimuo+32;
  233. }
  234. zimuo=0;
  235. }
  236. if((resget==0)&&(key_moda==0))
  237. { DelayMs();
  238. if((resget==0)&&(key_moda==0))
  239. Set1302(starts_time); //初始化
  240. W1302(0x8e,0x00); //控制命令,WP=0,写操作
  241. W1302(0x90,0xa5); //打开充电二级管 一个二级管串联一个2K电阻
  242. }
  243. du1302(); //读取 秒 分 时 日 月 星期 年

  244. zimuo=0;
  245. if (key_moda==0) //设置和选择项目键
  246. { DelayMs();
  247. if(key_moda==0)
  248. {
  249. if(id++==7) {id=0;}
  250. h=0;msec=0; //清闪烁标志
  251. while(key_moda==0){ Show_word();}
  252. }
  253. }

  254. if(id!=0)
  255. {
  256. if (key_up==0) //增加
  257. {
  258. DelayMs();
  259. if(key_up==0)
  260. {
  261. while(key_up==0)
  262. {Show_word();} //调用显示
  263. h=0;msec=0; //清闪烁标志

  264. Set(id,0); //调用时间调调整
  265. }
  266. }

  267. if (key_Down==0) //减少
  268. {
  269. DelayMs();
  270. if(key_Down==0)
  271. {
  272. while(key_Down==0)
  273. {Show_word();} //调用显示
  274. h=0;msec=0; //清闪烁标志
  275. Set(id,1); //调用时间调调整
  276. }
  277. }
  278. }
  279. else
  280. {
  281. if (key_up==0) //增加
  282. {
  283. DelayMs();
  284. if(key_up==0)
  285. {
  286. while(key_up==0)
  287. {Show_word();} //调用显示
  288. h=0;msec=0; //清闪烁标志
  289. // if(b!=0) //手动调整显示的内容
  290. // {
  291. Mode_count++;
  292. if(Mode_count>3)
  293. Mode_count=0;
  294. switch (Mode_count)
  295. {
  296. case 0:
  297. f=0; b=0;
  298. break;
  299. case 1:
  300. f=3;b=1;
  301. break;
  302. case 2:
  303. f=4;b=1;
  304. break;
  305. case 3:
  306. f=5;b=1;
  307. break;
  308. default:
  309. break;
  310. }
  311. }
  312. }
  313. }
  314. if(f==4)
  315. {
  316. read_temp();//读取温度
  317. }
  318. Show_word(); //待机显示按三秒间隔分别显示年、月日、星期、时分秒。
  319. }
  320. }
  321. /************************************************/
  322. void Show_word() //串行输出显示
  323. { uchar h;
  324. for(h=0;h<16;h++)
  325. {
  326. if((id==0)&(f==0)|(id==1)) //f为三秒转换显示
  327. {
  328. Send_data(&timer[0][0]); //不显示
  329. if((Flicker==1)&(id==1)) //闪烁标志为1时不亮,为零时亮
  330. { Show_pass(); //不显示一个字
  331. Show_pass();
  332. }
  333. else
  334. {
  335. Send_data(&timer[2][h]); //20年
  336. Send_data(&timer[0][h]);
  337. Send_data(&timer[Year/16][h]); //年值
  338. Send_data(&timer[Year%16][h]);
  339. }
  340. Send_data(&hanzi[h*2+641]); //年字符
  341. Send_data(&hanzi[h*2+640]);
  342. Send_data(&timer[0]); //不显示
  343. }
  344. if((id==0)&(f==1)|(id==2)|(id==3))
  345. {
  346. if((Flicker==1)&(id==2)) //闪烁标志为1时不亮,为零时亮
  347. { Show_pass(); //不显示一个字

  348. }
  349. else
  350. {
  351. if(Month/16<1)
  352. Send_data1(&timer[0]); //月十位为零时不显示
  353. else
  354. Send_data1(&timer[Month/16][h]); //月值
  355. Send_data1(&timer[Month%16][h]);
  356. }
  357. Send_data1(&hanzi[h*2+673]); //月字符
  358. Send_data1(&hanzi[h*2+672]);
  359. if((Flicker==1)&(id==3)) //闪烁标志为1时不亮,为零时亮
  360. { Show_pass(); //不显示一个字

  361. }
  362. else
  363. {
  364. Send_data1(&timer[Day/16][h]); //日值
  365. Send_data1(&timer[Day%16][h]);
  366. }
  367. Send_data1(&hanzi[h*2+961]); //日字符
  368. Send_data1(&hanzi[h*2+960]);
  369. }
  370. if((id==0)&(f==2)|(id==4)) //f为三秒转换显示
  371. {
  372. Send_data2(&timer[0]); //不显示
  373. Send_data2(&hanzi[h*2+705]); //星字符
  374. Send_data2(&hanzi[h*2+704]);
  375. Send_data2(&hanzi[h*2+737]); //期字符
  376. Send_data2(&hanzi[h*2+736]);
  377. if((Flicker==1)&(id==4)) //闪烁标志为1时不亮,为零时亮
  378. { Show_pass(); //不显示一个字
  379. }
  380. else
  381. {
  382. Send_data2(&hanzi[Week%16*32+h*2+737]); //星期值
  383. Send_data2(&hanzi[Week%16*32+h*2+736]);
  384. }
  385. Send_data(&timer[0][0]); //不显示
  386. }
  387. if((id==0)&(f==3)|(id>4)) //f为三秒转换显示
  388. {
  389. if((Flicker==1)&(id==5)) //闪烁标志为1时不亮,为零时亮
  390. {
  391. Show_pass(); //不显示一个字
  392. }
  393. else
  394. {
  395. if(Hour/16<1)
  396. Send_data(&timer[0][0]); //时十位小于1时不显示
  397. else
  398. Send_data(&timer[Hour/16][h]); //时值
  399. Send_data(&timer[Hour%16][h]);
  400. }
  401. Send_data(&timer[10][h]); //两个点

  402. if((Flicker==1)&(id==6)) //闪烁标志为1时不亮,为零时亮
  403. {
  404. Show_pass(); //不显示一个字
  405. }
  406. else
  407. {
  408. Send_data(&timer[Cent/16][h]);
  409. Send_data(&timer[Cent%16][h]); //分值
  410. }
  411. Send_data(&timer[10][h]); //两个点
  412. if((Flicker==1)&(id==7)) //闪烁标志为1时不亮,为零时亮
  413. {
  414. Show_pass(); //不显示一个字
  415. }
  416. else
  417. {
  418. Send_data(&timer[Sec/16][h]); //秒
  419. Send_data(&timer[Sec%16][h]);
  420. }
  421. }
  422. if((id==0)&(f==4)) //f为三秒转换显示
  423. {
  424. Send_data1(&hanzi[h*2+1185]); //温字符
  425. Send_data1(&hanzi[h*2+1184]);
  426. Send_data1(&hanzi[h*2+1217]); //度字符
  427. Send_data1(&hanzi[h*2+1216]);
  428. Send_data1(&timer[10][h]); //两个点
  429. if (tvalue/10==0x00)
  430. Send_data(&timer[0][0]);
  431. else
  432. Send_data1(&timer[tvalue/10][h]); //温度值的十位值
  433. Send_data1(&timer[tvalue%10][h]);//温度值的个位
  434. Send_data1(timer[U8T_data_H*10%10][h]);//温度值的十分位
  435. Send_data1(timer[U8T_data_(H+0.005)*100%10][h]);//温度值的百分位
  436. Send_data1(&timer[11][h]); //温度值的符号
  437. }

  438. scan(h); //输出行信号
  439. STR=1;STR=0;
  440. STR=1; //锁存为高,595锁存信号
  441. DelayMs(); //延时,等待一段时间,让这列显示的内容在人眼内产生“视觉暂留”现象。*/

  442. }
  443. }
  444. /************************************************/
  445. //temp=255-temp;
  446. //return temp;
  447. void timer_1(void) interrupt 1 //中断入口,闪烁
  448. {
  449. TH0=0xC5; //15ms定时 晶振12M
  450. TL0=0x68;
  451. if(msec++==45) //1000ms
  452. { msec=0;
  453. x++;
  454. if(x>=4)
  455. { x=0;
  456. if(b==0) //自动模式
  457. {
  458. if(f++==2)
  459. f=0; //f显示转换计数器 ,d为用户设置的自动转换时间的值。
  460. }
  461. }
  462. if(h++==6) //5秒后进入正常走时。
  463. {id=0;h=0;}
  464. }
  465. if(msec<23)
  466. Flicker=0; //闪烁标志反转
  467. else
  468. Flicker=1;

  469. }

  470. /***********************输出一个字的不显示数据。*****************/
  471. void Show_pass()
  472. {
  473. Send_data(&timer[0][0]); //不显示
  474. Send_data(&timer[0][0]); //不显示
  475. }
  476. /**********************************************************/
  477. void in_data(void) //调整数据
  478. {
  479. char s;
  480. for(s=4;s>=0;s--) //i为向后先择字节计数器,zimuoo为向后先字计数器
  481. {
  482. BUFF[2*s+1]=hanzi[zimuo+32*s+2*line]; //把第一个字模的第一个字节放入BUFF0中,第二个字模和第一个字节放入BUFF2中
  483. BUFF[2*s]=hanzi[zimuo+1+32*s+2*line]; //把第一个字模的第二个字节放入BUFF1中,第二个字模的第二个字节放入BUFF3中
  484. }       
  485. }
  486. /***********************发送移动的数据****************************/
  487. void rxd_data(void) //串行发送数据
  488. {
  489. uchar s;
  490. uchar inc,tempyid,temp,k;
  491. if(Move<8)
  492. inc=0;
  493. else
  494. inc=1;
  495. for(s=0+inc;s<8+inc;s++) //发送8字节数据
  496. {
  497. if(Move<8)
  498. tempyid=Move;
  499. else
  500. tempyid=Move-8;
  501. temp=(BUFF[s]>>tempyid)|(BUFF[s+1]<<(8-tempyid)); //h1左移tempyid位后和h2右移8-tempyid相或,取出移位后的数据。
  502. temp=255-temp;
  503. SERg=1;
  504. for(k=0;k<8;k++)//一个字节8位 发送给595
  505. {
  506. SCK=0; //上升沿移位595
  507. SERr=(bit)(temp&0x01);//通过IO口送一个位给 595 发送最低位
  508. temp=temp>>1; //字节移位 准备送下一位
  509. SCK=1;
  510. }

  511. }
  512. }

  513. /*******************************************************/
  514. void Send_data(unsigned char *d) /*发送红色数据*/
  515. {
  516. uchar temp,k;
  517. temp=*d;
  518. SERg=1;
  519. for(k=0;k<8;k++)//一个字节8位 发送给595
  520. {
  521. SCK=0; //上升沿移位595
  522. SERr=(bit)(temp&0x01);//通过IO口送一个位给 595 发送最低位
  523. temp=temp>>1; //字节移位 准备送下一位
  524. SCK=1;
  525. }
  526. }
  527. /************************************************************/
  528. void Send_data1(unsigned char *d)/*发送绿色数据*/
  529. {
  530. uchar temp,k;
  531. temp=*d;
  532. SERr=1;
  533. for(k=0;k<8;k++)//一个字节8位 发送给595
  534. {
  535. SCK=0; //上升沿移位595
  536. SERg=(bit)(temp&0x01);//通过IO口送一个位给 595 发送最低位
  537. temp=temp>>1; //字节移位 准备送下一位
  538. SCK=1;
  539. }
  540. }
  541. /***************************************************************/
  542. void Send_data2(unsigned char *d)/*发送黄色数据*/
  543. {
  544. uchar temp,k;
  545. temp=*d;

  546. for(k=0;k<8;k++)//一个字节8位 发送给595
  547. {
  548. SCK=0; //上升沿移位595
  549. SERr=SERg=(bit)(temp&0x01);//通过IO口送一个位给 595 发送最低位
  550. temp=temp>>1; //字节移位 准备送下一位
  551. SCK=1;
  552. }
  553. }
  554. /***************************************************************/
  555. //根据选择调整相应项目
  556. void Set(uchar sel,uchar sel_1)
  557. {
  558. uchar address,time;
  559. uchar max,min;
  560. //if(sel==9) {address=0xc2; max=20;min=1;} //自动转换时间时最大为20秒。
  561. //if(sel==8) {address=0xc0; max=1;min=0; } //显示自动转换或手动转换。为零自动,为1手动。
  562. if(sel==7) {address=0x80; max=59;min=0;} //秒
  563. if(sel==6) {address=0x82; max=59;min=0;} //分钟
  564. if(sel==5) {address=0x84; max=23;min=0;} //小时
  565. if(sel==4) {address=0x8a; max=7; min=1;} //星期
  566. if(sel==3) {address=0x86; max=31;min=1;} //日
  567. if(sel==2) {address=0x88; max=12;min=1;} //月
  568. if(sel==1) {address=0x8c; max=99;min=0;} //年


  569. time=R1302(address+1)/16*10+R1302(address+1)%16;
  570. if (sel_1==0) time++; else time--;
  571. if(time>max) time=min;
  572. if(time<min) time=max;

  573. W1302(0x8e,0x00);
  574. W1302(address,time/10*16+time%10);
  575. W1302(0x8e,0x80);
  576. }
  577. /**************************延时***********************/
  578. void DelayMs(void)
  579. {
  580. uchar TempCyc;
  581. for(TempCyc=10;TempCyc>1;TempCyc--)
  582. {;}
  583. }
  584. //********DS1302读写程序***************//
  585. /********************************************************************
  586. 函 数 名:RTInputByte()
  587. 功 能:实时时钟写入一字节
  588. 说 明:往DS1302写入1Byte数据 (内部函数)
  589. 入口参数:d 写入的数据
  590. 返 回 值:无
  591. ***********************************************************************/
  592. void RTInputByte(uchar d)
  593. {
  594. uchar h;
  595. ACC = d;
  596. for(h=8; h>0; h--)
  597. {
  598. T_IO = ACC0; /*相当于汇编中的 RRC */
  599. T_CLK = 1;
  600. T_CLK = 0;
  601. ACC = ACC >> 1;
  602. }
  603. }
  604. /********************************************************************
  605. 函 数 名:RTOutputByte()
  606. 功 能:实时时钟读取一字节
  607. 说 明:从DS1302读取1Byte数据 (内部函数)
  608. 入口参数:无
  609. 返 回 值:ACC
  610. 设 计:zhaojunjie 日 期:2002-03-19
  611. 修 改: 日 期:
  612. ***********************************************************************/
  613. uchar RTOutputByte(void)
  614. {
  615. uchar h;
  616. for(h=8; h>0; h--)
  617. {
  618. ACC = ACC >>1; /*相当于汇编中的 RRC */
  619. ACC7 = T_IO;
  620. T_CLK = 1;
  621. T_CLK = 0;
  622. }
  623. return(ACC);
  624. }
  625. /********************************************************************
  626. 函 数 名:W1302()
  627. 功 能:往DS1302写入数据
  628. 说 明:先写地址,后写命令/数据 (内部函数)
  629. 调 用:RTInputByte() , RTOutputByte()
  630. 入口参数:ucAddr: DS1302地址, ucData: 要写的数据
  631. 返 回 值:无
  632. ***********************************************************************/
  633. void W1302(uchar ucAddr, uchar ucDa)
  634. {
  635. T_RST = 0;
  636. T_CLK = 0;
  637. T_RST = 1;
  638. RTInputByte(ucAddr); /* 地址,命令 */
  639. RTInputByte(ucDa); /* 写1Byte数据*/
  640. T_CLK = 1;
  641. T_RST = 0;
  642. }
  643. /********************************************************************
  644. 函 数 名:R1302()
  645. 功 能:读取DS1302某地址的数据
  646. 说 明:先写地址,后读命令/数据 (内部函数)
  647. 调 用:RTInputByte() , RTOutputByte()
  648. 入口参数:ucAddr: DS1302地址
  649. 返 回 值:ucData :读取的数据
  650. ***********************************************************************/
  651. uchar R1302(uchar ucAddr)
  652. {
  653. uchar ucData;
  654. T_RST = 0;
  655. T_CLK = 0;
  656. T_RST = 1;
  657. RTInputByte(ucAddr); /* 地址,命令 */
  658. ucData = RTOutputByte(); /* 读1Byte数据 */
  659. T_CLK = 1;
  660. T_RST = 0;
  661. return(ucData);
  662. }
  663. /********************************************************************
  664. 函 数 名:Set1302()
  665. 功 能:设置初始时间
  666. 说 明:先写地址,后读命令/数据(寄存器多字节方式)
  667. 调 用:W1302()
  668. 入口参数:pClock: 设置时钟数据地址 格式为: 秒 分 时 日 月 星期 年
  669. 7Byte (BCD码)1B 1B 1B 1B 1B 1B 1B
  670. 返 回 值:无
  671. ***********************************************************************/
  672. void Set1302(uchar *pClock)
  673. {
  674. uchar h;
  675. uchar ucAddr = 0x80;
  676. W1302(0x8e,0x00); /* 控制命令,WP=0,写操作?*/
  677. for(h =7; h>0; h--)
  678. {
  679. W1302(ucAddr,*pClock); /* 秒 分 时 日 月 星期 年 */
  680. pClock++;
  681. ucAddr +=2;
  682. }
  683. W1302(0xc0,0x01);
  684. W1302(0XC2,0X03); //初始自动转换显示时间为3秒。
  685. W1302(0x8e,0x80); /* 控制命令,WP=1,写保护?*/
  686. }
  687. /******************读取DS1302中的时间****************/
  688. void du1302()
  689. {
  690. Sec=R1302(0x81); //对取 秒 分 时 日 月 星期 年
  691. Cent=R1302(0x83);
  692. Hour=R1302(0x85);
  693. Day=R1302(0x87);
  694. Month=R1302(0x89);
  695. Week=R1302(0x8b);
  696. Year=R1302(0x8d);
  697. // b=R1302(0xc1);
  698. // a=R1302(0xc3);
  699. // a=a/16*10+a%16;

  700. }
  701. /******************************ds1820程序***************************************/
  702. void delay_18B20(unsigned int i)//延时1微秒
  703. {
  704. //i=i; //由于我用的是1T 51单片机 如果用普通51请 把这句话屏蔽
  705. while(i--);
  706. }
  707. void ds1820rst()/*ds1820复位*/
  708. { unsigned char x=0;
  709. DQ = 1; //DQ复位
  710. delay_18B20(4); //延时
  711. DQ = 0; //DQ拉低
  712. delay_18B20(100); //精确延时大于480us
  713. DQ = 1; //拉高
  714. delay_18B20(40);
  715. }
  716. uchar ds1820rd()/*读数据*/
  717. { unsigned char i=0;
  718. unsigned char dat = 0;
  719. for (i=8;i>0;i--)
  720. { DQ = 0; //给脉冲信号
  721. dat>>=1;
  722. DQ = 1; //给脉冲信号
  723. if(DQ)
  724. dat|=0x80;
  725. delay_18B20(10);
  726. }
  727. return(dat);
  728. }
  729. void ds1820wr(uchar wdata)/*写数据*/
  730. {unsigned char i=0;
  731. for (i=8; i>0; i--)
  732. { DQ = 0;
  733. DQ = wdata&0x01;
  734. delay_18B20(10);
  735. DQ = 1;
  736. wdata>>=1;
  737. }
  738. }
  739. read_temp()/*读取温度值并转换*/
  740. {
  741. uchar a,b;
  742. ds1820rst();
  743. ds1820wr(0xcc);//*跳过读序列号*/
  744. ds1820wr(0x44);//*启动温度转换*/
  745. ds1820rst();
  746. ds1820wr(0xcc);//*跳过读序列号*/
  747. ds1820wr(0xbe);//*读取温度*/
  748. a=ds1820rd();
  749. b=ds1820rd();
  750. tvalue=b*16+a/16;
  751. return(tvalue);
  752. }
  753. /*********************************************************************************************
  754. /*Timer1中断子程序*/
  755. void TR1_Service(void) interrupt 3 using 2
  756. {
  757. //static unsigned char T;
  758. // T++;
  759. // if(T>1)
  760. // {
  761. // T=0;
  762. T0_CNT ++;
  763. // }
  764. if(T0_CNT > TimeOut_cnt)
  765. {
  766. TimeOut = 1; // 超时标志
  767. }
  768. }
  769. /***********************************************************************/
  770. /*解码核心程序*/
  771. void Decode(void)
  772. {
  773. unsigned char i=0x00,j,k;
  774. static unsigned char *p; // 指向结构体IR_DATA.XX的指针
  775. EX0 = 0; // 关外部中断1
  776. /*/////////////////////////进行解码处理////////////////////////*/
  777. p = &IR_DATA.addr1;
  778. for(k=0; k<4; k++)
  779. {
  780. for(j=0; j<8; j++)
  781. {
  782. if((IR_Time[i]>D0MinTime) & (IR_Time[i]<D0MaxTime))
  783. {
  784. *p >>= 1; // 右移1位,
  785. *p &= 0x7f; // 与0111 1111置0. 数据“0” 0.56ms低电平+0.56ms高电平
  786. }
  787. else if((IR_Time[i]>D1MinTime) & (IR_Time[i]<D1MaxTime))
  788. {
  789. *p >>= 1; // 右移1位,
  790. *p |= 0x80; // 或1000 0000置1. 数据“1” 0.56ms低电平+1.69ms高电平
  791. }
  792. i ++;
  793. }
  794. p ++;
  795. }
  796. if(IR_DATA.data2+IR_DATA.data1==0XFF)
  797. {
  798. key_code=IR_DATA.data1;
  799. //new_code=1;
  800. }
  801. else
  802. {
  803. key_code=0XFF; /**非本机遥控器或数据错误**/
  804. };
  805. /*/////////////////////////解码处理完毕////////////////////////*/
  806. EX0 = 1; // 重新开放外部中断0
  807. }
  808. void serviceINT0(void) interrupt 0 using 1 //{////外部中断1的中断函数。用于红外线读数。
  809. {
  810. static unsigned char m=0;
  811. TR1=1;

  812. T0_CNT_bk = T0_CNT; // 备份时间计数值,即前一个下降沿到本下降沿的时间间隔
  813. T0_CNT = 0x00; // 清空时间计数值
  814. if(TimeOut) // 如果超时
  815. {
  816. // TL0 = TIMER0_COUNT; // 初始化定时器0 -0x1f(31)
  817. TimeOut = 0; // 清除超时标志
  818. m = 0; // 复位数据位
  819. T0_CNT = 0x00; // 清空时间计数值
  820. Guide = 0; // 清除引导标志
  821. Continuous = 0; // 清除连_发标志
  822. }
  823. else // 正常按键时长58.5ms~76.5ms
  824. {
  825. if(Guide | Continuous) // 如果引导码有效
  826. {
  827. IR_Time[m++] = T0_CNT_bk; // 保存时间间隔
  828. if(m == 32) // 接收够32数据后
  829. {
  830. m = 0;
  831. Guide = 0; // 清除引导标志
  832. //new_code=1;
  833. TR1=0;
  834. /*进行解码操作*/
  835. Decode(); // 解码
  836. //Send_RX(key_code); //如果用你自己的遥控器 请根据串口发送出来的 按键值修改下面的 动作
  837. switch (key_code)
  838. {
  839. case 0X0C: //遥控器按键值
  840. f=0; b=0;
  841. break;
  842. case 0X18://遥控器按键值
  843. f=3;b=1;
  844. break;
  845. case 0X5E://遥控器按键值
  846. f=4;b=1;
  847. break;
  848. case 0X08: //遥控器按键值
  849. f=5;b=1;
  850. break;
  851. default:
  852. break;
  853. }

  854. }
  855. }
  856. if(T0_CNT_bk > GTime) // 如果时间间隔>引导码时长
  857. {
  858. Guide = 1; // 使能引导标志
  859. m = 0;
  860. };
  861. if(T0_CNT_bk > CTime) // 如果时间间隔>连_发码时长
  862. {
  863. Continuous = 1; // 使能连_发标志
  864. m = 0;
  865. }
  866. }//end of 超时
  867. }
  868. /*******************************************************************/
  869. // uchar code sw[16]={0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f};/*16行段码*/
  870. //如果用自己的单片机实验板连接A B C D 一一对应,则用这个扫描数据
  871. //uchar code sw[16]={0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f,};/*16行段码*///138驱动数据
  872. //下面的A B C D行扫描数据是反向的 配套我们的控制卡用
  873. //uchar code sw[16]={0X00,0X08,0x04,0x0C,0X02,0X0A,0X06,0X0E,0X01,0X09,0X05,0X0D,0X03,0X0B,0X07,0X0F};/*16行段码*///138驱动数据
  874. const uchar code timer[13][16]={ /*0~9字符*/
  875. /*-- 文字: 0 --*/
  876. /*-- Book Antiqua12; 此字体下对应的点阵为:宽x高=8x20 --*/
  877. 0xFF,0xFF,0xC7,0xBB,0x7D,0x7D,0x7D,0x7D,0x7D,0x7D,0x7D,0xBB,0xC7,0xFF,0xFF,0xFF,/*"0",0*/
  878. /*-- 文字: 1 --*/
  879. /*-- Book Antiqua12; 此字体下对应的点阵为:宽x高=8x20 --*/
  880. 0xFF,0xFF,0xF7,0xF7,0xF7,0xF7,0xF7,0xF7,0xF7,0xF7,0xF1,0xF3,0xF7,0xFF,0xFF,0xFF,/*"1",0*/
  881. /*-- 文字: 2 --*/
  882. /*-- Book Antiqua12; 此字体下对应的点阵为:宽x高=8x20 --*/
  883. 0xFF,0xFF,0x81,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0xBD,0xBD,0xDB,0xE7,0xFF,0xFF,0xFF,/*"2",0*/
  884. /*-- 文字: 3 --*/
  885. /*-- Book Antiqua12; 此字体下对应的点阵为:宽x高=8x20 --*/
  886. 0xFF,0xFF,0xC3,0xBD,0xBD,0xBF,0xBF,0xCF,0xBF,0xBF,0xBD,0xBD,0xC3,0xFF,0xFF,0xFF,/*"3",0*/
  887. /*-- 文字: 4 --*/
  888. /*-- Book Antiqua12; 此字体下对应的点阵为:宽x高=8x20 --*/
  889. 0xFF,0xFF,0xBF,0xBF,0xBF,0x01,0xBD,0xBB,0xB7,0xB7,0xAF,0x9F,0xBF,0xFF,0xFF,0xFF,/*"4",0*/
  890. /*-- 文字: 5 --*/
  891. /*-- Book Antiqua12; 此字体下对应的点阵为:宽x高=8x20 --*/
  892. 0xFF,0xFF,0xC3,0xBD,0xBD,0xBF,0xBF,0xBF,0xBD,0xC1,0xFD,0xFD,0x81,0xFF,0xFF,0xFF,/*"5",0*/
  893. /*-- 文字: 6 --*/
  894. /*-- Book Antiqua12; 此字体下对应的点阵为:宽x高=8x20 --*/
  895. 0xFF,0xFF,0xC7,0xBB,0xBD,0xBD,0xBD,0xB9,0xC5,0xFD,0xBD,0xBB,0xC7,0xFF,0xFF,0xFF,/*"6",0*/
  896. /*-- 文字: 7 --*/
  897. /*-- Book Antiqua12; 此字体下对应的点阵为:宽x高=8x20 --*/
  898. 0xFF,0xFF,0xF7,0xF7,0xEF,0xEF,0xEF,0xDF,0xDF,0xDF,0xBF,0xBF,0x81,0xFF,0xFF,0xFF,/*"7",0*/
  899. /*-- 文字: 8 --*/
  900. /*-- Book Antiqua12; 此字体下对应的点阵为:宽x高=8x20 --*/
  901. 0xFF,0xFF,0xC7,0xBB,0x7D,0x7D,0xBB,0xC7,0xBB,0x7D,0x7D,0xBB,0xC7,0xFF,0xFF,0xFF,/*"8",0*/
  902. /*-- 文字: 9 --*/
  903. /*-- Book Antiqua12; 此字体下对应的点阵为:宽x高=8x20 --*/
  904. 0xFF,0xFF,0xE3,0xDD,0xBD,0xBF,0xA3,0x9D,0xBD,0xBD,0xBD,0xDD,0xE3,0xFF,0xFF,0xFF,/*"9",0*/

  905. /*-- 文字: : --*/
  906. /*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
  907. 0xFF,0xFF,0xFF,0xFF,0xE7,0xE7,0xFF,0xFF,0xFF,0xFF,0xE7,0xE7,0xFF,0xFF,0xFF,0xFF,
  908. /*-- 文字: C温度符号 --*/
  909. 0xFF,0xFC,0xFC,0x83,0xBD,0xBD,0xFE,0xFE,0xFE,0xFE,0xFE,0xBD,0xDD,0xE3,0xFF,0xFF,
  910. /*-- - -- ** 宋体, 12 **
  911. /*--黑屏字符--*/
  912. 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,

  913. };

  914. /*-- 文字: 年 --*/
  915. /*-- 黑体; 此字体下对应的点阵为:宽x高=16x17 --*/

  916. 0xFF,0xFF,0xFC,0xFF,0xFC,0xFF,0xFC,0xFF,0x80,0x00,0x80,0x00,0xFC,0xE7,0xFC,0xE7,0xE0,0x07,0xE0,0x07,0xFC,0xF9,0xFC,0xF3,0xC0,0x07,0xC0,0x07,0xFF,0xCF,0xFF,0xCF,/*"年",0*/
  917. 0xFF,0xFF,0xF3,0xF9,0xE1,0xF3,0xE7,0xF3,0xE7,0xE7,0xE7,0xE7,0xE0,0x07,0xE0,0x07,0xE7,0xE7,0xE7,0xE7,0xE0,0x07,0xE7,0xE7,0xE7,0xE7,0xE0,0x07,0xE0,0x07,0xFF,0xFF,/*"月",1*/
  918. 0xFF,0xFF,0x80,0x01,0x80,0x01,0xFE,0x7F,0xE0,0x07,0xFE,0x79,0xE0,0x01,0xE0,0x03,0xFE,0x67,0xE0,0x03,0xE7,0xF3,0xE0,0x03,0xE7,0xF3,0xE0,0x03,0xE0,0x03,0xFF,0xFF,/*"星",2*/
  919. 0xFF,0xFF,0xE7,0x3F,0xC6,0x7C,0xCC,0x99,0xCC,0xDB,0xCC,0x00,0xC0,0x00,0xC0,0x93,0xCC,0x83,0xC0,0x93,0xC0,0x83,0xCC,0x93,0xCC,0x01,0xC0,0x01,0xC0,0x93,0xFF,0x93,/*"期",3*/
  920. 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x80,0x01,0x80,0x01,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,/*"一",0*/
  921. 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x80,0x00,0x80,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xE0,0x03,0xE0,0x03,0xFF,0xFF,0xFF,0xFF,/*"二",1*/
  922. 0xFF,0xFF,0xFF,0xFF,0xC0,0x01,0xC0,0x01,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xF0,0x07,0xF0,0x07,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xE0,0x03,0xE0,0x03,0xFF,0xFF,0xFF,0xFF,/*"三",2*/
  923. 0xFF,0xFF,0xCF,0xF9,0xC0,0x01,0xC0,0x01,0xCF,0xF9,0xCF,0xE1,0xC1,0xC1,0xC0,0x89,0xCC,0x99,0xCC,0x99,0xCC,0x99,0xCC,0x99,0xCC,0x99,0xC0,0x01,0xC0,0x01,0xFF,0xFF,/*"四",3*/
  924. 0xFF,0xFF,0xFF,0xFF,0x80,0x00,0x80,0x00,0xF3,0x9F,0xF3,0x9F,0xF3,0x9F,0xF3,0x9F,0xF0,0x03,0xF0,0x03,0xFF,0x3F,0xFF,0x3F,0xFF,0x3F,0xC0,0x01,0xC0,0x01,0xFF,0xFF,/*"五",0*/
  925. 0xFF,0xFF,0xFF,0xFF,0xCF,0xF9,0xCF,0xF3,0xE7,0xE7,0xF7,0xE7,0xF3,0xCF,0xF9,0xDF,0xFF,0xFF,0x80,0x01,0x80,0x01,0xFF,0xFF,0xFE,0x7F,0xFE,0x7F,0xFF,0x3F,0xFF,0xFF,/*"六",1*/
  926. 0xFF,0xFF,0xE7,0xE7,0xE0,0x07,0xE0,0x07,0xE7,0xE7,0xE7,0xE7,0xE7,0xE7,0xE7,0xE7,0xE0,0x07,0xE0,0x07,0xE7,0xE7,0xE7,0xE7,0xE7,0xE7,0xE7,0xE7,0xE0,0x07,0xE0,0x07,/*"日",2*/
  927. /*-- 文字: 自 31--*/
  928. /*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
  929. 0xFF,0x7F,0xFF,0x7F,0xFF,0xBF,0xE0,0x07,0xEF,0xF7,0xEF,0xF7,0xE0,0x07,0xEF,0xF7,
  930. 0xEF,0xF7,0xEF,0xF7,0xE0,0x07,0xEF,0xF7,0xEF,0xF7,0xEF,0xF7,0xE0,0x07,0xFF,0xFF,
  931. /*-- 文字: 手 32--*/
  932. /*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
  933. 0xFF,0xFF,0xE0,0x7F,0xFF,0x01,0xFF,0x7F,0xFF,0x7F,0xC0,0x01,0xFF,0x7F,0xFF,0x7F,
  934. 0xFF,0x7F,0x80,0x00,0xFF,0x7F,0xFF,0x7F,0xFF,0x7F,0xFF,0x5F,0xFF,0x3F,0xFF,0xFF,
  935. /*-- 文字: 动 33--*/
  936. /*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
  937. 0xFB,0xFF,0xFB,0xFF,0xFB,0x81,0xFB,0xFF,0xC0,0xFF,0xDB,0x00,0xDB,0xF7,0xDB,0xF7,
  938. 0xDB,0xDB,0xDB,0xBB,0xDD,0x0D,0xDD,0xA0,0xDE,0xFD,0xD7,0x7F,0xEF,0xBF,0xFF,0xFF,
  939. /*-- 文字: 模 34--*/
  940. /*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
  941. 0xF6,0xFB,0xF6,0xFB,0xC0,0x1B,0xF6,0xFB,0xE0,0x20,0xEF,0xBB,0xE0,0x31,0xEF,0xA9,
  942. 0xE0,0x3A,0xFD,0xFA,0x80,0x1B,0xFD,0xFB,0xFA,0xFB,0xE6,0xFB,0x8F,0x1B,0xFF,0xFF,
  943. /*-- 文字: 式 35--*/
  944. /*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
  945. 0xFE,0xFF,0xFA,0xFF,0xF6,0xFF,0xC0,0x01,0xFE,0xFF,0xFE,0xFF,0xFE,0xFF,0xFE,0x83,
  946. 0xFD,0xEF,0xFD,0xEF,0xFD,0xEF,0xFB,0x2F,0x7B,0xC7,0x77,0xF1,0x8F,0xFF,0xFF,0xFF,
  947. 0xFF,0xFF,0xFE,0x67,0xFC,0x27,0xF9,0xE5,0xF3,0xE4,0xE7,0x81,0xCF,0xC3,0xC3,0x23,0xF3,0x27,0x92,0x41,0x92,0x41,0xC2,0x67,0xC3,0xE1,0xF3,0xC1,0xF3,0xCF,0xF3,0xFF,/*"秒",2*/
  948. 0xFF,0xFF,0x80,0x07,0x80,0x04,0xCB,0x4C,0xCB,0x49,0xCB,0x49,0xC0,0x0B,0xC0,0x0B,0xFF,0xFF,0xE0,0x1B,0xE7,0x99,0xE0,0x1C,0xE7,0x97,0xE0,0x13,0xE0,0x19,0xFF,0xFF,/*"温",0*/。
  949. 0xFF,0xFF,0xC3,0x84,0xF0,0x1C,0xF8,0x79,0xF3,0x39,0xE0,0x09,0xE0,0x09,0xFF,0xF9,0xF0,0x39,0xF3,0x39,0xC0,0x09,0xC0,0x09,0xF3,0x39,0xC0,0x01,0xC0,0x01,0xFE,0x7F,/*"度",1*/
  950. };
复制代码
此帖出自ARM技术论坛
点赞 关注
 

回复
举报
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表