51单片机数码管显示

#include<reg52.h>unsignedcharcodeshu[]={0x08,0x5e,0x82,0x42,0x54,0x41,0x01,0x5a,0x00,... #include<reg52.h>
unsigned char code shu[]={0x08,0x5e,0x82,0x42,0x54,0x41,0x01,0x5a,0x00,0x40};//0-9
unsigned char code wei[]={0xfe,0xfd,0xfb,0xf7,0xef};
unsigned int x,y,z;
unsigned char con;
/**************************************/
void init(void)
{
TMOD = 0x16;//T1定时器方式1 T0计数器自动装载
TH0 = 256-1;
TL0 = 256-1;
TH1 = 0xfc;
TL0 = 0x18;//1mc
TR0=1;
TR1=1;
ET0=1;
ET1=1;
EA=1;
}
/*************************************/
void time0()interrupt 1
{
x++;
if(x==1) z=x*(60000/y);
x=0;
y=0;
TH0 = 256-1;
TL0 = 256-1;
TR0=1;
}
/************************************/
void time1()interrupt 3
{
y++;
TH1 = 0xfc;//1ms
TL0 = 0x18;
TR1=1;
}

void main(void)
{
x=0;
y=0;
while(1)
{
init();
}
}
哪位高手能把数码管显示给我写出来 显示z的值
展开
 我来答
zhxiufan
推荐于2018-03-30 · 知道合伙人软件行家
zhxiufan
知道合伙人软件行家
采纳数:14923 获赞数:38381
国家科技进步奖

向TA提问 私信TA
展开全部
#include<reg52.h>
unsigned char code shu[]={0x08,0x5e,0x82,0x42,0x54,0x41,0x01,0x5a,0x00,0x40};//0-9
unsigned char code wei[]={0xfe,0xfd,0xfb,0xf7,0xef}; 
unsigned int x,y,z;
unsigned char con;
unsigned char dis[5];
/**************************************/
void init(void)
{
TMOD = 0x16;//T1定时器方式1 T0计数器自动装载
TH0 = 256-1; 
TL0 = 256-1;
TH1 = (65536-5000)/256;
TL1 = (65536-5000)%256;//5mc
TR0=1;
TR1=1;
ET0=1;
ET1=1;
EA=1;
}
/*************************************/
void time0()interrupt 1
{
x++;
if(x==1) z=x*(60000/y);
x=0;
y=0;
dis[0]=z/10000;
dis[1]=(z%10000)/1000;
dis[2]=(z%1000)/100;
dis[3]=(z%100)/10;
dis[4]=z%10;
}
/************************************/
void time1()interrupt 3
{
y++;
TH1 = (65536-5000)/256;
TL1 = (65536-5000)%256;//5mc
con++;
P2=wei[con];
P0=shu[con];
}

void main(void)
{
x=0;
y=0;
init();
while(1);
}
xlee9
2012-12-20
知道答主
回答量:8
采纳率:0%
帮助的人:3.6万
展开全部
新手学单片机,你这个程序有几个地方有问题吧。
TH0 = 256-1;
TL0 = 256-1;
TH1 = 0xfc;
TL0 = 0x18;//1mc
这个地方下面那个TL0应该为TL1,
另, z=x*(60000/y);
当y为0时单片机运行是一个什么结果?
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
tangkun08
2012-12-19 · TA获得超过303个赞
知道小有建树答主
回答量:82
采纳率:0%
帮助的人:90.1万
展开全部
void delay (int t) //延时函数,tms
{
int i,j;
for (i=124;i>0;i++)
for (j=t;j>0;j++);
}

void display (uint number) //数码管显示函数;显示四位数,要想显示多位稍微修改即可
{
P1=0XFF; //数码管段选接在P0口,具体情况可修改;此步作用是消影,必要的
P2=0XFE; //位选连接在P2口
P1=table [number/1000];
delay (2); //延时2ms,时间只要短就行了
P1=0XFF;
P2=0Xfd;
P1=table [number/100%10];
delay (2);

P1=0XFF;
P2=0XFB;
P1=table [number/10%10];
delay (2);

P1=0XFF;
P2=0XF7;
P1=table [number%10];
delay (2);
}

//然后再主函数中循环执行:
display (z);

//我觉得init那个初始化函数在主函数中执行一次就可以了,建议放在while循环之前,不要在while中循环执行,否则会出问题的
还有具体的显示函数中时P1和P2还是其他的,要看你的硬件连接了
追问
你能把它们写成一个完整的吗?我刚学对单片机不怎么会,我试过了不行,我这个程序可以说是频率测量,数码管的值是一直在变的
追答
你的定时器初始化函数中TMOD=0X16;好像有问题,要设置T1定时器方式1 T0计数器自动装载,应该是TMOD=0X13;(二进制10011)。然后在你的main函数之前加上我给你的两个函数,再把主函数换成如下函数:
void main ()
{
x=0;
y=0;
init ();
while (1){
display (z);
}
}

还有,把我给你的显示函数void display (uint number) 中的uint改成unsigned int,我习惯前面宏定义一下了。另外注意显示函数中的P1和P2换成你的实际IO口。
这样z的值在中断函数中改变,主函数中执行显示时就显示z相应的值了
最后,我给你的数码管显示函数对应的是共阳的数码管,把你的函数中第二行换成下面的,第三行删去吧,位选没用到
int code table []={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
本回答被提问者和网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
土豆牛奶糖
2012-12-19
知道答主
回答量:54
采纳率:0%
帮助的人:9.6万
展开全部
坏了吧
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式