找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机三位数秒表仿真,精确度0.1s

[复制链接]
跳转到指定楼层
楼主
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)


#include "reg52.h"
#define led P0
typedef unsigned char u8;
typedef unsigned int u16;

sbit P20=P2^0;
sbit P21=P2^1;
sbit P22=P2^2;
sbit P23=P2^3;
sbit P27=P0^7;

sbit k1 = P3^2;
sbit k2 = P3^3;
sbit beep=P1^5;
static u8 min = 0;
static u8 sec = 0;
static u8 spot = 0;

u8 code smgz[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
                    0x7f,0x6f,0x40};

void delay(u16 i)
{
    while(i--);
}
void display( )
{
        P23=0;
        P0=smgz[spot%10];
        delay(1000);
        P23=1;
        P22=0;
        P0=smgz[sec%10]|0x80;
        delay(1000);
        P22=1;
        P21=0;
        P0=smgz[min%10];
        delay(1000);
        P21=1;
        P20=0;
        P0=smgz[min/10];
        delay(1000);
        P20=1;
}

void Timer0Init()
{
    TMOD |= 0X01;
    TH0 = 0XFC;
    TL0 = 0X18;
    ET0 = 1;
    IT0=1;//跳变沿出发方式(下降沿)
    EX0=1;//打开INT0的中断允许。
    IT1=1;
    EX1=1;
    EA = 1;
    TR0 = 1;     
}
void BEEP()
{
        while(1)
        {        
                beep=~beep;
                delay(10); //延时大约100us           
        }
}
void main()
{

    Timer0Init();
    while(1)
    {   
            display( );
    }            
}
void Timer0() interrupt 1
{
        static int Timer0_times = 0;
        TH0 = 0XFC;
        TL0 = 0X18;
        Timer0_times++;
        if(Timer0_times == 70)
        {
            if(spot < 9)
                spot++;
            else if(sec < 9)
            {
                sec++;
                spot = 0;
            }
            else
            {
                min++;
                spot = sec = 0;
                                if(min>=12)
                                {
                                        BEEP();
                                }
                                
            }
            Timer0_times = 0;
        }
}

void Int0()    interrupt 0        //外部中断0的中断函数
{
    delay(1000);     //延时消抖
    if(k1==0)
    {
        TR0 = ~TR0;
    }
}

void Int1()    interrupt 2        //外部中断1的中断函数
{
    delay(1000);     //延时消抖
    if(k2==0)
    {
        TR0 = 0;
          min = sec = spot = 0;

    }
}

全部资料51hei下载地址:
单片机.zip (26.34 KB, 下载次数: 47)

评分

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

查看全部评分

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

使用道具 举报

沙发
ID:577503 发表于 2019-7-3 23:24 来自手机 | 只看该作者
感谢楼主分享
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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