单片机C程序

时间:2022-06-28 19:46:47
请解析下面程序中duma[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}的数据是干什么用的,为什么要设成那样。还有,TH0=(65535-50000)/256和TL0=(65535-50000)%256;是什么意思?

希望大家能耐心解答,不尽感激!

#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看不懂还情有可原

#2


duma数组的功能是用查表法实现了译码功能,就是从0到9的7段数码管显示需要的值。

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;是什么意思?
设定中断时间。

#4


uchar code duma[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};  
数码管显示位,0~9的段码!

===============================================================
TH0=(65535-50000)/256和TL0=(65535-50000)%256;是什么意思?
定时时间,具体意义看看书中的定时器设置!

#5


TH0=(65535-50000)/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次 机器周期。




#8


看看天祥的51单片机书 差不多都能明白

#9


引用 7 楼 zhenxing2000 的回复:
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,……

我想问一下,duma[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
共阴极数码管的段选码是不是规定的?是不是所有用到共阴极数码管的都是用上面这几个值?

#10


与你的数码管管脚,还有接单片机的管脚有关。随时调整!

#11


可以认为是常数,因为7段数码管的排列顺序是一定的,只要你的连线没有变化这个代码就没有变化。

其编码的规则是,7段数码管外面的6段从最上面按逆时针依次最第0位、第1位、……、第5位,中间的那一横是第6位,有小数点的用第7位控制。由于是共阴数码管,所以为高电平时对应的那根管亮,根据不同的数字有不同的排布,所以相应的段码。

引用 9 楼 gkjsj 的回复:
引用 7 楼 zhenxing2000 的回复:
uchar code duma[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
这个数组是共阴极数码管的段选码,对应于十进制是0--9,数码管要工作必须要进行段选(给数码管送数据)和位选(选通要点亮哪一片数码管),所以你程序中 uchar code wema[]={0xf0,0xf……

#12


算是人为规定的吧!大家都这样用,也就成了“标准”!
共阴极数码编码:
[0-7] 3fH 06H 5bH 4fH 66H 6dH 7dH 07H  

共阳极数码编码:
[0-7] c0H f9H a4H b0H 99H 92H 82H f8H 

#13


单片机C程序不是要死记硬背?

#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看不懂还情有可原

#2


duma数组的功能是用查表法实现了译码功能,就是从0到9的7段数码管显示需要的值。

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;是什么意思?
设定中断时间。

#4


uchar code duma[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};  
数码管显示位,0~9的段码!

===============================================================
TH0=(65535-50000)/256和TL0=(65535-50000)%256;是什么意思?
定时时间,具体意义看看书中的定时器设置!

#5


TH0=(65535-50000)/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次 机器周期。




#8


看看天祥的51单片机书 差不多都能明白

#9


引用 7 楼 zhenxing2000 的回复:
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,……

我想问一下,duma[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
共阴极数码管的段选码是不是规定的?是不是所有用到共阴极数码管的都是用上面这几个值?

#10


与你的数码管管脚,还有接单片机的管脚有关。随时调整!

#11


可以认为是常数,因为7段数码管的排列顺序是一定的,只要你的连线没有变化这个代码就没有变化。

其编码的规则是,7段数码管外面的6段从最上面按逆时针依次最第0位、第1位、……、第5位,中间的那一横是第6位,有小数点的用第7位控制。由于是共阴数码管,所以为高电平时对应的那根管亮,根据不同的数字有不同的排布,所以相应的段码。

引用 9 楼 gkjsj 的回复:
引用 7 楼 zhenxing2000 的回复:
uchar code duma[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
这个数组是共阴极数码管的段选码,对应于十进制是0--9,数码管要工作必须要进行段选(给数码管送数据)和位选(选通要点亮哪一片数码管),所以你程序中 uchar code wema[]={0xf0,0xf……

#12


算是人为规定的吧!大家都这样用,也就成了“标准”!
共阴极数码编码:
[0-7] 3fH 06H 5bH 4fH 66H 6dH 7dH 07H  

共阳极数码编码:
[0-7] c0H f9H a4H b0H 99H 92H 82H f8H 

#13


单片机C程序不是要死记硬背?