钻石会员
主题
回帖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段
}
} |
|