用52单片机C语言编写程序,实现00~59计时。要求用T0,工作方式1。

请说下,用52单片机C语言编写程序,实现00~59计时。要求用T0,工作方式1。
最新回答
长双眼皮的鱼

2024-09-06 18:11:22

#include <reg52.h>
#define uint unsigned int
#define uchar unsigned char
sbit 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; //十位和个位
}
}

试了的,可以放心,采纳吧!
平胸小欧巴

2024-09-06 16:57:14

这是我以前写的一个程序,定时器T0工作在方式1,实现计数与手动清零的效果,你可以自己改改

/*
1、程序目的:使用定时器学习秒表计时,中断0控制走表,中断1控制清零
2、硬件要求:数码管、晶振12M
*/
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
uchar 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]; //个位显示处理
}
逝去的终将逝去

2024-09-06 21:56:07

参考:

http://hi.baidu.com/do_sermon/item/dbf7bbea9f0257088c3ea862