找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3690|回复: 19
收起左侧

51单片机怎么跑秒

  [复制链接]
ID:150257 发表于 2016-11-26 00:20 | 显示全部楼层 |阅读模式
最好在程序注释 我有开发板
回复

使用道具 举报

ID:140371 发表于 2016-11-26 08:32 | 显示全部楼层
//自己加上顯示秒數 程式

#include <reg52.h>

#define led_bus P0
#define led_com P1
sbit sw1 = P2^0; //-重置秒數
sbit sw2 = P2^1; //停止計時
char count;
unsigned int sec;
unsigned char T0IntCount;
bit stop;
void Timer0Init(void)                //50ms@11.0592MHz
{
       
        TMOD &= 0xF0;                //Set timer work mode
        TMOD |= 0x01;                //Set timer work mode
        TL0 = 0x00;                //Initial timer value
        TH0 = 0x4C;                //Initial timer value
        TF0 = 0;                //Clear TF0 flag
        TR0 = 1;                //Timer0 start run
        ET0=1; //
}
void Timer0Isr(void)                interrupt 1
{
        TL0 = 0x00;                //-重裝初值
        TH0 = 0x4C;                //-重裝初值
         T0IntCount++;
        if( T0IntCount > 19) //50 ms * 20 = 1秒
        {
                T0IntCount=0;
                sec++; //秒數遞增
               
        }
       
}
main()
{
        Timer0Init();
        EA=1; //中斷總開關開啟
        P2=0xff;//設按鍵可讀取
        stop=1; //設定可計時
        while(1)
        {
                if(sw1==0) //按鍵判斷
                {
                        count=!count; //清除或計時
                }
               
               
                if(count ==0) //f秒數清除
                {
                        TR0=0;
                        sec=0;
                        TL0 = 0x00;                //--重裝初值
                        TH0 = 0x4C;                //--重裝初值
                }
                else //開始計時
                {
                        TR0=1;       
                }
               
                if(sw2 ==0) //暫停計時
                {
                stop=!stop;
                }
                ET0=stop ;
               
                //驅動顯示秒數 .......(視研發板電路撰寫)
               
               
        }

       
}
回复

使用道具 举报

ID:138155 发表于 2016-11-26 08:40 | 显示全部楼层
定时器中断 要求不高或者用指令延时
回复

使用道具 举报

ID:111634 发表于 2016-11-26 08:54 | 显示全部楼层
本帖最后由 zl2168 于 2016-11-26 08:56 编辑

什么叫“跑秒”?经常看到一些自定义且莫名其妙的新名词,是老师教的还是你自己想出来的?
建议用规范术语提问!
回复

使用道具 举报

ID:150294 发表于 2016-11-26 11:17 | 显示全部楼层
这个参考一下

0-9999每秒加1计数器.zip

16.8 KB, 下载次数: 10

回复

使用道具 举报

ID:149988 发表于 2016-11-26 12:51 | 显示全部楼层

RE: 51单片机怎么跑秒

三位数码管显示秒,无时、分显示,显示较准确。在普中HC6800V3.0板上做过实验,好用。
#include<reg51.h>
#define GPIO_DIG   P3
#define GPIO_PLACE P1
unsigned char code DIG_PLACE[3] = {0xfe,0xfd,0xfb};//,0xf7,0xef,0xdf,0xbf,0x7f};//位选控制   查表的方法控制
unsigned char code DIG_CODE[10] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
unsigned char DisplayData[8]; //用来存放要显示的8位数的值
unsigned char Time;                        //用来存放定时时间
unsigned int Second;
/*********************使用数码管显示*******************/
void DigDisplay()
{
        unsigned char i;
        unsigned int j;
        for(i=0; i<8; i++)
        {
                GPIO_PLACE=DIG_PLACE[i];         //发送位选
                GPIO_DIG=DisplayData[i];   //发送段码
                j=10;                                                           //扫描间隔时间设定
                while(j--);       
                GPIO_DIG=0x00;             //消隐
        }
}
/*********************配置定时器************************/
void Timer0init(void)
{
        TMOD=0x01;     //定时器0选择工作方式1
  TH0 =(65536-49550)/256;         //设置初始值,定时50MS
  TL0 =(65536-49550)%256;
  EA  =1;           //打开总中断
  ET0 =1;                 //打开定时器0中断
  TR0 =1;                 //启动定时器0       
}
/**********************主函数***************************/
void main(void)
{        
  Timer0init();  
  while(1)   
  {
    DisplayData[0]=DIG_CODE[(Second)/100];
    DisplayData[1]=DIG_CODE[(Second)%100/10];
    DisplayData[2]=DIG_CODE[(Second)%10];
    DigDisplay();
  }                               
}
/*******************定时器0中断函数**********************/                  
void Timer0() interrupt 1
{
        TH0=(65536-49550)/256; //设置初始值
        TL0=(65536-49550)%256;
        Time++;
        if(Time==40)  //控制秒时间长短
        {
                Second++;
                Time=0;
        }
}
回复

使用道具 举报

ID:150314 发表于 2016-11-26 13:17 | 显示全部楼层
三位数码管显示秒,无时、分显示,显示较准确。在普中HC6800V3.0板上做过实验,好用。
#include<reg51.h>
#define GPIO_DIG   P3
#define GPIO_PLACE P1
unsigned char code DIG_PLACE[3] = {0xfe,0xfd,0xfb};//,0xf7,0xef,0xdf,0xbf,0x7f};//位选控制   查表的方法控制
unsigned char code DIG_CODE[10] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
unsigned char DisplayData[8]; //用来存放要显示的8位数的值
unsigned char Time;                        //用来存放定时时间
unsigned int Second;
/*********************使用数码管显示*******************/
void DigDisplay()
{
        unsigned char i;
        unsigned int j;
        for(i=0; i<8; i++)
        {
                GPIO_PLACE=DIG_PLACE[i];         //发送位选
                GPIO_DIG=DisplayData[i];   //发送段码
                j=10;                                                           //扫描间隔时间设定
                while(j--);        
                GPIO_DIG=0x00;             //消隐
        }
}
/*********************配置定时器************************/
void Timer0init(void)
{
        TMOD=0x01;     //定时器0选择工作方式1
  TH0 =(65536-49550)/256;         //设置初始值,定时50MS
  TL0 =(65536-49550)%256;
  EA  =1;           //打开总中断
  ET0 =1;                 //打开定时器0中断
  TR0 =1;                 //启动定时器0        
}
/**********************主函数***************************/
void main(void)
{         
  Timer0init();  
  while(1)   
  {
    DisplayData[0]=DIG_CODE[(Second)/100];
    DisplayData[1]=DIG_CODE[(Second)%100/10];
    DisplayData[2]=DIG_CODE[(Second)%10];
    DigDisplay();
  }                                
}
/*******************定时器0中断函数**********************/                  
void Timer0() interrupt 1
{
        TH0=(65536-49550)/256; //设置初始值
        TL0=(65536-49550)%256;
        Time++;
        if(Time==40)  //控制秒时间长短
        {
                Second++;
                Time=0;
        }
}
回复

使用道具 举报

ID:150279 发表于 2016-11-26 13:38 | 显示全部楼层
需要振荡器
回复

使用道具 举报

ID:111634 发表于 2016-11-26 17:33 | 显示全部楼层

不需要额外振荡器,单片机本身有振荡器。
回复

使用道具 举报

ID:111634 发表于 2016-11-26 17:34 | 显示全部楼层
刚理解什么叫“跑秒”?,原来是秒表。
回复

使用道具 举报

ID:111634 发表于 2016-11-26 17:35 | 显示全部楼层
本帖最后由 zl2168 于 2016-11-26 17:36 编辑

实例93  99.9秒秒表


Proteus仿真一下,确认有效。
实例95 99.9秒秒表.rar (38.86 KB, 下载次数: 8)
回复

使用道具 举报

ID:150374 发表于 2016-11-26 17:40 | 显示全部楼层
定时器中断延时1s就可以了吧
回复

使用道具 举报

ID:150376 发表于 2016-11-26 18:01 | 显示全部楼层
三位数码管显示秒,无时、分显示,显示较准确。在普中HC6800V3.0板上做过实验,好用。
#include<reg51.h>
#define GPIO_DIG   P3
#define GPIO_PLACE P1
unsigned char code DIG_PLACE[3] = {0xfe,0xfd,0xfb};//,0xf7,0xef,0xdf,0xbf,0x7f};//位选控制   查表的方法控制
unsigned char code DIG_CODE[10] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
unsigned char DisplayData[8]; //用来存放要显示的8位数的值
unsigned char Time;                        //用来存放定时时间
unsigned int Second;
/*********************使用数码管显示*******************/
void DigDisplay()
{
        unsigned char i;
        unsigned int j;
        for(i=0; i<8; i++)
        {
                GPIO_PLACE=DIG_PLACE[i];         //发送位选
                GPIO_DIG=DisplayData[i];   //发送段码
                j=10;                                                           //扫描间隔时间设定
                while(j--);        
                GPIO_DIG=0x00;             //消隐
        }
}
/*********************配置定时器************************/
void Timer0init(void)
{
        TMOD=0x01;     //定时器0选择工作方式1
  TH0 =(65536-49550)/256;         //设置初始值,定时50MS
  TL0 =(65536-49550)%256;
  EA  =1;           //打开总中断
  ET0 =1;                 //打开定时器0中断
  TR0 =1;                 //启动定时器0        
}
/**********************主函数***************************/
void main(void)
{         
  Timer0init();  
  while(1)   
  {
    DisplayData[0]=DIG_CODE[(Second)/100];
    DisplayData[1]=DIG_CODE[(Second)%100/10];
    DisplayData[2]=DIG_CODE[(Second)%10];
    DigDisplay();
  }                                
}
/*******************定时器0中断函数**********************/                  
void Timer0() interrupt 1
{
        TH0=(65536-49550)/256; //设置初始值
        TL0=(65536-49550)%256;
        Time++;
        if(Time==40)  //控制秒时间长短
        {
                Second++;
                Time=0;
        }
}
回复

使用道具 举报

ID:147427 发表于 2016-11-26 18:30 | 显示全部楼层
用定时器最好了
回复

使用道具 举报

ID:150257 发表于 2016-11-28 19:50 | 显示全部楼层
怎么编程啊 按键控制闹钟
QQ图片20161128194945.png
回复

使用道具 举报

ID:150257 发表于 2016-11-28 20:15 | 显示全部楼层
zl2168 发表于 2016-11-26 17:35
实例93  99.9秒秒表

可以看一下程序吗
回复

使用道具 举报

ID:150971 发表于 2016-11-29 14:19 | 显示全部楼层
顶一个
回复

使用道具 举报

ID:111634 发表于 2016-11-29 14:39 | 显示全部楼层
程序在书中,自己可去看。
回复

使用道具 举报

ID:111634 发表于 2016-11-29 14:40 | 显示全部楼层
本帖最后由 zl2168 于 2016-11-29 14:42 编辑

程序在书中,自己可去看。
秒表案例不难,网上的程序多如牛毛,有什么区别???区别在于电路与程序真实可靠可信可行;在于程序语句条条有注解;在于便于阅读理解,便于自学;在于可以仿真演示,直观效果;在于不忽悠、不骗人。
回复

使用道具 举报

ID:151047 发表于 2016-11-29 17:49 来自手机 | 显示全部楼层
用定时计数器
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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