51单片机 用定时器T1控制两位数码管做从0计数到60的实验,每一秒加1,可是怎都不显示,求高手帮忙找原因
//****************************************************************//用定时器T0和T1分别控制P1…同...
//****************************************************************
//用定时器T0和T1分别控制P1…同时数码管从0增加到60,循环
//****************************************************************
#include<reg52.h>
#define uchar unsigned char
uchar shi,ge;
uchar num1 = 0;
uchar num2 = 0;
sbit dula = P2^6;
sbit wela = P2^7;
void delay(int);
void display(uchar,uchar);
uchar code table[]=
{
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71
};
void main(void)
{
TMOD = 0X10; //T1工作方式1,16位定时器
TH1 = (65536-46080)/256; //赋初值
TL1 = (65536-46080)%256;
EA = 1; //开中断
ET1 = 1;
TR1 = 1;
while(1)
{
display(shi,ge); //显示函数
}
}
//************************************
//****************延时函数************ //用于动态扫描
//************************************
void delay(int i)
{
int x,y;
for(x=i;x>0;x--)
for(y=110;y>0;y--);
}
//************************************
//*************display函数********
//************************************
void dispiay(uchar ge,uchar shi)
{
dula = 1;
P0 = table[shi];
dula = 0;
P0 = 0xff;
wela = 1;
P0 = 0xfe;
wela = 0;
delay(2);
dula = 1;
P0 = table[ge];
dula = 0;
P0 = 0xff;
wela = 1;
P0 = 0xfd;
wela = 0;
delay(2);
}
//*********************************
//*************中断T1**************
//*********************************
void Timer_1() interrupt 3
{
TH1 = (65536-46080)/256;
TL1 = (65536-46080)%256;
num1++;
if(num1 == 20) // 1s
{
num1 = 0;
num2++;
if(num2 == 60) //计数到60
{
num2 = 0; //清零
}
shi = num2/10; //分离两位数
ge = num2%10;
}
}
该程序编译后如图:无错误,3警告。但不提示警告在哪里,版本为Keil uVision2.下载后板子无反应,请问前辈们这是怎么回事?? 展开
//用定时器T0和T1分别控制P1…同时数码管从0增加到60,循环
//****************************************************************
#include<reg52.h>
#define uchar unsigned char
uchar shi,ge;
uchar num1 = 0;
uchar num2 = 0;
sbit dula = P2^6;
sbit wela = P2^7;
void delay(int);
void display(uchar,uchar);
uchar code table[]=
{
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71
};
void main(void)
{
TMOD = 0X10; //T1工作方式1,16位定时器
TH1 = (65536-46080)/256; //赋初值
TL1 = (65536-46080)%256;
EA = 1; //开中断
ET1 = 1;
TR1 = 1;
while(1)
{
display(shi,ge); //显示函数
}
}
//************************************
//****************延时函数************ //用于动态扫描
//************************************
void delay(int i)
{
int x,y;
for(x=i;x>0;x--)
for(y=110;y>0;y--);
}
//************************************
//*************display函数********
//************************************
void dispiay(uchar ge,uchar shi)
{
dula = 1;
P0 = table[shi];
dula = 0;
P0 = 0xff;
wela = 1;
P0 = 0xfe;
wela = 0;
delay(2);
dula = 1;
P0 = table[ge];
dula = 0;
P0 = 0xff;
wela = 1;
P0 = 0xfd;
wela = 0;
delay(2);
}
//*********************************
//*************中断T1**************
//*********************************
void Timer_1() interrupt 3
{
TH1 = (65536-46080)/256;
TL1 = (65536-46080)%256;
num1++;
if(num1 == 20) // 1s
{
num1 = 0;
num2++;
if(num2 == 60) //计数到60
{
num2 = 0; //清零
}
shi = num2/10; //分离两位数
ge = num2%10;
}
}
该程序编译后如图:无错误,3警告。但不提示警告在哪里,版本为Keil uVision2.下载后板子无反应,请问前辈们这是怎么回事?? 展开
2个回答
展开全部
第一个问题:
如果你的晶振是12M的话
你的TH1 和TL1 的设置,表示你大约定时20ms,20ms*20=400ms
你需要的是1s定时,不是400ms定时
第二个问题是:
你的函数定义是 void dispiay(uchar ge,uchar shi)
你的调用却是 display(shi,ge); //显示函数
两个形参是相反的
第三个问题:★★★★★★★★★这是最主要的问题所在
你的函数申明和定义中:void dispiay(uchar,uchar); 将其中的 l 错写成 i 了
但是你的函数调用却是拼写正确的,所以函数调用失败
如果你的晶振是12M的话
你的TH1 和TL1 的设置,表示你大约定时20ms,20ms*20=400ms
你需要的是1s定时,不是400ms定时
第二个问题是:
你的函数定义是 void dispiay(uchar ge,uchar shi)
你的调用却是 display(shi,ge); //显示函数
两个形参是相反的
第三个问题:★★★★★★★★★这是最主要的问题所在
你的函数申明和定义中:void dispiay(uchar,uchar); 将其中的 l 错写成 i 了
但是你的函数调用却是拼写正确的,所以函数调用失败
本回答被网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询