找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3975|回复: 1
收起左侧

带年月日闹钟的时钟 带proteus仿真

[复制链接]
ID:124094 发表于 2016-5-30 20:41 | 显示全部楼层 |阅读模式
带年月日闹钟的时钟 带proteus仿真

0.png
带proteus仿真图

0.png
所有资料下载:
hui2.rar (64.86 KB, 下载次数: 43)


程序:
  1. #include<reg52.h>
  2. #define uchar unsigned char
  3. #define uint unsigned int
  4. #define play P0
  5. sbit LSA=P2^0;
  6. sbit LSB=P2^1;
  7. sbit LSC=P2^2;
  8. sbit led=P2^3; //闹钟检测
  9. sbit k1=P2^7;//功能切换
  10. sbit k2=P2^6;//设置加
  11. sbit k3=P2^5;// 设置减
  12. sbit k4=P2^4; //设置位选
  13. sbit beet=P1^5; //蜂鸣器输出口
  14. uchar y;//按键松开
  15. uchar kai;//闹钟开启标志
  16. uchar she;//设置标志
  17. uchar t;//时间计数
  18. uchar num;//功能切换
  19. uchar fen;
  20. uchar shi;
  21. uchar miao;
  22. uchar yue;
  23. uchar nian;
  24. uchar ri;
  25. uchar shijian[8];
  26. uchar shi1; //闹铃时
  27. uchar fen1; //闹铃分
  28. unsigned char code shuma[12]={
  29. 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07, //数码管显示数组0到9
  30. 0x7f,0x6f,0x40,0x00};
  31. uchar brunyue[12]={31,28,31,30,31,30,31,31,30,31,30,31};
  32. uchar runyue[12]={31,29,31,30,31,30,31,31,30,31,30,31};
  33. void zhongshe();
  34. void qishe();
  35. void naoshe();
  36. void shezhi();
  37. void delay10ms(void) //误差 0us
  38. {
  39. unsigned char a,b,c;
  40. for(c=1;c>0;c--)
  41. for(b=38;b>0;b--)
  42. for(a=130;a>0;a--);
  43. }
  44. void naozhong()
  45. { uint a,m;
  46. if((shi1==shi)&&(fen1==fen)&&(kai%2))
  47. { for(m=20;m>0;m--)
  48. for(a=10;a>0;a--)
  49. if((k1==0)||(k2==0)||(k3==0)||(k4==0))
  50. { kai=0;break; }
  51. else
  52. beet=~beet;
  53. }
  54. }
  55. void plays() //输出显示
  56. {
  57. unsigned char i;
  58. unsigned int j;
  59. for(i=0;i<8;i++)
  60. {
  61. switch(i) //位选,选择点亮的数码管,
  62. {
  63. case(0):
  64. LSA=0;LSB=0;LSC=0; break;//显示第0位
  65. case(1):
  66. LSA=1;LSB=0;LSC=0; break;//显示第1位
  67. case(2):
  68. LSA=0;LSB=1;LSC=0; break;//显示第2位
  69. case(3):
  70. LSA=1;LSB=1;LSC=0; break;//显示第3位
  71. case(4):
  72. LSA=0;LSB=0;LSC=1; break;//显示第4位
  73. case(5):
  74. LSA=1;LSB=0;LSC=1; break;//显示第5位
  75. case(6):
  76. LSA=0;LSB=1;LSC=1; break;//显示第6位
  77. case(7):
  78. LSA=1;LSB=1;LSC=1; break;//显示第7位
  79. }
  80. play=shuma[shijian[i]];
  81. if(t>50)
  82. { switch(she)
  83. {
  84. case(3):
  85. if((i==0)||(i==1))
  86. play=0x00; break;
  87. case(2):
  88. if((i==3)||(i==4))
  89. play=0x00; break;
  90. case(1):
  91. if((i==6)||(i==7))
  92. play=0x00; break;
  93. }
  94. }
  95. j=10; //扫描间隔时间设定
  96. while(j--);
  97. play=0x00;//消隐
  98. }
  99. }
  100. void nao()//闹钟赋值
  101. { shijian[7]=kai;
  102. shijian[6]=11;
  103. shijian[5]=11;
  104. shijian[4]=fen1%10;
  105. shijian[3]=fen1/10;
  106. shijian[2]=10;
  107. shijian[1]=shi1%10;
  108. shijian[0]=shi1/10;


  109. }
  110. void rili() //日期赋值
  111. { shijian[7]=ri%10;
  112. shijian[6]=ri/10;
  113. shijian[5]=10;
  114. shijian[4]=yue%10;
  115. shijian[3]=yue/10;
  116. shijian[2]=10;
  117. shijian[1]=nian%10;
  118. shijian[0]=nian/10;
  119. }
  120. void zhong()//电子钟赋值
  121. { shijian[7]=miao%10;
  122. shijian[6]=miao/10;
  123. shijian[5]=10;
  124. shijian[4]=fen%10;
  125. shijian[3]=fen/10;
  126. shijian[2]=10;
  127. shijian[1]=shi%10;
  128. shijian[0]=shi/10;
  129. }
  130. void InitTimer0(void)
  131. {
  132. TMOD = 0x01;
  133. TH0 = 0x0D8;
  134. TL0 = 0x0F0;
  135. EA = 1;
  136. ET0 = 1;
  137. TR0 = 1;
  138. }
  139. void shezhi()//功能设置函数
  140. { if((she!=0)&&((k2==0)||(k3==0)))
  141. { delay10ms();
  142. if((she!=0)&&((k2==0)||(k3==0)))
  143. {
  144. switch(num)
  145. { case(0):
  146. zhongshe(); break;
  147. case(1):
  148. qishe(); break;
  149. case(2):
  150. naoshe();break;
  151. }
  152. }
  153. }
  154. }
  155. void main()
  156. {
  157. num=0;kai=1;she=0;
  158. fen1=1;shi1=0;
  159. miao=0;fen=0;shi=0;
  160. ri=29;yue=5;nian=16;
  161. InitTimer0();
  162. while(1)
  163. {
  164. if(k1==0)
  165. {delay10ms();
  166. if(k1==0)
  167. {num=(num+4)%3;
  168. she=0;}
  169. led=~led;
  170. while(!k1) ;}
  171. if(k4==0)
  172. {delay10ms();
  173. if(k4==0)
  174. she=(she+5)%4;
  175. while(!k4) ;
  176. }
  177. shezhi();
  178. naozhong();
  179. plays();

  180. }
  181. }
  182. void Timer0Interrupt(void) interrupt 1
  183. {
  184. TH0 = 0x0D8;
  185. TL0 = 0x0F0;
  186. t++;
  187. if(t==100)
  188. { t=0;
  189. miao++;
  190. if(miao>59)
  191. { miao=0;
  192. fen++;
  193. if(fen>59)
  194. {
  195. fen=0;
  196. shi++;
  197. if(shi>23)
  198. {
  199. shi=0;
  200. ri++;
  201. if(nian%4==0)
  202. { if(ri>runyue[yue-1])
  203. { ri=1;
  204. yue++; }
  205. if(yue>12)
  206. { yue=1;
  207. nian++;}
  208. }
  209. else
  210. {if(ri>brunyue[yue-1])
  211. {
  212. ri=0;
  213. yue++;
  214. }
  215. if(yue>12)
  216. {
  217. yue=0;
  218. nian++ ;
  219. }


  220. }
  221. }
  222. }
  223. }
  224. }
  225. switch(num)
  226. {
  227. case(0):
  228. zhong();break;
  229. case(1):
  230. rili();break;
  231. case(2):
  232. nao();break;
  233. default: zhong();
  234. }
  235. }
  236. void zhongshe()
  237. { switch(she)
  238. {
  239. case(1):
  240. miao=0;InitTimer0();break;
  241. case(2):
  242. if(k2==0)
  243. fen=(fen+61)%60;
  244. else
  245. fen=(fen+59)%60;
  246. break;
  247. case(3):
  248. if(k2==0)
  249. shi=(shi+25)%24;
  250. else
  251. shi=(shi+23)%24;
  252. break;
  253. }
  254. while((!k2)||(!k3)) ;
  255. }
  256. void naoshe()
  257. { switch(she)
  258. {
  259. case(1):
  260. if(kai==1)
  261. kai=0;
  262. else kai=1; break;
  263. case(2):
  264. if(k2==0)
  265. fen1=(fen1+61)%60;
  266. else
  267. fen1=(fen1+59)%60;
  268. break;
  269. case(3):
  270. if(k2==0)
  271. shi1=(shi1+25)%24;
  272. else
  273. shi1=(shi1+23)%24;
  274. break;
  275. }
  276. while((!k2)||(!k3)) ;
  277. }
  278. void qishe()
  279. { switch(she)
  280. {
  281. case(1):
  282. if(k2==0)
  283. {if(nian%4==0)
  284. ri=(ri+runyue[yue-1]+2)%(runyue[yue-1]+1) ;
  285. else
  286. ri=(ri+brunyue[yue-1]+2)%(brunyue[yue-1]+1);
  287. }

  288. else
  289. { if(nian%4==0)
  290. ri=(ri+runyue[yue-1])%(runyue[yue-1]+1) ;
  291. else
  292. ri=(ri+brunyue[yue-1])%(brunyue[yue-1]+1);
  293. }
  294. break;
  295. case(2):
  296. if(k2==0)
  297. yue=(yue+14)%13;
  298. else
  299. yue=(yue+12)%13;
  300. break;
  301. case(3):
  302. if(k2==0)
  303. nian++;
  304. else
  305. nian--;
  306. }
  307. while((!k2)||(!k3)) ;}
复制代码


评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:104845 发表于 2016-6-3 10:28 来自手机 | 显示全部楼层
51黑有你更精彩

回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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