找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机倒计时秒表系统实验程序Proteus仿真

[复制链接]
跳转到指定楼层
楼主
电路图如图1所示,通过51单片机的P1作为段口,P0作为位口构成2位LED动态显示的硬件电路。P2.0、P2.1连接两个按键K0、K1分别用于调整初始时间的+1和-1,P3.0连接LED灯,P3.2连接复位按键,P3.3连接启动按键。
要求实现一倒计时秒表,启动后显示初始时间20,可以调整初始时间。调整结束后按下启动键,开始倒计时。在倒计时过程中调整初始时间按键无效。倒计时时间到,显示00,并且LED灯亮。整个过程中都可以复位,复位后显示初始时间,LED灯灭。图1  倒计时秒表的电路原理图

仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)


单片机源程序如下:
  1. #include <reg51.h>
  2. unsigned  char code tab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; //共阴数码管 0-9
  3. sbit led=P3^0;
  4. sbit s1=P0^0;
  5. sbit s2=P0^1;
  6. sbit k0=P2^0;
  7. sbit k1=P2^1;
  8. int sec=0,i,a,b=20,key1;
  9. /*-----延迟函数-------*/
  10. void delay(int z)
  11. {
  12.         while(z-->0);
  13. }
  14. /*-----显示函数-------*/
  15. void display(int n)
  16. {
  17.         if(n>0)
  18.         {
  19.         s2=1;s1=0;          //显示十位
  20.         P1=tab[n/10];  //除10,取十位数值
  21.         delay(100);           //延迟显示
  22.         s1=1;s2=0;           //显示个位
  23.         P1=tab[n%10];  //求余,取个位数值
  24.         delay(100);           //延迟
  25.         }
  26.         else
  27.         {                                //当输入值小于0,显示0
  28.         s2=1;s1=0;            //显示十位
  29.         P1=tab[0];            //除10,取十位数值
  30.         delay(100);            //延迟
  31.         s1=1;s2=0;            //显示个位
  32.         P1=tab[0];                //求余,取个位数值
  33.         delay(100);            //延迟显示
  34.         }                          
  35. }
  36. /*-----外部中断0中断服务函数----------*/
  37. void RESET() interrupt        0
  38. {
  39.         sec=0;         //恢复初始值
  40.         b=20;         //恢复初始值
  41.         TR0=0;         //关闭定时器
  42.        
  43. }
  44. /*-----外部中断1中断服务函数----------*/
  45. void START() interrupt        2
  46. {
  47.         TR0=1;        //打开定时器
  48. }
  49. /*-----定时器T0服务函数,计时功能----------*/
  50. void timer0() interrupt 1
  51. {
  52.         i--;   //50ms时间到
  53.         TH0=(65536-50000)/256;        //存放高8位,50ms
  54.         TL0=(65536-50000)%256;          //存放低8位
  55.         if(i==0)
  56.         {
  57.         i=20;            //1s计数
  58.         sec++;                        //软件计数1s
  59.         }
  60. }
  61. /*------键值扫描函数----------*/
  62. void key()
  63. {       
  64.         k0=1;k1=1;                    //读按键
  65.         key1=P2;                //将P2的值赋值给key1
  66.         key1=key1&0x03;                //屏蔽高6位,保留k0,k1的值
  67.         while(key1!=0x03)   //判断是否有按键按下
  68.         {
  69.         delay(600);                        //消抖动
  70.         key1=P2;
  71.         key1=key1&0X03;
  72.         while(key1!=0x03)         //当有按键按下时
  73.         {
  74.         if(k0==0) b=b+1;            //按下k0按键时,初始值加1
  75.         else b=b-1;                         //按下k1按键时,初始值减1
  76.         k0=1;k1=1;                   //判断按键是否抬起
  77.         key1=P2;                  //重新将P2的值赋值给key1
  78.         key1=key1&0x03;
  79.         while(key1!=0x03)  //判断是否有按键按下
  80.         {
  81.         key1=P2;
  82.         key1=key1&0x03;
  83.         }
  84.         }
  85.         }
  86. }
  87. /*------主函数----------*/
  88. void main()
  89. {
  90.         TMOD=0X01;                           //设定定时器0工作,工作方式1
  91.         TH0=(65536-50000)/256;         //存放高8位,50ms
  92.         TL0=(65536-50000)%256;         //存放低8位
  93.         IT0=1;IT1=1;                 //外部中断选择下降沿触发
  94.         IE=0X87;                         //开启INT0,INT1,T0
  95.         PX0=1;                            //设定INT0为高优先级
  96.         led=1;                                //初始灯熄灭
  97.         TR0=0;                                //初始计数停止
  98.         i=2;
  99.         while(1)
  100.         {
  101.         a=b-sec;                         //将增计时变为减计时
  102.         if(TR0==0)                         //当定时器关闭时开启键值扫描
  103.         {key();}
  104.         display(a);                         //显示函数
  105.         if(a<=0)                                       
  106.         {                                         
  107.         led=0;                                 //当减计时为0时,报警灯点亮
  108.         }
  109.         else
  110.         {
  111.         led=1;                                //当减计时不为0时,报警灯熄灭
  112.         }
  113.         }

  114. }
复制代码

所有资料51hei提供下载:
单片机系统实验.rar (41.61 KB, 下载次数: 62)

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

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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