钻石会员 
 
主题
回帖0
积分18364
阅读权限50
注册时间2012-3-16
最后登录1970-1-1
在线时间 小时
 
 
 
 
 | 
 
 楼主 |
发表于 2012-9-9 11:40
|
显示全部楼层
 
 
 
请大家多多指教!   
#include<reg51.h>    //  包含51单片机寄存器定义的头文件 
sbit sin=P3^2;                 //信号输入 
sbit ge=P0^7;            //个位 
sbit shi=P0^6;      //十位 
unsigned char code num[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; 
int s=0;  //定义一个全局变量s,用于存放秒的数值 
 
void timer(void) interrupt 1 using 1 
{ 
        int i; 
        if(i==19)  //若i=20,则是1秒,我的如果是20的话会稍慢,所以改为19 
        { 
                s++;   //秒数自加1 
                i=0;        //对i清零         
        }         
        if(s==60)        //如果到了60秒,则对秒数清零 
        { 
                s=0; 
        } 
        i++; //每中断一次,i的值加1 
        TH0=(65536-8800)/256;          //再给定时器赋初始值 
        TL0=(65536-8800)%256; 
} 
 
void init(void)//定时器初始函数,对定时器初始化 
{ 
        EA=1;                                        //允许所有的中断请求 
        TMOD=0x01;                                //设定时器0的工作模式为 方式1 即16位定时器 
        ET0=1;                                        //允许定时器0的中断请求 
        TH0=(65536-8800)/256;        //定时时间为50ms,初始值要根据具体情况微调 
        TL0=(65536-8800)%256; 
        TR0=1;                                        //打开定时器0,开始定时  
        EX0=1;                                        // 允许使用外中断 
        IT0=1;                                        // 选择负跳变来触发外中断,这句不要按键时LED会闪烁 
} 
 
/************************************************************** 
函数功能:外中断T0的中断服务程序 
**************************************************************/ 
void int0(void) interrupt 0 using 0 //外中断0的中断编号为0 
{ 
  //P2=~P2;  //每产生一次中断请求,P1取反一次。 
s++; 
 
} 
 
void main() 
{ 
        unsigned int i;                //定义一个变量,用于数码管延时 
        init();                        //调用定时器初始化函数,对定时器进行初始化 
        while(1)                        //死循环,让数码管不断显示 
        { 
//下面是只让第一段显示 ,其他的关闭 
                i=1000;                                //赋值给变量 
                shi=0;                                //三极管导通,只让第1段显示,其他段关闭 
                P1=num[s/10];                  //分离出秒的十位 ,让数码管的第一段显示 
                while(i--);                        //延时一下,让眼睛视觉残留 
                shi=1;                                //关闭第1段 
 
//下面是只让第二段显示,其他的关闭 
                i=1000;                                //重新赋值给变量 
                ge=0;                                //三极管导通,只让第2段显示,其他段关闭 
                P1=num[s%10];                //分离出秒的个位,让数码管的第二段显示 
                while(i--);                        //延时一下,让眼睛视觉残留 
                ge=1;                                //关闭第2段 
        } 
} |   
 
 
 
 |