#include <reg52.h>#define uint unsigned int #define uchar unsigned charsbit dula=P2^6; //段选sbit wela=P2^7; //位选uchar shi,ge,num1,num2; //变量uchar code table[]={0x3f,0x06,0x5b,0x4f, //共阴极字型码 0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c, 0x39,0x5e,0x79,0x71};void delay(uint x) //延时子程序{ uint i,j; for(i=0;i<x;i++) for(j=0;j<120;j++);}void init(){ TMOD=0x01; //设置定时器0的工作方式 TH0=(65536-50000)/256; //装初值 TL0=(65536-50000)%256; EA=1; //开总中断 ET0=1; //开定时器0中断 TR0=1; //启动定时器0}void display() //显示子程序{ dula=1; P0=table[ge]; //送段选数据 dula=0; P0=0xff; //送位选数据前关闭所有显示 wela=1; P0=0xfe; //送位选数据 wela=0; delay(5); //延时 dula=1; P0=table[shi]; dula=0; P0=0xff; wela=1; P0=0xfd; wela=0; delay(5);}void main(){ init(); while(1) { display(); }}void timer() interrupt 1{ TH0=(65536-50000)/256; //重装初值 TL0=(65536-50000)%256; num1++; if(num1==20) //到了20次,1秒时间到 { num1=0; //清0重新计数 num2++; if(num2==60) num2=0; P1=0x00; delay(500); P1=0xff; shi=num2/10; //把一个2位数分离后分别送数码管显示 ge=num2%10; //十位和个位 } }试了的,可以放心,采纳吧!
这是我以前写的一个程序,定时器T0工作在方式1,实现计数与手动清零的效果,你可以自己改改/*1、程序目的:使用定时器学习秒表计时,中断0控制走表,中断1控制清零 2、硬件要求:数码管、晶振12M*/#include<reg52.h>#define uint unsigned int #define uchar unsigned charuchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; uchar m_shi;//定义十位uchar m_ge; //定义个位uchar s_shi;//定义秒十位uchar s_ge; //定义秒个位uchar second,msecond;void CLR();void delay(uint z){ uchar x,y; for(x=z;x>0;x--) for(y=110;y>0;y--);}void main(){ EX0=1;//外部中断0设置 IT0=1;//边沿触发 EX1=1;//外部中断1设置 IT1=1;//边沿触发 TMOD=0x01;//定时器设置 10ms in 12M crystal TH0=(65536-10000)/256;//0xd8; TL0=(65536-10000)%256;//0xf0; EA=1; ET0=1; //打开中断 TR0=0; CLR(); while(1) { P0=s_shi;//显示秒十位 P2=1; delay(3);//短暂延时 P0=s_ge; //显示秒个位 P2=2; delay(3); P0=0x40; //显示横杠 P2=3; delay(3); P0=m_shi;//显示十位 P2=4; delay(3);//短暂延时 P0=m_ge; //显示个位 P2=5; delay(3); }}void timer0() interrupt 1 { TH0=(65536-10000)/256;//0xd8;//重新赋值 TL0=(65536-10000)%256;//0xf0; msecond++; if(msecond==100) { msecond=0; second++;//秒加1 if(second==100) second=0; s_shi=table[second/10];//十位显示值处理 s_ge=table[second%10]; //个位显示处理 } m_shi=table[msecond/10];//十位显示值处理 m_ge=table[msecond%10]; //个位显示处理}void exter0() interrupt 0 { TR0=!TR0; //利用外部中断打开和关闭定时器0 用于开始和停止计时}void exter1() interrupt 2 { if(TR0==0)//停止时才可以清零 CLR();}void CLR(){ second=0; //利用外部中断清零 msecond=0; m_shi=table[msecond/10];//十位显示值处理 m_ge=table[msecond%10]; //个位显示处理 s_shi=table[second/10];//十位显示值处理 s_ge=table[second%10]; //个位显示处理}