谁能帮我注释一下下面的单片机c程序,最主要的是为什么P2=0xfb能够点亮相应的数码管?
#include<reg51.h>#defineucharunsignedchar#defineuintunsignedintucharcodeSEG7[]={0x3f,...
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
uchar code SEG7[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
void delay(uint k)
{
uint i,j;
for(i=0;i<k;i++){
for(j=0;j<121;j++)
{;}}
}
void main(void)
{
uint a,b,sum;
a = 200;
b = 44;
sum = a + b;
while(1)
{
P0=SEG7[sum/100];
P2=0xfb;
delay(1);
P0=SEG7[(sum%100)/10];
P2=0xfd;
delay(1);
P0=SEG7[sum%10];
P2=0xfe;
delay(1);
}
程序的目的是实现两个数字相加的和送到数码管显示,源题目在《手把手教你单片机c程序设计》这本书上 展开
#define uchar unsigned char
#define uint unsigned int
uchar code SEG7[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
void delay(uint k)
{
uint i,j;
for(i=0;i<k;i++){
for(j=0;j<121;j++)
{;}}
}
void main(void)
{
uint a,b,sum;
a = 200;
b = 44;
sum = a + b;
while(1)
{
P0=SEG7[sum/100];
P2=0xfb;
delay(1);
P0=SEG7[(sum%100)/10];
P2=0xfd;
delay(1);
P0=SEG7[sum%10];
P2=0xfe;
delay(1);
}
程序的目的是实现两个数字相加的和送到数码管显示,源题目在《手把手教你单片机c程序设计》这本书上 展开
5个回答
展开全部
#include<reg51.h> // 包含头文件,这个文件就定义了诸如 P2 P0 ...之类的东东
#define uchar unsigned char // 把无符号字节变量定义成 uchar 这样,后面写起来方便
#define uint unsigned int // 同上
/* 定义段码,也就是你后面要在P0口上面输出的电压。
举个例子来说,第一个0x3f,当然,我不知道你是要这个是显示1还是显示0.我认为是显示0哈。
那么也就是要当把SEG7[0]赋值给P0的时候,P0上不是有8个位么,是吧,这8各位分别就是
0011 1111 (从P0.7 --->P0.0),这个地方我不知道你动不动,假设你懂的,哈哈。然后呢,数码管有7段
带个小数点(不带也可以),要构成一个0的摸样,当然是“8”的中间一笔不显示,其他都要显示出来
这样人的眼睛一看,哇塞,是0。假设你的数码是共阴的,那么,给他哪一段加高电压,那段就要亮
加低电压就不亮,所以,对应的就有6段会亮起来,中间一段和小数点就不亮,我们也就看到了0了。
uchar code SEG7[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
void delay(uint k) // 定义一个不太准的延时电路,用来程序中空跑延时用
{
uint i,j;
for(i=0;i<k;i++){
for(j=0;j<121;j++)
{;}}
}
void main(void) // 这里就是主函数了
{
uint a,b,sum; // 定义三个变量来做加法运算
a = 200;
b = 44;
sum = a + b;
while(1) // 让单片机一直在后面的大括号中跑,跑完一遍又一遍
{
P0=SEG7[sum/100]; // 把加起来的和的百位显示出来,除以了100就等于把百位后面的都搞没有了
P2=0xfb; // 你的是三位数码管,开百位的
delay(1);
P0=SEG7[(sum%100)/10]; // 同上
P2=0xfd; // 你的是三位数码管,开十位的
delay(1);
P0=SEG7[sum%10]; // 同上
P2=0xfe; // 你的是三位数码管,开个位的
delay(1);
}
#define uchar unsigned char // 把无符号字节变量定义成 uchar 这样,后面写起来方便
#define uint unsigned int // 同上
/* 定义段码,也就是你后面要在P0口上面输出的电压。
举个例子来说,第一个0x3f,当然,我不知道你是要这个是显示1还是显示0.我认为是显示0哈。
那么也就是要当把SEG7[0]赋值给P0的时候,P0上不是有8个位么,是吧,这8各位分别就是
0011 1111 (从P0.7 --->P0.0),这个地方我不知道你动不动,假设你懂的,哈哈。然后呢,数码管有7段
带个小数点(不带也可以),要构成一个0的摸样,当然是“8”的中间一笔不显示,其他都要显示出来
这样人的眼睛一看,哇塞,是0。假设你的数码是共阴的,那么,给他哪一段加高电压,那段就要亮
加低电压就不亮,所以,对应的就有6段会亮起来,中间一段和小数点就不亮,我们也就看到了0了。
uchar code SEG7[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
void delay(uint k) // 定义一个不太准的延时电路,用来程序中空跑延时用
{
uint i,j;
for(i=0;i<k;i++){
for(j=0;j<121;j++)
{;}}
}
void main(void) // 这里就是主函数了
{
uint a,b,sum; // 定义三个变量来做加法运算
a = 200;
b = 44;
sum = a + b;
while(1) // 让单片机一直在后面的大括号中跑,跑完一遍又一遍
{
P0=SEG7[sum/100]; // 把加起来的和的百位显示出来,除以了100就等于把百位后面的都搞没有了
P2=0xfb; // 你的是三位数码管,开百位的
delay(1);
P0=SEG7[(sum%100)/10]; // 同上
P2=0xfd; // 你的是三位数码管,开十位的
delay(1);
P0=SEG7[sum%10]; // 同上
P2=0xfe; // 你的是三位数码管,开个位的
delay(1);
}
展开全部
你这个程序显示部分是采用数码管动态扫描显示来完成的。P0是段选,P2是位选。sum=244,实际显示过程是这样的:
1、让P0送出‘2’,然后P2打开百位上的数码管;
2、让P0送出‘4’,P2打开十位上的数码管;
3、让P0送出‘4’,P2打开各位上的数码管。由于人眼的视觉暂留效应,数码管扫描的比较快,你就看到是连续的数字‘244’。
至于你说的P2=0XFB,实际就是P2=1111,1011,就是让百位上的数码管导通,进行显示‘2’这个数字。
1、让P0送出‘2’,然后P2打开百位上的数码管;
2、让P0送出‘4’,P2打开十位上的数码管;
3、让P0送出‘4’,P2打开各位上的数码管。由于人眼的视觉暂留效应,数码管扫描的比较快,你就看到是连续的数字‘244’。
至于你说的P2=0XFB,实际就是P2=1111,1011,就是让百位上的数码管导通,进行显示‘2’这个数字。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
很简单的程序,我不多说,P2=0xfd;意思是把P2口的八个管脚一次赋值,用的是16进制,要换成2进制看就清楚了,0xfb二进制就是1111 1011,8个数字分别对应8个管脚!!!明白了?
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
P2=0xfd的意识就是p2口的八个管脚的数字信号分别是p2.0~p2.7=1111 1101,也就是数码管的abcdefg=1111 110,所以显示应该是零。。。。。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询