找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 2148|回復(fù): 0
收起左側(cè)

長(zhǎng)時(shí)間計(jì)時(shí)(含1302,1602,DAC0832)

[復(fù)制鏈接]
ID:102668 發(fā)表于 2016-1-16 02:31 | 顯示全部樓層 |閱讀模式
  上周做了板子終于成功了,把程序發(fā)過(guò)來(lái),是關(guān)于1302時(shí)鐘芯片,1602液晶使用,和DAC0832的使用的,具體功能就不說(shuō)了,看看程序吧!其中P0接1602數(shù)據(jù)端,1602的E接p20,rs接p21,r/w接p22。1302時(shí)鐘芯片rst接p30,sclk接p31,i/o接p32,P1口是DAC0832的數(shù)據(jù)端口,其cs接p34,wr接p36,p24-p27接按鍵。下面是具體程序


程序編寫(xiě)比較亂,湊合看吧!編寫(xiě)程序好的習(xí)慣是很重要的。




  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端口設(shè)置
  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);// 秒鐘設(shè)定
  130. write_command_1302(0x82,minute_set);// 分鐘設(shè)定
  131. write_command_1302(0x84,hour_set);// 小時(shí)設(shè)定
  132. write_command_1302(0x86,day_set);// 日期設(shè)定
  133. write_command_1302(0x88,month_set);// 月份設(shè)定
  134. write_command_1302(0x8a,week_set);// 星期設(shè)定
  135. write_command_1302(0x8c,year_set);// 年份設(shè)定
  136. }  
  137. void DS1302_read()
  138. {
  139. second= read_date_1302(0x81);         //  秒鐘設(shè)定
  140. minute= read_date_1302(0x83);         //  分鐘設(shè)定
  141. hour  = read_date_1302(0x85);
  142. day   = read_date_1302(0x87);
  143. month = read_date_1302(0x89);         //  月份設(shè)定
  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();             //開(kāi)機(jī)顯示歡迎詞
  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)      //試驗(yàn)停止則顯示時(shí)間不變化了
  292. {
  293. DS1302_read();
  294. BCD_change();
  295. ledbuf[0]=minute1/10;  //處理數(shù)據(jù)轉(zhuǎn)化段碼
  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
復(fù)制代碼




回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表