数码管秒表C程序

发布者:jingyan最新更新时间:2018-01-07 来源: eefocus关键字:数码管秒表  C程序 手机看文章 扫描二维码
随时随地手机看文章

数码管秒表C程序

*                 数码管显示秒表, 分辨率0.01s                      

*                 K1---控制按钮                            
*                       第一次按下时, 启动开始计时 
*                       第二次按下时, 停止          
*                       第三次按下时, 归零   
*  引用资源:数码管数据 p0口,数码管控制p2口  控制按钮 p3.2口 
*    秒单位,寄存器与数码管对应关系:                          
*                                             
* --- 秒单位 ---------- 数码管端口 ---- 缓冲区 --------- 计时BCD码值寄存器
*     十万位               P20        dis_buf[7]          sec_bcd[7] 
*     万位                 P21        dis_buf[6]          sec_bcd[6]  
*     千位                 P22        dis_buf[5]          sec_bcd[5] 
*     百位                 P23        dis_buf[4]          sec_bcd[4]  
*     十位                 P24        dis_buf[3]          sec_bcd[3]   
*     个位(1.s)            P25        dis_buf[2]          sec_bcd[2]   
*     十分位(0.1s)         P26        dis_buf[1]          sec_bcd[1]   
*     百分位(0.01s)        P27        dis_buf[0]          sec_bcd[0]


#include  
#include  

unsigned char data dis_digit; 
unsigned char key_s, key_v; 

unsigned char code dis_code[11]={ 0x28, 0x7E, 0xA2, 0x62, 0x74, 0x61, 0x21, 0x7A, 0x20, 0x60,0xff};//0,1,2,3,4,5,6,7,8,9,关显示,数码管码表 
unsigned char dis_buf[8];        // 显示缓冲区 
unsigned char sec_bcd[8];         // 秒计数值, BCD码 
unsigned char dis_index;        //  
unsigned char key_times;        // K1 按下次数                // 

void clr_time();     
void update_disbuf(); 
bit    sCAN_key(); 
void proc_key(); 
void delayms(unsigned char ms); 

sbit    K1 = P3^2; 


void main(void) 

    P0 = 0xff; 
    P2 = 0xff; 
    TMOD = 0x11;        // 定时器0, 1工作模式1, 16位定时方式 
    TH1 = 0xdc; 
    TL1 = 0; 

    TH0 = 0xFC; 
    TL0 = 0x17; 
     
    clr_time();            //  
                                
    dis_digit = 0x7f;        // 初始显示P20口数码管 
    dis_index = 0;            //  
     
    key_times = 0; 
    key_v = 0x01; 
     
    IE = 0x8a;                // 使能timer0, timer1中断 
     
    TR0 = 1; 
    TR1 = 0; 
    while(1) 
    { 
        if(scan_key()) 
        { 
            delayms(10); 
            if(scan_key()) 
            { 
                key_v = key_s; 
                proc_key(); 
            } 
        } 
         
    } 


void clr_time() 

    sec_bcd[0] = 0x0; 
    sec_bcd[1] = 0x0; 
    sec_bcd[2] = 0x0; 
    sec_bcd[3] = 0x0; 
    sec_bcd[4] = 0x0; 
    sec_bcd[5] = 0x0; 
    sec_bcd[6] = 0x0; 
    sec_bcd[7] = 0x0;    
     
    update_disbuf(); 
     


bit scan_key() 

    key_s = 0x00; 
    key_s |= K1; 
    return(key_s ^ key_v);     


void proc_key() 

    if((key_v & 0x01) == 0) 
    { 
        key_times++; 
        if(key_times == 1) 
        { 
            TR1 = 1; 
        } 
        else if(key_times == 2) 
        {     
            TR1 = 0; 
        } 
        else 
        { 
            clr_time(); 
            key_times = 0; 
        } 
         
    } 


void timer0() interrupt 1 
// 定时器0中断服务程序, 用于数码管的动态扫描 
// dis_index --- 显示索引, 用于标识当前显示的数码管和缓冲区的偏移量 
// dis_digit --- 位选通值, 传送到P2口用于选通当前数码管的数值, 如等于0xfe时, 
//                选通P2.0口数码管 
// dis_buf   --- 显于缓冲区基地址     

    TH0 = 0xFC; 
    TL0 = 0x17; 
     
    P2 = 0xff;                            // 先关闭所有数码管 
    P0 = dis_buf[dis_index];            // 显示代码传送到P0口 
    P2 = dis_digit;                        //  

    dis_digit = _cror_(dis_digit,1);    // 位选通值右移(P20<-P27), 下次中断时选通下一位数码管 
    dis_index++;                        //  
                     
    dis_index &= 0x07;            // 8个数码管全部扫描完一遍之后,再回到第一个开始下一次扫描 


void timer1() interrupt 3 
// 
{     
    unsigned char i; 
    TH1 |= 0xdc; 
    for(i = 0; i < 8; i++) 
    { 
        sec_bcd[i]++;            // 低位加1 
        if(sec_bcd[i] < 10)        // 如果低位满10则向高位进1 
            break;            // 低位未满10 
        sec_bcd[i] = 0;            // 低位满10清0 
    } 
    update_disbuf();            // 更新显示缓冲区 


void update_disbuf() 
// 更新显示缓冲区 

    dis_buf[0] = dis_code[sec_bcd[0]]; 
    dis_buf[1] = dis_code[sec_bcd[1]]; 
    dis_buf[2] = dis_code[sec_bcd[2]] & 0x7f;    // 加上小数点 
    dis_buf[3] = dis_code[sec_bcd[3]]; 
    dis_buf[4] = dis_code[sec_bcd[4]]; 
    dis_buf[5] = dis_code[sec_bcd[5]]; 
    dis_buf[6] = dis_code[sec_bcd[6]]; 
    dis_buf[7] = dis_code[sec_bcd[7]]; 


void delayms(unsigned char ms)     
// 延时子程序 
{                         
    unsigned char i; 
    while(ms--) 
    { 
        for(i = 0; i < 120; i++); 
    } 
}


关键字:数码管秒表  C程序 引用地址:数码管秒表C程序

上一篇:30路红外遥控开关程序
下一篇:51单片机1602LCD显示数字频率计

推荐阅读最新更新时间:2024-03-16 15:51

模拟I2C程序设计
#include #include #define uchar unsigned char #define DELAY5US _nop_(); _nop_(); _nop_(); _nop_(); //延时5us #define WriteDeviceAddress 0xa0 //写I2C外围器件的寻址地址 #define ReadDeviceAddress 0xa1 //读I2C外围器件的寻址地址 //注:写I2C外围器件的寻址地址为器件的地址,读为器件地址加1 uchar E0; //非应答信号标志位 uchar NACK=0; //错误标志位 //*********************
[单片机]
AT89S52控制混合式步进电机 C程序
#include uart.h //包含串口通信头文件(里面含有reg52.h) #include stdio.h //包含printf头文件 #define uint unsigned int #define uchar unsigned char sbit cp = P2^0; //脉冲输入端 sbit dir = P2^1; //方向控制端 sbit free = P2^2; //脱机控制端,一般接高即可 sbit jia_su = P1^0; //加速键key1声明 sbit jian_su = P1^1; //减速键key2声明 sbit fang_xiang = P1^2; //切换方向键key3声
[单片机]
cs5550 c程序
cs5550 c程序: AD转换芯片cs5550的读写c语言读写程序 void write_CS5550(uchar data_to_send) // { uchar i; AD_SCLK=0; // AD_CS =0; Delay_us(20); // for (i=0;i 8;i++) { if( (data_to_send&0X80)==0 ) { AD_SDI=0; } else{AD_SDI=1;} AD_SCLK=1; Delay_us(10); // AD_SCLK=0; data_to_send =1; } } uchar read_CS5550(void) // { un
[模拟电子]
超声波测距单片机C程序
单片机源程序如下: #include reg52.h //STC89C52头文件 #define uchar unsigned char #define uint unsigned int unsigned int time=0; unsigned int timer=0; unsigned long S=0; //距离变量 bit flag =0; //超声波模块量程溢出标志( 5米时置1) sbit echo=P1^0; //超声波模块的发射端 sbit trig=P1^1; //超声波模块的接收端 sbit ds=P2^2; //DS18B2
[单片机]
超声波测距单片机<font color='red'>C程序</font>
12864液晶显示原理(C程序
目录: 12864液晶显示原理 一、点阵LCD的显示原理 二、12864点阵型LCD简介 三、12864LCD的指令系统及时序 四、12864点阵型LCD软硬件设计实例 1、硬件原理图 2、程序流程图 3、字模代码 五、12864点阵型LCD应用举例 1、硬件部分 2、软件部分( 汉字在内存中的存储形式 ) 12864液晶显示任何图像 一、所需软件 二、DIY一副图画 三、C语言代码 附录 一、机内码和区位码的区别 二、液晶屏常识 1、什么是COG型LCD 2、LCD显示模块的外部接口 1)8080模式,并行 2)6800模式,并行 3)串行模
[单片机]
12864液晶显示原理(<font color='red'>C程序</font>)
自制四位数码管显示的数字钟c程序
#include stc90.h #define uchar unsigned char uchar code shuzi ={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xc0};//0 1 2 3 4 5 6 7 8 9 0 uchar code shuza ={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0xc0};//0 1 2 3 4 5 0 uchar ss,dd,ff,gg,zz; uchar qq,ww,ee,rr,tt; uchar z,x,qw,qe,qr,as,fe; sbit a=P2^0;//锁存器1 sbit b=P2^1;
[单片机]
自制四位<font color='red'>数码管</font>显示的数字钟<font color='red'>c程序</font>
实时时钟芯片HT1380读写c程序
/*此程序的原型是从网上下载的,经过了我的实验和修改,并成功应用*/ #include w78e58b.h #include "ht1380.h" #include "intrins.h" #define uchar unsigned char /******************************************************************** * * 名称: v_RTInputByte * 说明: * 功能: 往HT1381写入1Byte数据 * 调用: * 输入: ucDa 写入的数据 * 返回值: 无 *****************************************
[单片机]
16*128 LED点阵屏C程序
/***************************************************** 16*128 LED点阵屏 C 程序 ****************************************************** 声明: 本程序供大家学习之用,用勿用于商业用途。尊重版权。 编写:邓椿薪 时间:2006年1月20日 晚 邮箱:love2151@xinhuanet.com ******************************************************* //595连级输出数据,138行驱动。P0_1为移动速度高速/*点阵显示汉字程串口输出字符数据, //P2口输
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved