找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4130|回复: 2
收起左侧

基于51单片机的电子表仿真设计+代码

[复制链接]
ID:434463 发表于 2018-11-27 19:47 | 显示全部楼层 |阅读模式
51单片机课程设计仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)

0.png

单片机源程序如下:
  1. //电子表,针对教材设计
  2. //用共阳数码管在P0口、P2口以及74hc04芯片驱动下,显示24小时制电子表
  3. //电子表程序是利用STC8591内部的定时∕计数器实现精确计数。
  4. //电子表共有四个按键key1、key2、key3、key4分别实现调模式、
  5. //增加、减少、复位功能,其中调模式按键key1可以分别调节小时、分钟、秒钟、闹铃          
  6. //设计:单片机创新工作室--王曙光设计,2015年12月15日
  7. #include<reg51.h>
  8. #include<key.c>
  9. unsigned char i,j,k;
  10. unsigned char seven_seg[] = {0xc0,0xf9,0xa4,0xb0,0x99,
  11.                                                                 0x92,0x82,0xf8,0x80,0x90};
  12. unsigned char flash;
  13. sbit SW = P3^3;                                                                                                                                                //接继电器驱动电路,低电平继电器吸合,控制电铃
  14. void timer0_isr(void) interrupt 1
  15. {
  16.         TH0 = 0xf8;
  17.         TL0 = 0x2f;
  18.         i++;
  19.         if(i >= 250)                                                                                                                                        //半秒时间到
  20.         {
  21.                 flash = ~flash;                                                                                                                                //得到8位闪烁变量
  22.                 i = 0;
  23.                 j++;
  24.         }
  25.         if(j >= 2)                                                                                                                                                //1分钟到
  26.         {
  27.                 sec++;
  28.                 j = 0;
  29.         }                                                                                                       
  30.         if(sec >= 60)                                                                                                                                        //1分钟到
  31.         {                                                                                                                                               
  32.                 min++;
  33.                 sec = 0;
  34.         }
  35.         if(min >= 60)                                                                                                                                        //1小时到
  36.         {                                                                                                 
  37.                 hour++;
  38.                 min = 0;
  39.         }
  40.         if(hour >= 24)   
  41.         hour = 0;
  42.         P0 = 0xff;                                                                                                                                                //Protuse软件仿真消隐
  43.         if(key1_flag == 0)                                                                                                                                //正常走时
  44.         {
  45.                 switch(k)
  46.                 {
  47.                         case 0:P0 = seven_seg[sec % 10]; P2 = ~0x01;break;
  48.                         case 1:P0 = seven_seg[sec / 10]; P2 = ~0x02;break;
  49.                            case 2:P0 = seven_seg[min % 10] & (0x7f | flash); P2 = ~0x04;break;                //小数点闪烁
  50.                            case 3:P0 = seven_seg[min / 10]; P2 = ~0x08;break;
  51.                            case 4:P0 = seven_seg[hour % 10] & (0x7f | flash); P2 = ~0x10;break;        //小数点闪烁
  52.                            case 5:P0 = seven_seg[hour / 10]; P2 = ~0x20;break;
  53.                 }
  54.         }
  55.         if(key1_flag == 1)                                                                                                                                //调小时,小时闪烁
  56.         {
  57.                 j = 0;
  58.                 switch(k)
  59.                 {
  60.                         case 0: P0 = seven_seg[sec_t % 10]; P2 = ~0x01;break;
  61.                         case 1: P0 = seven_seg[sec_t / 10]; P2 = ~0x02;break;
  62.                            case 2: P0 = seven_seg[min_t % 10]; P2 = ~0x04;break;
  63.                            case 3: P0 = seven_seg[min_t / 10]; P2 = ~0x08;break;
  64.                            case 4: P0 = seven_seg[hour_t % 10] | flash; P2 = ~0x10;break;                        //小时闪烁
  65.                            case 5: P0 = seven_seg[hour_t / 10] | flash; P2 = ~0x20;break;                        //小时闪烁
  66.                 }
  67.         }
  68.         if(key1_flag == 2)                                                                                                                                //调分钟
  69.         {
  70.                 j = 0;
  71.                 switch(k)
  72.                 {
  73.                         case 0: P0 = seven_seg[sec_t % 10]; P2 = ~0x01;break;
  74.                         case 1: P0 = seven_seg[sec_t / 10]; P2 = ~0x02;break;
  75.                            case 2: P0 = seven_seg[min_t % 10]| flash; P2 = ~0x04;break;                         //分闪烁
  76.                            case 3: P0 = seven_seg[min_t / 10]| flash; P2 = ~0x08;break;                        //分闪烁
  77.                            case 4: P0 = seven_seg[hour_t % 10] ; P2 = ~0x10;break;
  78.                            case 5: P0 = seven_seg[hour_t / 10]; P2 = ~0x20;break;
  79.                 }
  80.         }       
  81.         if(key1_flag == 3)                                                                                                                                //调秒
  82.         {
  83.                 j = 0;
  84.                 switch(k)
  85.                 {
  86.                         case 0: P0 = seven_seg[sec_t % 10]| flash; P2 = ~0x01;break;                        //秒闪烁
  87.                         case 1: P0 = seven_seg[sec_t / 10]| flash; P2 = ~0x02;break;                        //秒闪烁
  88.                            case 2: P0 = seven_seg[min_t % 10]; P2 = ~0x04;break;
  89.                            case 3: P0 = seven_seg[min_t / 10]; P2 = ~0x08;break;
  90.                            case 4: P0 = seven_seg[hour_t % 10] ; P2 = ~0x10;break;
  91.                            case 5: P0 = seven_seg[hour_t / 10]; P2 = ~0x20;break;
  92.                 }
  93.         }
  94.         if(key1_flag == 4)                                                                                                                                //调定闹小时
  95.         {
  96.                 j = 0;
  97.                 switch(k)
  98.                 {
  99.                         case 0: P0 = seven_seg[min_r % 10]; P2 = ~0x01;break;
  100.                         case 1: P0 = seven_seg[min_r / 10]; P2 = ~0x02;break;
  101.                            case 2: P0 = seven_seg[hour_r % 10]| flash; P2 = ~0x04;break;                        //定闹小时闪烁
  102.                            case 3: P0 = seven_seg[hour_r  / 10]| flash; P2 = ~0x08;break;                        //定闹小时闪烁
  103.                         case 4: P0 = 0xff;P2 = ~0x10;break;                                                                                //不显示
  104.                         case 5: P0 = 0x0c;P2 = ~0x20;break;                                                                                //显示字符"P"
  105.                 }
  106.         }
  107.         if(key1_flag == 5)                                                                                                                                //调定闹分钟
  108.         {
  109.                 j = 0;
  110.                 switch(k)
  111.                 {
  112.                         case 0: P0 = seven_seg[min_r % 10]| flash; P2 = ~0x01;break;                        //定闹分闪烁
  113.                         case 1: P0 = seven_seg[min_r / 10]| flash; P2 = ~0x02;break;                        //定闹分闪烁
  114.                            case 2: P0 = seven_seg[hour_r % 10]; P2 = ~0x04;break;
  115.                            case 3: P0 = seven_seg[hour_r  / 10]; P2 = ~0x08;break;
  116.                         case 4: P0 = 0xff;P2 = ~0x10;break;                                                                                //不显示
  117.                         case 5: P0 = 0x0c;P2 = ~0x20;break;                                                                                //显示字符"P"
  118.                 }
  119.         }
  120.         k++;
  121.         if(k >= 6)k = 0;
  122. }
  123. void timer0_initi(void)                                                                                                                                //中断初始化函数
  124. {
  125.         TMOD = 0x01;                                                                                                                                       
  126.         TH0 = 0xf8;
  127.         TL0 = 0x2f;                                                                                                                                                //每次触发中断后从装初值,使下次对机器脉冲计数2000个计满溢出引发中断  约0.2ms
  128.         EA = 1;                                                                                                                                                        //开总中断
  129.         TR0 = 1;                                                                                                                                                //启动定时器T0
  130.         ET0 = 1;                                                                                                                                                //开T0中断
  131. }
  132. void main(void)
  133. {
  134.         timer0_initi();
  135.         while(1)
  136.         {
  137.                 key();                                                                                                                                                //调用按键函数
  138.                 if(min == min_r && hour == hour_r)                                                                                        //当时间等于闹钟                       
  139.                 SW = 1;                                                                                                                                                //闹铃响起
  140.                 else
  141.                 SW = 0;
  142.         }
  143. }
复制代码

所有资料51hei提供下载:
电子表设计.rar (55.19 KB, 下载次数: 71)


回复

使用道具 举报

ID:435222 发表于 2018-11-28 20:09 | 显示全部楼层
谢谢楼主
回复

使用道具 举报

ID:618143 发表于 2019-10-29 23:07 | 显示全部楼层
多谢
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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