找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机中断与数码管动态扫描(含按键控制方法)仿真和源码

[复制链接]
ID:320909 发表于 2018-5-17 23:07 | 显示全部楼层 |阅读模式
   利用中断与定时器来实现99秒的秒表   
   按键可以暂停
当然也可以清零 可以参照我上一个帖子自己再给按键加一些功能

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

单片机源程序如下:
  1. #include <reg52.h>
  2. sbit p1=P1^0;
  3. sbit p2=P1^1;
  4. sbit k1=P1^7;
  5. unsigned char code LedChar[] = { //数码管显示字符转换表
  6.     0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8,
  7.     0x80, 0x90, 0x88, 0x83, 0xC6, 0xA1, 0x86, 0x8E
  8. };
  9. unsigned char LedBuff[6]= { //数码管显示缓冲区,初值 0xFF 确保启动时都不亮
  10.     0xc0,0xc0
  11. };
  12. char scan[8]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};

  13. unsigned char i = 0;  //动态扫描的索引
  14. unsigned int cnt = 0;
  15. bit flag=0;//记录 T0 中断次数
  16. unsigned long sec = 0;  //记录经过的秒数
  17. void debouncer();
  18. void main(){
  19.    
  20.     EA = 1;  //使能总中断
  21.     TMOD = 0x01;  //设置 T0 为模式 1
  22.     TH0 = 0xFC;  //为 T0 赋初值 0xFC67,定时 1ms
  23.     TL0 = 0x18;
  24.     ET0 = 1;  //使能 T0 中断
  25.     TR0 = 0;
  26.     ET1=1;
  27.     TR1=0;
  28.     TH1=0xfc;
  29.     TL1=0x18;       
  30. k1=1;        //启动 T0
  31. while (1){
  32.           

  33.         if(k1==0&&flag==0){   //按键按下不放 开始计时    松开立即停止计时,示数定在当前计数数值
  34.           debouncer();
  35.           TR0=1;  //打开定时器中断0
  36.                 TR1=1;  //打开定时器中断1
  37.                 flag=1;
  38.                 while(k1==0);  /*这两句防止在 按键按下的短时间内程序跑飞到下一个if语句*/
  39.                 debouncer();
  40.                
  41.         }
  42.        
  43.         if(k1==0&&flag==1){   //此时 k1==0,可以实现第二次功能   若k1==1即为按键松开产生动作
  44.           debouncer();
  45.                 TR1=0;    //关闭定时器中断1 使得程序停止在当前时刻
  46.           flag=0;
  47.           while(k1==0);
  48.                  debouncer();
  49.         }

  50.                
  51.        
  52.   
  53.     }
  54. }
  55. /* 定时器 0 中断服务函数  控制位 并显示对应数值 */
  56. void InterruptTimer0() interrupt 1{
  57.     TH0 = 0xFC;  //重新加载初值
  58.     TL0 = 0x18;
  59.     cnt++;  //中断次数计数值加 1
  60.    
  61.     //以下代码完成数码管动态扫描刷新
  62.     P2 = 0xFF;
  63.     //显示消隐
  64.     switch (i){
  65.         case 0: p2=1;p1=0; i++; P2=LedBuff[0]; break;  //打开个位,关闭其他位,并给P2端口赋个位相应数值断码
  66.         case 1: p1=1;p2=0; i=0; P2=LedBuff[1]; break;  //打开十位,关闭其他位,并给P2端口赋十位相应数值断码
  67.         default: break;
  68.     }
  69. }

  70. void InterruptTimer1() interrupt 3{            /* 定时器 1 中断服务函数  控制段并 将要显示的数值断码 赋值到数组中等待调用 */
  71. TH1=0xc0;
  72.         TL1=0x18;
  73.       if (cnt >=800){  //判断 T0 溢出是否达到 1000 次   此处理论上写1000,但是实际写800是因为为了消除计时误差 800这个数
  74.             cnt = 0;  //达到 1000 次后计数值清零
  75.             sec++;  //秒计数自加 1
  76.            if(sec>99)sec=0;
  77.             //以下代码将 sec 按十进制位从低到高依次提取并转为数码管显示字符
  78.             LedBuff[0] = LedChar[sec%10];
  79.             LedBuff[1] = LedChar[sec/10];
  80.            
  81.         }
  82. }


  83.    void debouncer(){  //延时20ms按键消抖
  84.     int i;
  85.           for(i=0;i<2400;i++);

  86. }
复制代码

所有资料51hei提供下载:
中断与数码管动态扫描.rar (15.26 KB, 下载次数: 24)

评分

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

查看全部评分

回复

使用道具 举报

ID:332416 发表于 2018-5-18 15:12 | 显示全部楼层
这个是独立按键控制的
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
sbit dula=P2^6;
sbit wela=P2^7;
sbit K1=P3^4;
sbit K2=P3^5;
sbit K3=P3^6;
sbit K4=P3^7;
uchar code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
uint aa;
uchar num1,num2,shi1,ge1,shi2,ge2;

void delay(uint z)
{
        uint x,y;
        for(x=z;x>0;x--)
                for(y=110;y>0;y--);
}

void display(uchar num1,uchar num2)
{
        shi1=num1/10;
        ge1=num1%10;
        shi2=num2/10;
        ge2=num2%10;
       
        dula=1;
        P0=table[shi1];
        dula=0;
        P0=0xff;
        wela=1;
        P0=0xfe;
        wela=0;
        delay(1);

        dula=1;
        P0=table[ge1];
        dula=0;
        P0=0xff;
        wela=1;
        P0=0xfd;
        wela=0;
        delay(1);

        dula=1;
        P0=table[shi2];
        dula=0;
        P0=0xff;
        wela=1;
        P0=0xfb;
        wela=0;
        delay(1);

        dula=1;
        P0=table[ge2];
        dula=0;
        P0=0xff;
        wela=1;
        P0=0xf7;
        wela=0;
        delay(1);
}

void key()
{
        if(K1==0)
        {
                delay(5);
                if(K1==0)
                {
                        TR0=0;
                        while(!K1);
                }
        }

        if(K2==0)
        {
                delay(5);
                if(K2==0)
                {
                        if(num1==0)
                        {
                                num1=60;
                        }
                        num1--;
                        while(!K2);
                }
        }

        if(K3==0)
        {
                delay(5);
                if(K3==0)
                {
                        num1++;
                        if(num1>=60)
                        {
                                num1=num1-60;
                        }
                        while(!K3);
                }
        }

        if(K4==0)
        {
                delay(5);
                if(K4==0)
                {
                        TR0=1;
                        while(!K4);
                }
        }
}

void inint()
{
        TMOD=0x01;
        TH0=(65536-50000)/256;
        TL0=(65536-50000)%256;
        EA=1;
        ET0=1;
        TR0=1;
}

void main()
{
        inint();
        while(1)
        {
                key();
                display(num1,num2);
        }
}

void zhongduan()interrupt 1
{
        TH0=(65536-50000)/256;
        TL0=(65536-50000)%256;
        aa++;
        if(aa==20)
        {
                aa=0;
                num2++;
                if(num2==60)
                {
                        num2=0;
                        num1++;
                        if(num1==60)
                                num1=0;
                }
        }
}
回复

使用道具 举报

ID:492742 发表于 2019-3-17 19:58 | 显示全部楼层
谢谢,收益
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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