找回密码
 注册会员
更新自动建库工具PCB Footprint Expert 2024.04 Pro / Library Expert 破解版

51单片机制作的电子时钟带日期显示,注释详细适合初学者

[复制链接]
admin 发表于 2010-5-27 20:32:50 | 显示全部楼层 |阅读模式

本文包含原理图、PCB、源代码、封装库、中英文PDF等资源

您需要 登录 才可以下载或查看,没有账号?注册会员

×
51单片机制作的电子时钟带日期显示,注释详细适合初学者


  1. #include<reg51.h>
  2. #define Bus P0//数据线
  3. #define Key_port P1//键盘端口
  4. #define Select P2//位选择端口
  5. #define OFF 0xff
  6. //分别定义四个键值
  7. #define UP 3
  8. #define DOWN 1
  9. #define SETUP 2
  10. #define CHOOSE 4
  11. #define Glitter_time 40//闪烁时间
  12. #define Key_delay 16//去抖动的时间
  13. #define Backtrack_time 3 //定义多少秒后自动返回时间页面
  14. unsigned char code LedTable[11]={
  15. 0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xFF
  16. };//0到9的字型码,共阳数码管
  17. unsigned char code Month_max[2][13]={
  18. {0,31,28,31,30,31,30,31,31,30,31,30,31},
  19. {0,31,29,31,30,31,30,31,31,30,31,30,31}
  20. };
  21. unsigned char code time_max[3]={59,59,23};
  22. unsigned char glitter[6]={0,0,0,0,0,0};
  23. unsigned char date[3]; //日期数组
  24. unsigned char time[3]; //时间数组
  25. unsigned char desecond; //秒计算辅助变量
  26. unsigned char leap_year; //闰年标志位,1为闰年
  27. bit second_flag; //秒改变标志
  28. bit page=0; //显示页面标志,默认显示时间
  29. unsigned char backtrack=0; //自动返回时间页面变量
  30. //*******************************************]

  31. //时钟及日期初始化函数
  32. void ClockInit(void)
  33. {
  34. date[2]=5; //年初始化
  35. date[1]=5; //月初始化
  36. date[0]=27; //日初始化
  37. time[2]=23; //小时初始化
  38. time[1]=40; //分初始化
  39. time[0]=30; //秒初始化
  40. desecond=0;
  41. second_flag=0; //

  42. //开定时器0,设定为工作方式1,设定定时初值
  43. IE=0x82; //允许中断,选中T0中断
  44. TMOD=0x01; //定时器0,使用TR0启动方式,选中工作方式1
  45. TH0=0x3C; //设置定时初值 65536-50000=15536
  46. TL0=0xB1; //考虑中断响应时间,把B0改为B1
  47. TR0=1; //启动T0
  48. }
  49. //*******************************************]

  50. //中断响应函数
  51. void Timer(void) interrupt 1 using 1
  52. {
  53. TH0=0x3C; //重载定时初值 65536-50000=15536
  54. TL0=0xB1; //考虑中断响应时间(约20us),把B0改为B1
  55. // 时钟处理
  56. desecond++;
  57. if(desecond>19)
  58. {
  59. desecond=0; //50000*20=1000000
  60. second_flag=1;
  61. }
  62. }
  63. //*******************************************]

  64. //时间函数
  65. void Clock(void)
  66. {
  67. if(second_flag==1)
  68. {
  69. if(backtrack<Backtrack_time)
  70. backtrack++;
  71. else
  72. page=0;
  73. time[0]++; //秒位增加
  74. if(time[0]>59)
  75. {
  76. time[0]=0;
  77. time[1]++; //分位增加
  78. if(time[1]>59)
  79. {
  80. time[1]=0;
  81. time[2]++; //小时增加
  82. if(time[2]>23)
  83. {
  84. time[2]=0;
  85. date[0]++; //日期增加
  86. if((date[2]%4)==0)//判断是否是闰年
  87. leap_year=1;//1为闰年
  88. else
  89. leap_year=0;
  90. if(date[0]>Month_max[leap_year][date[1]])
  91. {
  92. date[0]=1;
  93. date[1]++; //月增加
  94. if(date[1]>12)
  95. {
  96. date[1]=1;
  97. date[2]++;//年增加
  98. date[2]=date[2]%100;
  99. }
  100. }
  101. }
  102. }
  103. }
  104. second_flag=0;
  105. }
  106. }
  107. //*******************************************

  108. //延时函数
  109. void DelayXms(unsigned int count)
  110. {
  111. unsigned int delay;
  112. unsigned int Xms;
  113. for(Xms=0;Xms<count;Xms++)
  114. for(delay=0;delay<200;delay++)
  115. ;
  116. }
  117. //*******************************************

  118. //显示一位函数
  119. void Dis_one_bit(unsigned char One_bit,unsigned char select_bit)
  120. {
  121. Bus=LedTable[One_bit];
  122. Select=~select_bit;
  123. DelayXms(1);
  124. Select=OFF;
  125. }
  126. //*******************************************

  127. //显示一字节函数
  128. void Dis_one_word(unsigned char word,unsigned char select_word)
  129. {
  130. unsigned char one,ten,select_temp=1;
  131. one=word%10;
  132. ten=word/10;
  133. select_temp<<=select_word;
  134. Dis_one_bit(one,select_temp);
  135. select_temp<<=1;
  136. Dis_one_bit(ten,select_temp);
  137. }
  138. //*******************************************

  139. //显示一个页面函数
  140. void Display(bit page)
  141. {
  142. unsigned char temp1,temp2;
  143. if(page==0)
  144. {
  145. for(temp1=0;temp1<3;temp1++)
  146. {
  147. temp2=temp1+temp1;
  148. if(glitter[temp1]<Glitter_time)
  149. Dis_one_word(time[temp1],temp2);
  150. else
  151. DelayXms(2);
  152. }
  153. }
  154. else
  155. {
  156. for(temp1=0;temp1<3;temp1++)
  157. {
  158. temp2=temp1+temp1;
  159. if(glitter[temp1+3]<Glitter_time)
  160. Dis_one_word(date[temp1],temp2);
  161. else
  162. DelayXms(2);
  163. }
  164. }
  165. }
  166. //*******************************************

  167. //键盘去抖动函数
  168. void Remove_tingle(unsigned char key_delay,unsigned char choise)
  169. {
  170. unsigned char temp;
  171. glitter[choise]=Glitter_time-1;
  172. for(temp=0;temp<key_delay;temp++)
  173. {
  174. Display(page);
  175. }
  176. }
  177. //*******************************************

  178. //键盘检测函数
  179. unsigned char Key(unsigned char choise)
  180. {
  181. unsigned char temp;
  182. temp=Key_port|0xF0;
  183. if(temp==0xFF)
  184. return(0);
  185. Remove_tingle(Key_delay,choise);//去抖动
  186. temp=Key_port|0xF0;
  187. switch(temp)
  188. {
  189. case 0xFE: return(1);
  190. case 0xFD: return(2);
  191. case 0xFB: return(3);
  192. case 0xF7: return(4);
  193. default : return(0);
  194. }
  195. }
  196. //*******************************************

  197. //键盘处理函数
  198. void Key_process(void)
  199. {
  200. unsigned char key_temp,key_data,choise;
  201. if(page==1)
  202. choise=3;
  203. else
  204. choise=0;
  205. key_data=Key(choise);//读取键盘
  206. if(key_data==UP)//向上翻页
  207. {
  208. page=1;
  209. backtrack=0;
  210. return;
  211. }
  212. if(key_data==DOWN)//向下翻页
  213. {
  214. page=0;
  215. return;
  216. }
  217. if(key_data!=SETUP)//不是进行设置
  218. return;
  219. TR0=0;//关闭T0;
  220. while(1)
  221. {
  222. key_temp=Key(choise);
  223. if((date[2]%4)==0)
  224. leap_year=1;//闰年标志位,1为闰年
  225. else
  226. leap_year=0;
  227. switch(key_temp)
  228. {
  229. case SETUP:
  230. page=0;//默认显示时间
  231. glitter[choise]=0;//消闪烁
  232. TR0=1;//启动T0
  233. return;
  234. case CHOOSE:
  235. glitter[choise]=0;
  236. choise=(choise+1)%6;
  237. if(choise>2)
  238. page=1;
  239. else
  240. page=0;
  241. break;
  242. case UP:
  243. if(choise<3)
  244. if(time[choise]<time_max[choise])
  245. time[choise]++;
  246. else
  247. time[choise]=0;
  248. else if(choise==3)
  249. {
  250. page=1;
  251. if(date[0]<Month_max[leap_year][date[1]])
  252. date[0]++;
  253. else
  254. date[0]=1;
  255. }
  256. else if(choise==4)
  257. {
  258. if((date[2]%4)==0)
  259. leap_year=1;//闰年标志位,1为闰年
  260. else
  261. leap_year=0;
  262. if(date[0]>Month_max[leap_year][date[1]])
  263. date[0]=Month_max[leap_year][date[1]];
  264. page=1;
  265. if(date[1]<12)
  266. date[1]++;
  267. else
  268. date[1]=1;
  269. }
  270. else if(choise==5)
  271. {
  272. if((date[2]%4)==0)
  273. leap_year=1;//闰年标志位,1为闰年
  274. else
  275. leap_year=0;
  276. if(date[0]>Month_max[leap_year][date[1]])
  277. date[0]=Month_max[leap_year][date[1]];
  278. page=1;
  279. if(date[2]<99)
  280. date[2]++;
  281. else
  282. date[2]=0;
  283. }
  284. break;
  285. case DOWN:
  286. if(choise<3)
  287. if(time[choise]>0)
  288. time[choise]--;
  289. else
  290. time[choise]=time_max[choise];
  291. else if((choise==3))
  292. {
  293. page=1;
  294. if(date[0]>1)
  295. date[0]--;
  296. else
  297. date[0]=Month_max[leap_year][date[1]];
  298. }
  299. else if(choise==4)
  300. {
  301. if((date[2]%4)==0)
  302. leap_year=1;//闰年标志位,1为闰年
  303. else
  304. leap_year=0;
  305. if(date[0]>Month_max[leap_year][date[1]])
  306. date[0]=Month_max[leap_year][date[1]];
  307. page=1;
  308. if(date[1]>1)
  309. date[1]--;
  310. else
  311. date[1]=12;
  312. }
  313. else if(choise==5)
  314. {
  315. if((date[2]%4)==0)
  316. leap_year=1;//闰年标志位,1为闰年
  317. else
  318. leap_year=0;
  319. if(date[0]>Month_max[leap_year][date[1]])
  320. date[0]=Month_max[leap_year][date[1]];
  321. page=1;
  322. if(date[2]>0)
  323. date[2]--;
  324. else
  325. date[2]=99;
  326. }
  327. break;
  328. default: ;
  329. }
  330. glitter[choise]=(glitter[choise]+1)%(Glitter_time+Glitter_time);//用来控制被选中的位亮或灭
  331. Display(page);
  332. }
  333. }
  334. //*******************************************

  335. //主函数
  336. void main(void)
  337. {
  338. ClockInit();
  339. while(1)
  340. {
  341. Key_process();
  342. Clock();
  343. Display(page);
  344. }
  345. }
复制代码
田力 发表于 2012-5-10 19:09:38 | 显示全部楼层
{:soso_e179:}谢谢
339659359 发表于 2012-5-11 21:34:41 | 显示全部楼层
下来试试看看,谢谢楼主啦啦啦

本文内容摘录自:MCU资讯论坛(http://www.mcuzx.net/) 详细文章请参考:http://www.mcuzx.net/thread-849-1-1.html
*滑块验证:
您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

QQ|手机版|MCU资讯论坛 ( 京ICP备18035221号-2 )|网站地图

GMT+8, 2024-11-23 10:25 , Processed in 0.051913 second(s), 10 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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