单片机论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

程序闹钟-用at89s52和七段数码管实现计时时钟并用4x4矩阵键盘控制

[复制链接]
跳转到指定楼层
楼主
daming 发表于 2014-12-30 23:44 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
  1. /*

  2. 程序名称:at89s52实现时钟《二》
  3. 程序功能:用at89s52和七段数码管实现计时时钟并用4x4矩阵键盘控制
  4. 运行环境:keil uv2

  5. 需改进点:未能用键盘设置闹钟
  6. 作者      :hankjulianth
  7. */

  8. #include"reg52.h"
  9. #define uchar unsigned char
  10. #define uint  unsigned int
  11. uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
  12. uint sec,min,hour;//秒,分,时计数
  13. uint t1;//定义计数器
  14. sbit sc=P1^7;//锁存信号
  15. sbit sp=P1^1;//蜂鸣器
  16. void _init_();//初始化函数
  17. void timer0();//定时器T0中断函数
  18. void showtime();//时间显示函数
  19. void speker(uint,uint);//蜂鸣器函数,定时闹钟
  20. void settime(uint,uint,uint);
  21. void delay(uint);//延时函数
  22. //键盘控制区设置
  23. //六键控制
  24. //一键控制开始,一键控制停止
  25. //一键控制分钟加,一键控制分钟减,一键控制小时加,一键控制小时减,用于调时
  26. uint temp;
  27. /*

  28. void stop();//计时停止
  29. void _key_5();
  30. void start();//计时开始
  31. void _key_6();
  32. */
  33. void minminu();//分钟减
  34. void _key_1();
  35. void minadd();//分钟加
  36. void _key_2();
  37. void hourminu();//小时减
  38. void _key_3();
  39. void houradd();//小时加
  40. void _key_4();
  41. uchar key;//键值
  42. void main()
  43. {
  44.   t1=0;
  45.   settime(0,0,0);
  46.   temp=0;
  47.   _init_();
  48.   while(1)
  49.   {
  50.     //键盘监测程序
  51.   P3=0x0f;
  52.   temp=P3;
  53.   if(temp!=0x0f)
  54.   {
  55.    
  56.    temp=P3;
  57.    if(temp!=0x0f)
  58.    {
  59.     switch(temp)
  60.     {
  61.      case 0x8f : P3=0xf0;
  62.         temp=P3;
  63.         if(temp!=0xf0)
  64.         {
  65.          
  66.          temp=P3;
  67.          if(temp!=0xf0)
  68.          {
  69.           switch (temp)
  70.           {
  71.            case 0xf1 : _key_1();
  72.             break;
  73.            case 0xf2 : _key_2();
  74.             break;
  75.            case 0xf4 : _key_3();
  76.             break;
  77.            case 0xf8 : _key_4();
  78.             break;
  79.           }
  80.          }
  81.         }
  82.         break;
  83.        default:
  84.         break;
  85.      /*case 0x4f : P3=0xf0;
  86.         temp=P3;
  87.         if(temp!=0xf0)
  88.         {
  89.          delay(100);
  90.          temp=P3;
  91.          if(temp!=0xf0)
  92.          {
  93.           switch (temp)
  94.           {
  95.            case 0xf1 : _key_5();
  96.             break;
  97.            case 0xf2 : _key_6();
  98.             break;
  99.            /case 0xf4 : _key_7();
  100.             break;
  101.            case 0xf8 : _key_8();
  102.             break;
  103.           }
  104.          }
  105.         }
  106.         break;
  107.        case 0x2f : P3=0xf0;
  108.         temp=P3;
  109.         if(temp!=0xf0)
  110.         {
  111.          delay(100);
  112.          temp=P3;
  113.          if(temp!=0xf0)
  114.          {
  115.           switch (temp)
  116.           {
  117.            case 0xf1 : _key_9();
  118.             break;
  119.            case 0xf1 : _key_10();
  120.             break;
  121.            case 0xf1 : _key_11();
  122.             break;
  123.            case 0xf1 : _key_12();
  124.             break;
  125.           }
  126.          }
  127.         }
  128.         break;
  129.        case 0x1f : P3=0xf0;
  130.         temp=P3;
  131.         if(temp!=0xf0)
  132.         {
  133.          delay(100);
  134.          temp=P3;
  135.          if(temp!=0xf0)
  136.          {
  137.           switch (temp)
  138.           {
  139.            case 0xf1 : _key_13();
  140.             break;
  141.            case 0xf1 : _key_14();
  142.             break;
  143.            case 0xf1 : _key_15();
  144.             break;
  145.            case 0xf1 : _key_16();
  146.             break;
  147.           }
  148.          }
  149.         }
  150.         break;*/ //此程序只用其中四个键盘即可
  151.     }
  152.    }
  153.   }
  154.   if(t1==20)
  155.   {
  156.     sec++;
  157.     t1=0;
  158.     speker(0,2);
  159.   }
  160.   if(sec==60)
  161.   {
  162.     min+=1;
  163.     sec=0;
  164.   }
  165.   if(min==60)
  166.   {
  167.     hour+=1;
  168.     min=0;
  169.   }
  170.   if(hour==24)
  171.   {
  172.    hour=0;
  173.   }

  174.      showtime();
  175.   }
  176. }

  177. void _init_()
  178. {

  179.   //启用且设置T0,定时50ms
  180.   TH0=(65536-50000)/256;
  181.   TL0=(65536-50000)%256;
  182.   EA=1;
  183.   ET0=1;
  184.   TMOD=0x01;
  185.   TR0=1;
  186. }
  187. void timer0() interrupt 1
  188. {
  189.   _init_();
  190.   t1++;
  191. }

  192. void settime(uint i,uint j,uint k)//设置初始时间函数:   k : j : i

  193. {
  194. sec=i;
  195. min=j;
  196. hour=k;

  197. }
  198. void speker(uint i,uint j)
  199. {
  200. if(hour==j&&min==i)
  201. {
  202.   
  203.    sp=1;
  204.    sp=0;

  205. }
  206. }
  207. void showtime()
  208. {
  209.   //秒钟显示
  210.   sc=1;
  211.   P0=table[sec/10];
  212.   P2=0x06;
  213.   sc=0;

  214.   sc=1;
  215.   P0=table[sec%10];
  216.   P2=0x07;
  217.   sc=0;


  218.   //分钟显示
  219.   sc=1;
  220.   P0=table[min/10];
  221.   P2=0x03;
  222.   sc=0;

  223.   sc=1;
  224.   P0=table[min%10];
  225.   P2=0x04;
  226.   sc=0;

  227.   //时钟显示
  228.   sc=1;
  229.   P0=table[hour/10];
  230.   P2=0x01;
  231.   sc=0;

  232.   sc=1;
  233.   P0=table[hour%10];
  234.   P2=0x0;
  235.   sc=0;
  236. }
  237. void delay(uint z)
  238. {
  239. uint x,y;
  240. for(x=100;x>=0;x--)
  241.   for(y=z;y>=0;y--);
  242. }
  243. /*void stop()
  244. {

  245. }
  246. void start()
  247. {

  248. }*/
  249. void minminu() { min--;}
  250. void minadd() { min++;}
  251. void hourminu() {hour--;}
  252. void houradd() { hour++;}
  253. void _key_1() {minminu();}
  254. void _key_2() {minadd();}
  255. void _key_3() {hourminu();}
  256. void _key_4() {houradd();}
复制代码


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

使用道具 举报

沙发
 楼主| daming 发表于 2014-12-30 23:45 | 只看该作者
字符显示:
  1. /* 程序名称:点阵显示器显示
  2. 程序作用:采用AT89C52和8x8点阵显示器显示字符
  3. 程序拓展:可以实现键盘输入显示字符
  4. 程序作者:hankjulianth
  5. 完成时间:10。3.30——下午

  6. */
  7. #include"reg52.h"
  8. #define uint unsigned int
  9. #define uchar unsigned char
  10. uchar code pa[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
  11. uchar code ln[9][8]={
  12. {0xff,0x83,0xef,0xef,0xef,0xef,0xef,0x83},//"I"
  13. {0xff,0x99,0x66,0x7e,0xbd,0xdb,0xe7,0xff},//心符号
  14. {0xff,0xbb,0xbb,0xbb,0xbb,0xbb,0xc7,0xff},//"U"
  15. {0xff,0xef,0xef,0xab,0x6d,0xe7,0xef,0xff},//"小"
  16. {0xff,0xff,0x83,0xef,0xef,0xef,0xef,0xef},//"T"
  17. {0xff,0xff,0xff,0x81,0xff,0xff,0xff,0xff},//"--"
  18. {0xfd,0x11,0xd0,0x90,0x57,0x90,0xd7,0xd0},//"邹"
  19. {0xfb,0xfb,0xe0,0xfb,0xf1,0xd9,0x49,0x86},//"志"
  20. {0x80,0xf7,0xd5,0xe3,0xc1,0xf7,0xf7,0xf7},//"平"
  21. };
  22. uint i=0,j=0,timecount=0;
  23. void main()
  24. {
  25. TMOD=0x01;
  26. TH0=(65536-3000)/256;//定时3ms
  27. TL0=(65536-3000)%256;
  28. TR0=1;
  29. EA=1;
  30. ET0=1;
  31. while(1)
  32. {
  33.   ;
  34. }
  35. }
  36. void timer0() interrupt 1
  37. {
  38. TMOD=0x01;
  39. TH0=(65536-3000)/256;
  40. TL0=(65536-3000)%256;
  41. TR0=1;
  42. EA=1;
  43. ET0=1;
  44. P0=pa[j];
  45. P2=ln[i][j];
  46. j++;
  47. if(j>7)
  48. {
  49.   j=0;
  50. }
  51. timecount++;
  52. if(timecount==333)//每个字时间间隔为333 X 3ms
  53. {
  54.   timecount=0;
  55.   i++;
  56.   if(i>8)
  57.   {
  58.    i=0;
  59.   }
  60. }
  61. }
复制代码
回复

使用道具 举报

板凳
 楼主| daming 发表于 2014-12-30 23:46 | 只看该作者
改进版的程序:
  1. /*程序名称:改进的at89s52实现时钟

  2.   程序功能:用at89s52和七段数码管实现计时时钟,用扫描方式显示年月日时分秒

  3.   作者      :hankjulianth

  4. */

  5. #include"reg52.h"
  6. #define uchar unsigned char
  7. #define uint  unsigned int
  8. uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
  9. uint year,month,day,sec,min,hour;//秒,分,时计数
  10. uint t1;//定义计数器
  11. sbit sc=P3^7;//锁存信号
  12. sbit sp=P1^1;//蜂鸣器
  13. void _init_();//初始化函数
  14. void timer0();//定时器T0中断函数
  15. void showtime();//时间显示函数
  16. void speker(uint,uint);//蜂鸣器函数,定时闹钟
  17. void settime(uint,uint,uint,uint,uint,uint);//设置年,月,日,时,分,秒
  18. void delay(uint);//延时函数
  19. void main()
  20. {
  21.   t1=0;
  22.   settime(10,4,16,0,0,0);
  23.   _init_();
  24.   while(1)
  25.   {
  26.     if(t1==20)
  27.     {
  28.       sec++;
  29.       t1=0;
  30.      }
  31.     if(sec==60)
  32.     {
  33.       min+=1;
  34.       sec=0;
  35.      }
  36.     if(min==60)
  37.     {
  38.       hour+=1;
  39.       min=0;
  40.      }
  41.     if(hour==24)
  42.     {
  43.       hour=0;
  44.       day++;
  45.     }
  46.     if(month==1|month==3|month==5|month==7|month==8|month==10|month==12)
  47.     {
  48.       if(day==31)
  49.     {
  50.      day=0;
  51.      month++;
  52.     }
  53.     }
  54.     else
  55.     {
  56.       if(month==2)
  57.     {
  58.      if(day==29)
  59.      {
  60.       day=0;
  61.       month++;
  62.      }
  63.     }
  64.     else
  65.     {
  66.      if(day==30)
  67.      {
  68.       day=0;
  69.       month++;
  70.      }
  71.     }
  72.     }
  73.     if(month==12)
  74.     {
  75.       month=0;
  76.     year++;
  77.     }
  78.     speker(0,8);
  79.        showtime();
  80.   }
  81. }

  82. void _init_()
  83. {

  84.   //启用且设置T0,定时50ms
  85.   TH0=(65536-50000)/256;
  86.   TL0=(65536-50000)%256;
  87.   EA=1;
  88.   ET0=1;
  89.   TMOD=0x01;
  90.   TR0=1;
  91. }
  92. void timer0() interrupt 1
  93. {
  94.   _init_();
  95.   t1++;

  96. }

  97. void settime(uint y,uint m,uint d,uint i,uint j,uint k)//设置初始时间函数:   k : j : i

  98. {
  99. year=y;
  100. month=m;
  101. day=d;
  102. sec=i;
  103. min=j;
  104. hour=k;

  105. }
  106. void speker(uint i,uint j)
  107. {
  108. if(hour==j&&min==i)
  109. {
  110.   while(min==min+1)//一分钟后,闹钟停止
  111.   {
  112.    sp=1;
  113.    delay(20);
  114.    sp=0;
  115.   }

  116. }
  117. }
  118. void showtime()
  119. {
  120.   if((sec%10)<7&&(sec%10)>=0)
  121.   {//秒钟显示
  122.    sc=1;
  123.    P0=table[sec/10];
  124.    P2=0x06;
  125.    sc=0;
  126.   
  127.    sc=1;
  128.    P0=table[sec%10];
  129.    P2=0x07;
  130.    sc=0;
  131.   

  132.    //分钟显示
  133.    sc=1;
  134.    P0=table[min/10];
  135.    P2=0x03;
  136.    sc=0;
  137.   
  138.    sc=1;
  139.    P0=table[min%10];
  140.    P2=0x04;
  141.    sc=0;
  142.   
  143.    //时钟显示
  144.    sc=1;
  145.    P0=table[hour/10];
  146.    P2=0x01;
  147.    sc=0;
  148.   
  149.    sc=1;
  150.    P0=table[hour%10];
  151.    P2=0x0;
  152.    sc=0;
  153.    }
  154.   if((sec%10)>=7&&(sec%10)<=9)
  155.   {
  156.     //日期显示
  157.     sc=1;
  158.    P0=table[day/10];
  159.    P2=0x06;
  160.    sc=0;
  161.   
  162.    sc=1;
  163.    P0=table[day%10];
  164.    P2=0x07;
  165.    sc=0;
  166.    //月份显示
  167.    sc=1;
  168.    P0=table[month/10];
  169.    P2=0x03;
  170.    sc=0;
  171.   
  172.    sc=1;
  173.    P0=table[month%10];
  174.    P2=0x04;
  175.    sc=0;
  176.   //年份显示
  177.    sc=1;
  178.    P0=table[year/10];
  179.    P2=0x01;
  180.    sc=0;

  181.    sc=1;
  182.    P0=table[year%10];
  183.    P2=0x00;
  184.    sc=0;
  185.   }
  186. }

  187. void delay(uint z)
  188. {
  189. uint x,y;
  190. for(x=10;x>=0;x--)
  191.   for(y=z;y>=0;y--);
  192. }
复制代码
回复

使用道具 举报

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

本版积分规则

QQ|手机版|小黑屋|单片机论坛 |51Hei单片机16群 联系QQ:125739409;技术交流QQ群7344883

Powered by 单片机教程网

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