希望大家能耐心解答,不尽感激!
#include<reg52.h> //52单片机头文件,一般不要改动,里面包含特殊功能寄存器的定义
#define uchar unsigned char //将unsigned char定义为uchar,简化输写。提高编程速度
#define uint unsigned int //将unsigned char定义为uint,简化输写。提高编程速度
uchar code duma[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
uchar code wema[]={0xf0,0xf1,0xf2,0xf3,0xf4,0xf5,0xf6,0xf7};
uchar i;
uint number;
uchar qian,bai,shi,ge;
/*延时子程序*/
void delay(uchar x)
{
uchar a,b;
for(a=x;a>0;a--)
for(b=100;b>0;b--);
}
/*中断程序初始化*/
void inter_init()
{
EA=1; //开总中断
ET0=1; //本例中使用的是定时器T0,如果用T1。则为ET1=0,TMOD=0x10。
TMOD=0x01; //定时器工作方式1
TH0=(65535-50000)/256;
TL0=(65535-50000)%256;
TR0=1;
}
/*数码管显示子程序*/
void display(uchar qian,bai,shi,ge)
{
P2=duma[qian];
P1=wema[4]; //片选,对应为数码管第四个
delay(15);
P2=duma[bai];
P1=wema[5]; //片选,对应为数码管第五个
delay(15);
P2=duma[shi];
P1=wema[6]; //片选,对应为数码管第六个
delay(15);
P2=duma[ge];
P1=wema[7]; //片选,对应为数码管第七个
delay(15);
}
void main()
{
inter_init();
while(1)
{
if(i==2)
{
i=0;
if(number==0)
number=9999;
number--;
}
qian=number/1000; //求千位的值。这个不难理解吧。不会的翻C语言的书
bai=number%1000/100; //求百位的值。
shi=number%1000%100/10; //求十位的值。
ge=number%10; //求个位的值。
display(qian,bai,shi,ge);
}
}
void time()interrupt 1 using 1 //如果用T1的话,应为interrupt 3
{
TH0=(65535-50000)/256; //因为晶振用的是11.0592MHZ。在取初值时,大概定义为一个中断为50MS
TL0=(65535-50000)%256;
i++;
}
13 个解决方案
#1
请解析下面程序中duma[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}的数据是干什么用的,为什么要设成那样。还有,TH0=(65535-50000)/256和TL0=(65535-50000)%256;是什么意思?
今天难得上来回帖
duma[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}找个数码管的值,从P2口输出这个些,可以可到从0~9的显示
还有,TH0=(65535-50000)/256和TL0=(65535-50000)%256;是什么意思?
将15535存入TH0,TL0 要是不会算,回去看C语言的书。如果你display看不懂还情有可原
今天难得上来回帖
duma[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}找个数码管的值,从P2口输出这个些,可以可到从0~9的显示
还有,TH0=(65535-50000)/256和TL0=(65535-50000)%256;是什么意思?
将15535存入TH0,TL0 要是不会算,回去看C语言的书。如果你display看不懂还情有可原
#2
duma数组的功能是用查表法实现了译码功能,就是从0到9的7段数码管显示需要的值。
TH0和TL0存放的是定时器的初值,TH0放高八位,TL0放低八位,TH0=(65535-50000)/256和TL0=(65535-50000)%256;就是用来求这两个值的语句。/是整除,%是取余数,稍微分析一下就明白了。
TH0和TL0存放的是定时器的初值,TH0放高八位,TL0放低八位,TH0=(65535-50000)/256和TL0=(65535-50000)%256;就是用来求这两个值的语句。/是整除,%是取余数,稍微分析一下就明白了。
#3
{
P2=duma[qian];
P1=wema[4]; //片选,对应为数码管第四个
delay(15);
P2=duma[bai];
P1=wema[5]; //片选,对应为数码管第五个
delay(15);
P2=duma[shi];
P1=wema[6]; //片选,对应为数码管第六个
delay(15);
P2=duma[ge];
P1=wema[7]; //片选,对应为数码管第七个
delay(15);
}
以上的代码 个十百千万 值查数组 显示对应数 uchar code duma[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
===============================================================
TH0=(65535-50000)/256和TL0=(65535-50000)%256;是什么意思?
设定中断时间。
P2=duma[qian];
P1=wema[4]; //片选,对应为数码管第四个
delay(15);
P2=duma[bai];
P1=wema[5]; //片选,对应为数码管第五个
delay(15);
P2=duma[shi];
P1=wema[6]; //片选,对应为数码管第六个
delay(15);
P2=duma[ge];
P1=wema[7]; //片选,对应为数码管第七个
delay(15);
}
以上的代码 个十百千万 值查数组 显示对应数 uchar code duma[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
===============================================================
TH0=(65535-50000)/256和TL0=(65535-50000)%256;是什么意思?
设定中断时间。
#4
uchar code duma[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
数码管显示位,0~9的段码!
===============================================================
TH0=(65535-50000)/256和TL0=(65535-50000)%256;是什么意思?
定时时间,具体意义看看书中的定时器设置!
数码管显示位,0~9的段码!
===============================================================
TH0=(65535-50000)/256和TL0=(65535-50000)%256;是什么意思?
定时时间,具体意义看看书中的定时器设置!
#5
TH0=(65535-50000)/256// 除256,取整数就是高位字节相当与右移8BIT
和TL0=(65535-50000)%256;// %256是取低位,大于256的都舍掉,只要低8BIT
和TL0=(65535-50000)%256;// %256是取低位,大于256的都舍掉,只要低8BIT
#6
路过 ,帮顶。
#7
uchar code duma[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
这个数组是共阴极数码管的段选码,对应于十进制是0--9,数码管要工作必须要进行段选(给数码管送数据)和位选(选通要点亮哪一片数码管),所以你程序中 uchar code wema[]={0xf0,0xf1,0xf2,0xf3,0xf4,0xf5,0xf6,0xf7}就是对数码管的位选.这样之后,数码管就会显示你想显示的数据。
TH0=(65535-50000)/256和TL0=(65535-50000)%256 (大约50ms定时器中断一次)
这是对定时器设置初始值,由于定时器是自加进行计数的,所以初值=最大计数-设定值。
以12M晶振为例,16位计数方式。12MHz除12为1MHz,也就是说一秒=1000000次机器周期。50ms=50000次 机器周期。
这个数组是共阴极数码管的段选码,对应于十进制是0--9,数码管要工作必须要进行段选(给数码管送数据)和位选(选通要点亮哪一片数码管),所以你程序中 uchar code wema[]={0xf0,0xf1,0xf2,0xf3,0xf4,0xf5,0xf6,0xf7}就是对数码管的位选.这样之后,数码管就会显示你想显示的数据。
TH0=(65535-50000)/256和TL0=(65535-50000)%256 (大约50ms定时器中断一次)
这是对定时器设置初始值,由于定时器是自加进行计数的,所以初值=最大计数-设定值。
以12M晶振为例,16位计数方式。12MHz除12为1MHz,也就是说一秒=1000000次机器周期。50ms=50000次 机器周期。
#8
看看天祥的51单片机书 差不多都能明白
#9
我想问一下,duma[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
共阴极数码管的段选码是不是规定的?是不是所有用到共阴极数码管的都是用上面这几个值?
#10
与你的数码管管脚,还有接单片机的管脚有关。随时调整!
#11
可以认为是常数,因为7段数码管的排列顺序是一定的,只要你的连线没有变化这个代码就没有变化。
其编码的规则是,7段数码管外面的6段从最上面按逆时针依次最第0位、第1位、……、第5位,中间的那一横是第6位,有小数点的用第7位控制。由于是共阴数码管,所以为高电平时对应的那根管亮,根据不同的数字有不同的排布,所以相应的段码。
其编码的规则是,7段数码管外面的6段从最上面按逆时针依次最第0位、第1位、……、第5位,中间的那一横是第6位,有小数点的用第7位控制。由于是共阴数码管,所以为高电平时对应的那根管亮,根据不同的数字有不同的排布,所以相应的段码。
#12
算是人为规定的吧!大家都这样用,也就成了“标准”!
共阴极数码编码:
[0-7] 3fH 06H 5bH 4fH 66H 6dH 7dH 07H
共阳极数码编码:
[0-7] c0H f9H a4H b0H 99H 92H 82H f8H
共阴极数码编码:
[0-7] 3fH 06H 5bH 4fH 66H 6dH 7dH 07H
共阳极数码编码:
[0-7] c0H f9H a4H b0H 99H 92H 82H f8H
#13
不是要死记硬背?
#1
请解析下面程序中duma[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}的数据是干什么用的,为什么要设成那样。还有,TH0=(65535-50000)/256和TL0=(65535-50000)%256;是什么意思?
今天难得上来回帖
duma[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}找个数码管的值,从P2口输出这个些,可以可到从0~9的显示
还有,TH0=(65535-50000)/256和TL0=(65535-50000)%256;是什么意思?
将15535存入TH0,TL0 要是不会算,回去看C语言的书。如果你display看不懂还情有可原
今天难得上来回帖
duma[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}找个数码管的值,从P2口输出这个些,可以可到从0~9的显示
还有,TH0=(65535-50000)/256和TL0=(65535-50000)%256;是什么意思?
将15535存入TH0,TL0 要是不会算,回去看C语言的书。如果你display看不懂还情有可原
#2
duma数组的功能是用查表法实现了译码功能,就是从0到9的7段数码管显示需要的值。
TH0和TL0存放的是定时器的初值,TH0放高八位,TL0放低八位,TH0=(65535-50000)/256和TL0=(65535-50000)%256;就是用来求这两个值的语句。/是整除,%是取余数,稍微分析一下就明白了。
TH0和TL0存放的是定时器的初值,TH0放高八位,TL0放低八位,TH0=(65535-50000)/256和TL0=(65535-50000)%256;就是用来求这两个值的语句。/是整除,%是取余数,稍微分析一下就明白了。
#3
{
P2=duma[qian];
P1=wema[4]; //片选,对应为数码管第四个
delay(15);
P2=duma[bai];
P1=wema[5]; //片选,对应为数码管第五个
delay(15);
P2=duma[shi];
P1=wema[6]; //片选,对应为数码管第六个
delay(15);
P2=duma[ge];
P1=wema[7]; //片选,对应为数码管第七个
delay(15);
}
以上的代码 个十百千万 值查数组 显示对应数 uchar code duma[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
===============================================================
TH0=(65535-50000)/256和TL0=(65535-50000)%256;是什么意思?
设定中断时间。
P2=duma[qian];
P1=wema[4]; //片选,对应为数码管第四个
delay(15);
P2=duma[bai];
P1=wema[5]; //片选,对应为数码管第五个
delay(15);
P2=duma[shi];
P1=wema[6]; //片选,对应为数码管第六个
delay(15);
P2=duma[ge];
P1=wema[7]; //片选,对应为数码管第七个
delay(15);
}
以上的代码 个十百千万 值查数组 显示对应数 uchar code duma[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
===============================================================
TH0=(65535-50000)/256和TL0=(65535-50000)%256;是什么意思?
设定中断时间。
#4
uchar code duma[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
数码管显示位,0~9的段码!
===============================================================
TH0=(65535-50000)/256和TL0=(65535-50000)%256;是什么意思?
定时时间,具体意义看看书中的定时器设置!
数码管显示位,0~9的段码!
===============================================================
TH0=(65535-50000)/256和TL0=(65535-50000)%256;是什么意思?
定时时间,具体意义看看书中的定时器设置!
#5
TH0=(65535-50000)/256// 除256,取整数就是高位字节相当与右移8BIT
和TL0=(65535-50000)%256;// %256是取低位,大于256的都舍掉,只要低8BIT
和TL0=(65535-50000)%256;// %256是取低位,大于256的都舍掉,只要低8BIT
#6
路过 ,帮顶。
#7
uchar code duma[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
这个数组是共阴极数码管的段选码,对应于十进制是0--9,数码管要工作必须要进行段选(给数码管送数据)和位选(选通要点亮哪一片数码管),所以你程序中 uchar code wema[]={0xf0,0xf1,0xf2,0xf3,0xf4,0xf5,0xf6,0xf7}就是对数码管的位选.这样之后,数码管就会显示你想显示的数据。
TH0=(65535-50000)/256和TL0=(65535-50000)%256 (大约50ms定时器中断一次)
这是对定时器设置初始值,由于定时器是自加进行计数的,所以初值=最大计数-设定值。
以12M晶振为例,16位计数方式。12MHz除12为1MHz,也就是说一秒=1000000次机器周期。50ms=50000次 机器周期。
这个数组是共阴极数码管的段选码,对应于十进制是0--9,数码管要工作必须要进行段选(给数码管送数据)和位选(选通要点亮哪一片数码管),所以你程序中 uchar code wema[]={0xf0,0xf1,0xf2,0xf3,0xf4,0xf5,0xf6,0xf7}就是对数码管的位选.这样之后,数码管就会显示你想显示的数据。
TH0=(65535-50000)/256和TL0=(65535-50000)%256 (大约50ms定时器中断一次)
这是对定时器设置初始值,由于定时器是自加进行计数的,所以初值=最大计数-设定值。
以12M晶振为例,16位计数方式。12MHz除12为1MHz,也就是说一秒=1000000次机器周期。50ms=50000次 机器周期。
#8
看看天祥的51单片机书 差不多都能明白
#9
我想问一下,duma[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
共阴极数码管的段选码是不是规定的?是不是所有用到共阴极数码管的都是用上面这几个值?
#10
与你的数码管管脚,还有接单片机的管脚有关。随时调整!
#11
可以认为是常数,因为7段数码管的排列顺序是一定的,只要你的连线没有变化这个代码就没有变化。
其编码的规则是,7段数码管外面的6段从最上面按逆时针依次最第0位、第1位、……、第5位,中间的那一横是第6位,有小数点的用第7位控制。由于是共阴数码管,所以为高电平时对应的那根管亮,根据不同的数字有不同的排布,所以相应的段码。
其编码的规则是,7段数码管外面的6段从最上面按逆时针依次最第0位、第1位、……、第5位,中间的那一横是第6位,有小数点的用第7位控制。由于是共阴数码管,所以为高电平时对应的那根管亮,根据不同的数字有不同的排布,所以相应的段码。
#12
算是人为规定的吧!大家都这样用,也就成了“标准”!
共阴极数码编码:
[0-7] 3fH 06H 5bH 4fH 66H 6dH 7dH 07H
共阳极数码编码:
[0-7] c0H f9H a4H b0H 99H 92H 82H f8H
共阴极数码编码:
[0-7] 3fH 06H 5bH 4fH 66H 6dH 7dH 07H
共阳极数码编码:
[0-7] c0H f9H a4H b0H 99H 92H 82H f8H
#13
不是要死记硬背?