找回密码
 立即注册

QQ登录

只需一步,快速开始

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

自制PCB曝光定时器 附51单片机源程序+电路

  [复制链接]
跳转到指定楼层
楼主
因为DIY感光PCB老是失败,所以模仿大佬制作一个定时器。功能键用于开始/停止计时,加/减按键只能在非计时模式下才能调时间。调节范围是0~999秒。采用中断计时应该没问题,关于延时函数老是BUG,所以使用的下载器生成的延时代码。版主是新手,程序问题多多包涵哈。当然也可以我询问我,尽量回复,

电路原理图如下:


单片机源程序如下:
显影曝光定时器工程.rar (46.69 KB, 下载次数: 32)

评分

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

查看全部评分

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

使用道具 举报

沙发
ID:325624 发表于 2020-3-9 11:51 | 只看该作者
#include <REG52.H>
#include<intrins.h>


#define uint unsigned char
   
uint time = 100; //定时时间
uint time1;
uint num = 0;    //计时达1s标志位
bit state = 0;  //工作状态标志位


unsigned char LED7Code[]={
        0x3F,                // 0
        0x06,                // 1
        0x5B,                // 2
        0x4F,                // 3
        0x66,                // 4
        0x6D,                // 5
        0x7D,                // 6
        0x07,                // 7
        0x7F,                // 8
        0x6F,                // 9
        0x77,                // A
        0x7C,                // B
        0x39,                // C
        0x5E,                // D
        0x79,                // E
        0x71                // F
};



sbit RELAY = P3^6;   //继电器,高电平有效
sbit BUZY   = P3^6; //蜂鸣器,高电平有效

//按键声明
sbit KeyFunction = P3^2;       //功能按键,开始/暂停
sbit KeyAdd      = P3^3;      //按键加
sbit KeyMinus    = P3^4;     //按键减

//数码管位声明 ----段选为P2口
sbit duan1 = P1^0;     //从左往右,第一位
sbit duan2 = P1^1;    //从左往右,第二位
sbit duan3 = P1^2;   //从左往右,第三位
sbit duan4 = P1^3;  //从左往右,第四位

//子函数声明
void display(void);         //数码管扫描函数
void Delay2ms(void);       //@12.000MHz,延时5ms
void Delay10ms(void);     //@12.000MHz,延时10ms
void Delay150ms(void);   //@12.000MHz,延时150ms
void Delay200ms(void);  //@12.000MHz,延时200ms
void testKey();        //按键检测



void main()
{

   
    //中断寄存器操作
    TMOD = 0x01;   //设置定时器0工作方式(M1,M0为0,1)
    TH0 = (65536-45872)/256;     //装初值
    TL0 = (65536-45872)%256;   //装初值
    EA = 1;     //开总中断
    ET0 = 1;   //开定时器0中断
        
    //开机音效
    BUZY = 1;
    Delay200ms();        ;
    BUZY = 0;
    Delay200ms();       
    BUZY = 1;
    Delay200ms();       
    BUZY = 0;
   
        while(1)
        {
        
        time1 = time;
        display();//数码管显示
        testKey(); //按键检测
      
           //进入计时模式
          if(state)
          {   
              time1 = time;           
              TR0 = 1;     //开启定时器0
              RELAY = 1;  //打开继电器   
            
              while(state)
              {                  
                testKey();
                display();
                  //判断计时是否完成
              if(time1 == 0)
              {
                  TR0 = 0;  //关闭定时器                  
                  state = 0;
                  //蜂鸣器响三声,表示计时结束
                  BUZY = 1;
                  Delay200ms();Delay200ms();
                  BUZY = 0;
                  Delay200ms();Delay200ms();
                  BUZY = 1;
                  Delay200ms();Delay200ms();
                  BUZY = 0;
                  Delay200ms();Delay200ms();
                  BUZY = 1;
                  Delay200ms();Delay200ms();
                  BUZY = 0;
                  
              }
            
              }  
                    RELAY = 0;   
        }
    }
}


void display(void)
{
   uint j, ge, shi, bai;
//       个位  十位  百位
        ge = time1%10;
        shi = time1%100/10;
        bai = time1/100;
   
        
    //数码管动态扫描
    for(j=0;j<4;j++)
    {

        switch(j)
        {
            //个位显示
            case 0:
                    duan1 = 0;
                    duan2 = 0;
                    duan3 = 0;
                    duan4 = 1;
                    P2 = LED7Code[ge];
                    break;
            //十位显示
            case 1:
                    duan1 = 0;
                    duan2 = 0;
                    duan3 = 1;
                    duan4 = 0;
                    P2 = LED7Code[shi];
                    break;
            //百位显示
            case 2:
                    duan1 = 0;
                    duan2 = 1;
                    duan3 = 0;
                    duan4 = 0;
                    P2 = LED7Code[bai];
                    break;
            //第四位显示
            case 3:
            //设置模式显示C
                if(state)
                    {
                        duan1 = 1;
                        duan2 = 0;
                        duan3 = 0;
                        duan4 = 0;
                        P2 = LED7Code[14];
                    }
            //计时模式显示E        
                    else
                    {
                        duan1 = 1;
                        duan2 = 0;
                        duan3 = 0;
                        duan4 = 0;
                        P2 = LED7Code[12];
                    }
                    
                    break;
                    
        }   
                        Delay2ms();                //@12.000MHz  ,延时5ms
                        P2 = 0x00;
                        duan1 = 0;
                        duan2 = 0;
                        duan3 = 0;
                        duan4 = 0;
    }            
}   


//按键检测函数
void testKey()
{
    //功能键检测
    if(~KeyFunction)
    {
        Delay10ms();       
        
         if(~KeyFunction)
         {
            state = ~state;
             BUZY = 0;
         }
        while(~KeyFunction);
    }
//按键加检测
    if(~KeyAdd)
    {
        Delay10ms();               
        
         if(~KeyAdd)
         {
            if(~state && time<999)
            {                              
                    time++;
               
            }
            Delay10ms();
                if(~KeyAdd)
                   Delay150ms();
         }
        
    }
//按键减检测
      if(~KeyMinus)
    {
        Delay2ms();       
        
         if(~KeyMinus)
         {
             if(~state && time>0)
             {
                 
                   time--;
                 
             }
             Delay10ms();
              if(~KeyMinus)            
                 Delay150ms();                           
         }
        
    }         
}




void Delay2ms()                //@12.000MHz
{
        unsigned char i, j;

        _nop_();
        i = 32;
        j = 40;
        do
        {
                while (--j);
        } while (--i);
}

void Delay10ms()                //@12.000MHz
{
        unsigned char i, j;

        _nop_();
        _nop_();
        i = 156;
        j = 213;
        do
        {
                while (--j);
        } while (--i);
}

void Delay150ms()                //@12.000MHz
{
        unsigned char i, j, k;

        i = 10;
        j = 34;
        k = 160;
        do
        {
                do
                {
                        while (--k);
                } while (--j);
        } while (--i);
}


void Delay200ms()                //@12.000MHz
{
        unsigned char i, j, k;

        _nop_();
        _nop_();
        i = 13;
        j = 45;
        k = 214;
        do
        {
                do
                {
                        while (--k);
                } while (--j);
        } while (--i);
}








//中断函数
void T0time() interrupt 1
{
    TH0 = (65536-45872)/256;     //装初值
    TL0 = (65536-45872)%256;   //装初值
   
    //5毫秒一次中断,满20次表示1秒已到
    num++;
    if(num == 20)
    {
        num = 0;
        time1--;
    }
   
   
   
}
回复

使用道具 举报

板凳
ID:295154 发表于 2020-6-12 14:30 | 只看该作者
好,学习了
回复

使用道具 举报

地板
ID:774631 发表于 2020-6-13 07:41 来自手机 | 只看该作者
谢谢分享,下载来学习下
回复

使用道具 举报

5#
ID:385830 发表于 2021-12-5 12:31 | 只看该作者
楼主你是用立创EDA画的原理图吧。看着像。。。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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