找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1688|回复: 0
打印 上一主题 下一主题
收起左侧

长时间计时(含1302,1602,DAC0832)

[复制链接]
跳转到指定楼层
楼主
ID:102668 发表于 2016-1-16 02:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
  上周做了板子终于成功了,把程序发过来,是关于1302时钟芯片,1602液晶使用,和DAC0832的使用的,具体功能就不说了,看看程序吧!其中P0接1602数据端,1602的E接p20,rs接p21,r/w接p22。1302时钟芯片rst接p30,sclk接p31,i/o接p32,P1口是DAC0832的数据端口,其cs接p34,wr接p36,p24-p27接按键。下面是具体程序


程序编写比较乱,凑合看吧!编写程序好的习惯是很重要的。




  1. #include<reg51.h>
  2. #include<intrins.h>
  3. #define uint unsigned int
  4. #define uchar unsigned char
  5. #define ledlen 8
  6. unsigned char pos;    //wei xuan duan bian
  7. unsigned char ledbuf[8];
  8. unsigned char ledbuf1[2];
  9. uint num;
  10. char zhankong;
  11. sbit p10=P3^3;
  12. bit sign;
  13. sbit sclk_1302=P3^1;      //1302端口设置
  14. sbit io_1302  =P3^2;
  15. sbit rst_1302 =P3^0;
  16. sbit lcden=P2^0;
  17. sbit lcdrs=P2^1;
  18. sbit dula=P2^2;
  19. sbit wela=P2^3;
  20. sbit p24=P2^4;
  21. sbit p25=P2^5;
  22. sbit p11=P2^6;  //pwm +
  23. sbit p12=P2^7;   //pwm -
  24. sbit p34=P3^4;
  25. sbit p36=P3^6;
  26. unsigned char huanying[]="welcome!";
  27. unsigned char huanying1[]="yu xin";
  28. unsigned char time[]="time:";
  29. unsigned char percent[]="percent:";
  30. float temp;
  31. uchar second ,minute, day, month, year, week,hour;
  32. unsigned long int hour5=0;
  33. uchar second_set=0x00 ,minute_set=0x00, day_set=0x28, month_set=0x01, year_set=0x10, week_set=0x04,hour_set=0x00;
  34. uchar second1=34 ,minute1=67, day1, month1, year1, week1,hour1;
  35. code unsigned char ledmap[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e };   //0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71
  36. void delay(unsigned int cnt)
  37. { unsigned char i;
  38.   while(cnt--!=0)
  39.   for(i=100;i!=0;i--);
  40. }
  41. void write_command_1302(uchar date,uchar date1)
  42. {
  43. uchar i;
  44. rst_1302=0;
  45. for(i=0;i<8;i++)
  46. {
  47. sclk_1302=0;
  48. delay(1);
  49. rst_1302=1;
  50. if(date&0x01==0x01)
  51. {
  52. io_1302=1;
  53. }
  54. else
  55. {
  56. io_1302=0;
  57. }
  58. sclk_1302=1;
  59. date=date>>1;
  60. }
  61. for(i=0;i<8;i++)
  62. {
  63. sclk_1302=0;
  64. delay(1);
  65. if(date1&0x01==0x01)
  66. {
  67. io_1302=1;
  68. }
  69. else
  70. {
  71. io_1302=0;
  72. }
  73. sclk_1302=1;
  74. date1=date1>>1;
  75. }
  76. rst_1302=0;
  77. }
  78. uchar read_date_1302(uchar date)
  79. {
  80. uchar i;
  81. uchar date1=0x00;
  82. rst_1302=0;
  83. for(i=0;i<8;i++)
  84. {
  85. sclk_1302=0;
  86. delay(5);
  87. rst_1302=1;
  88. if(date&0x01==0x01)
  89. {
  90. io_1302=1;
  91. }
  92. else
  93. {
  94. io_1302=0;
  95. }
  96. date=date>>1;
  97. sclk_1302=0;
  98. sclk_1302=1;
  99. }
  100. for(i=0;i<7;i++)
  101. {  
  102. sclk_1302=0;
  103. if(io_1302==1)
  104. {
  105. date1=(date1|0x80);
  106. }
  107. else
  108. {
  109. date1=(date1|0x00);
  110. }
  111. sclk_1302=1;
  112. date1=date1>>1;
  113. }
  114. return date1;
  115. rst_1302=0;
  116. }
  117. void write_RAM_DS1302()
  118. {
  119. write_command_1302(0xc0,0x22);
  120. }
  121. uchar read_RAM_DS1302()
  122. {
  123. uchar temp;
  124. temp=read_date_1302(0xc1);
  125. return temp;
  126. }
  127. void DS1302_init()
  128. {
  129.   write_command_1302(0x80,second_set);// 秒钟设定
  130. write_command_1302(0x82,minute_set);// 分钟设定
  131. write_command_1302(0x84,hour_set);// 小时设定
  132. write_command_1302(0x86,day_set);// 日期设定
  133. write_command_1302(0x88,month_set);// 月份设定
  134. write_command_1302(0x8a,week_set);// 星期设定
  135. write_command_1302(0x8c,year_set);// 年份设定
  136. }  
  137. void DS1302_read()
  138. {
  139. second= read_date_1302(0x81);         //  秒钟设定
  140. minute= read_date_1302(0x83);         //  分钟设定
  141. hour  = read_date_1302(0x85);
  142. day   = read_date_1302(0x87);
  143. month = read_date_1302(0x89);         //  月份设定
  144. week  = read_date_1302(0x8b);
  145. year  = read_date_1302(0x8d);
  146. }
  147. void BCD_change()
  148. {
  149. second1=((second&0x70)>>4)*10+(second&0x0f);
  150. minute1=((minute&0x70)>>4)*10+(minute&0x0f);
  151. hour1=((hour&0x70)>>4)*10+(hour&0x0f);
  152. day1=((day&0x70)>>4)*10+(day&0x0f);
  153. month1=((month&0x70)>>4)*10+(month&0x0f);
  154. year1=((year&0x70)>>4)*10+(year&0x0f);
  155. week1=((week&0x70)>>4)*10+(week&0x0f);
  156. if(week1>7)
  157. {
  158. week1=7;
  159. }
  160. }
  161. void scankey()   //扫描按键
  162. {
  163. if(p10==1&sign==1)
  164. {
  165. sign=0;
  166. DS1302_init();
  167. }
  168. if(p10==0)
  169. {
  170. sign=1;
  171. second_set=second;
  172. minute_set=minute;
  173. hour_set=0x00;
  174. hour5=hour5+hour1;
  175. }
  176. if(p11==0)  //p11口按键及处理程序
  177. {
  178. delay(100);
  179. if(p11==0)
  180. {
  181. do delay(10);
  182. while(p11==0);
  183. zhankong++;
  184. if(zhankong>99)
  185. {
  186. zhankong=99;
  187. }
  188. }
  189. }
  190. if(p12==0)  //p11口按键及处理程序
  191. {
  192. delay(100);
  193. if(p12==0)
  194. {
  195. do delay(10);
  196. while(p12==0);
  197. zhankong--;
  198. if(zhankong<0)
  199. {
  200. zhankong=0;
  201. }
  202. }
  203. }
  204. if(p24==0)  //p11口按键及处理程序
  205. {
  206. delay(100);
  207. if(p24==0)
  208. {
  209. do delay(10);
  210. while(p24==0);
  211. zhankong=zhankong-10;
  212. if(zhankong<0)
  213. {
  214. zhankong=0;
  215. }
  216. }
  217. }
  218. if(p25==0)  //p11口按键及处理程序
  219. {
  220. delay(100);
  221. if(p25==0)
  222. {
  223. do delay(10);
  224. while(p25==0);
  225. zhankong=zhankong+10;
  226. if(zhankong>99)
  227. {
  228. zhankong=99;
  229. }
  230. }
  231. }
  232. p34=0;
  233. p36=0;
  234. temp=zhankong*2.55;
  235. P1=(int)temp;
  236. p34=1;
  237. p36=1;
  238. }
  239. void write_com(uchar com)
  240. {
  241. lcdrs=0;
  242. P0=com;
  243. delay(5);
  244. lcden=1;
  245. delay(5);
  246. lcden=0;
  247. }
  248. void write_data(uchar date)
  249. {
  250. lcdrs=1;
  251. P0=date;
  252. delay(5);
  253. lcden=1;
  254. delay(5);
  255. lcden=0;
  256. }
  257. void init()
  258. {
  259. dula=0;
  260. wela=0;
  261. lcden=0;
  262. write_com(0x38);
  263. write_com(0x0e);
  264. write_com(0x06);
  265. write_com(0x01);
  266. write_com(0x80+0x10);
  267. }
  268. void main()
  269. {
  270. p10=0;
  271. init();             //开机显示欢迎词
  272. write_com(0x80+0x03);
  273. for(num=0;num<8;num++)
  274. {
  275. write_data(huanying[num]);
  276. delay(20);
  277.          }
  278. write_com(0x80+0x44);
  279. for(num=0;num<6;num++)
  280. {
  281. write_data(huanying1[num]);
  282. delay(20);
  283. }
  284. delay(5000);
  285. init();

  286. DS1302_init();
  287. DS1302_read();
  288. BCD_change();
  289. while(1)
  290. {
  291. if(sign==0)      //试验停止则显示时间不变化了
  292. {
  293. DS1302_read();
  294. BCD_change();
  295. ledbuf[0]=minute1/10;  //处理数据转化段码
  296. ledbuf[1]=minute1;
  297. ledbuf[2]=second1/10;
  298. ledbuf[3]=second1;
  299. ledbuf[4]=hour5/1000;
  300. ledbuf[5]=hour500/100;
  301. ledbuf[6]=hour50/10;
  302. ledbuf[7]=hour5;
  303. }
  304. ledbuf1[0]=zhankong/10;
  305. ledbuf1[1]=zhankong;
  306. scankey();
  307. write_com(0x80);
  308. for(num=0;num<5;num++)
  309. {
  310. write_data(time[num]);
  311. delay(20);
  312.          }
  313. write_data(ledbuf[4]+0x30);
  314.   delay(20);
  315. write_data(ledbuf[5]+0x30);
  316.   delay(20);
  317. write_data(ledbuf[6]+0x30);
  318.   delay(20);
  319. write_data(ledbuf[7]+0x30);
  320.   delay(20);
  321. write_data(time[4]);
  322.   delay(20);
  323. write_data(ledbuf[0]+0x30);
  324.   delay(20);
  325. write_data(ledbuf[1]+0x30);
  326. write_data(time[4]);
  327. write_data(ledbuf[2]+0x30);
  328.   delay(20);
  329. write_data(ledbuf[3]+0x30);
  330.   delay(20);
  331.    write_com(0x80+0x40);
  332. for(num=0;num<8;num++)
  333. {
  334. write_dat
复制代码




分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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