单片机,C语言写的程序,大家帮看一下

#include"reg52.h"
void main()
{
p0^0=1
p0^1=1
p0^2=1
p0^3=1
p0^4=1
p0^5=1
p0^6=1
p0^7=1
p1^0=0
p1^1=0
p1^2=0
p1^3=0
p1^4=0
p1^5=0
p1^6=0
}
这是我写的程序,我只想直接让P0口全部输出+电,P1口输出0。
大家帮帮忙。
#include"reg52.h"
void main()
{
p0^0==1
p0^1==1
p0^2==1
p0^3==1
p0^4==1
p0^5==1
p0^6==1
p0^7==1
p1^0==0
p1^1==0
p1^2==0
p1^3==0
p1^4==0
p1^5==0
p1^6==0
}
这样也不行,郁闷....
我是程序白痴...
望高手指点...
非常感谢!!

1、#include所包含的文件reg52.h是定义特殊功能寄存器和位的。
可以快捷地访问单片机的这些资源。如P0,P1……等等。
打开该文件,你可以看到若干寄存器的定义。
sfr sbit是主要的C51两个关键字。分别用来声明。
2、所有的C语句都应该用;来结束。除非特殊的约定或宏。
你的程序没有;。
3、p0是个没有定义的标识符,所以报错。这里应该使用P0。
或者,自行声明如下:
sfr p0=0x80;
sfr p1=0x90;这样就不需要包含reg52.h文件了。(0x80地址就映射了端口P0)
4、假设定义了3中的p0,p1
那么p0^0=1;
这句话还有语法的问题,可以等效理解为(以区别P0.0口)
i^0=1;左边是个表达式,把i和数据0异或。将表达式赋值是有问题的。
同理
p0^0==1;则表示判断语句。且无意义。
5、那么如何访问P0.0呢,假设定义了3.
再对端口位进行定义,用sbit port00= p0^0;
程序中就可以用 port00=1;语句来访问P0.0了。
=====================
【示范】
sfr p0=0x80;
sfr p1=0x90;
sbit p01=p0^1;
sbit p10=p1^0;
main()
{
while(1)
{
while(p10==1) p0=1;
while(!p10) p01=1;
}
}
理解上述程序。并好好理解,输入输出,寄存器定义,位定义,位寻址及赋值,端口寻址及赋值。追问

sfr p0=0x80;
sfr p1=0x90;
这里的sfr是什么意思?
0*80为什么就是P0,90为什么就是P1?望帮忙...

追答

sfr是C51的关键字。就像char是什么意思?
sfr biaozhifu=0x80;
有这句话,我们就可以用biaozhifu这个标识符来访问后面的内存地址对应的特殊功能寄存器。
P0口就是通过地址0x80来访问的。
所以sfr p0=0x80;就表明,后面可以用p0来访问单片机的地址为0x80单元的P0口了。8位。
sbit 类似。可以定义特殊功能位。
你再查一下,单片机的内存中0x90单元是啥,就能加深理解了。

追问

unsigned char code LEDDisplayCode[] = { 0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8, //0~7 0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E,0xFF};
这个是什么意思?
能详细点说明吗?详细到白痴都听得懂的...

温馨提示:答案为网友推荐,仅供参考
第1个回答  2011-05-14
#include<reg.52>
void main()
{
P0=0xff;
P1=0x00;
}

另外:
端口大写:如P0^1,等追问

不解释一下?我想学啊,跪求~~

追答

我的头文件少写了个.h #include
头文件内已经定义了端口且是用大写定义的,所以写程序时要用大写一致。
P0口包括P0^0 -----P0^7,每个都为1,所以为FF(1111 1111),用十六进制表示就是0XFF,P1口和这相同原理,
不知道能不能帮助到你.

追问

还有个问题,我用Proteus仿真的时候,链接方法是用P0输出的1接上9012驱动,再接数码管,然后,数码管的另一端就直接接P1口了,这样仿真不出来,然而我的实做(就是板子已经焊接好的)却又能全部亮(没程序的89S52能全亮)...
搞不清为什么...
如何才能在Proteus里面把数码管点亮呢?别告诉我要用非常复杂的器件,什么反向器等我是没有的。
还有,这个问题主要是想学习程序,大家可以帮我分析一下吗?我只想学会如何写程序....

追答

当硬件重新上电或复位后,初始化后所有端口是高电平,所以有可能没程序的89S52能全亮,有程序的有些端口被软件控制成低电平了,还要看你的数码管是共阳极还是共阴级的,两种点亮方式不一样。

第2个回答  2011-05-14
p0^0,这种形式,是不能直接应用在程序的正文当中的。
在C51程序中,必须在前面,使用定义式来说明:
sbit p00 = P0^0;
经过定义之后,就可以使用变量p00,来代替P0.0引脚了。
第3个回答  2011-05-14
定义的时候这样的:
sbit led1=P0^3;
sbit led2=P0^4; ...................

赋值的时候这样:
led1=0;
led2=0; ..................以此类推
第4个回答  2011-05-14
程序倒数第3行

比如5月 你sum 只进行了加前面几个月的值
+31 +28 +31 +30 少了5月的第几天.

我觉得应该是.

return(sum+abc.day);

-------------------------------------------------------
一个递归搞定

yue(m,y)
{
int s;
if(m==0) s=0;
else if(m==1||m==3||m==5||m==7||m==8||m==10) s=31+yue(m-1,y);
else if(m==4||m==6||m==9||m==11) s=30+yue(m-1,y);
else if(m==2&&(y%4==0&&y%100!=0||y%400==0)) s=29+yue(m-1,y);
else s=28+yue(m-1,y);
return(s);
}

main()
{
int c,m,d,n;
printf("shu ru nian,yue,ri:\n");
scanf("%d,%d,%d",&c,&m,&d);
if(c<0&&m<1&&m>12) printf("cuo wu");
else{n=m-1;
printf("di %d tian\n",yue(n,c)+d);}
}

且回答
sum=+30 没有这种说法.
sum+=30 是 sum=sum+30
sum=+30 那么sum=30了 自然不对了.

--------------------------------------------------
再提供一份c++代码、应该对你有启发.
可以把 月倒过来写 12 11 10 9...
代码如下:
#include <iostream.h>
void compute_number_of_days(int y,int m,int d,int &no_of_days)
{
no_of_days=0;
switch(m)
{
case 12:no_of_days+=30;
case 11:no_of_days+=31;
case 10:no_of_days+=30;
case 9:no_of_days+=31;
case 8:no_of_days+=31;
case 7:no_of_days+=30;
case 6:no_of_days+=31;
case 5:no_of_days+=30;
case 4:no_of_days+=31;
case 3:
if(((y%4)==0&&(y%100)!=0)||((y%100)==0&&(y%400)==0))
no_of_days+=29;
else
no_of_days+=28;
case 2:no_of_days+=31;
case 1:no_of_days+=d;
}
}

void main()
{
int year,month,day;
int numberOfDay;
char more='y';
while(more=='y')
{
cout<<"please input the date of the day:\n";
cin>>year>>month>>day;
compute_number_of_days(year,month,day,numberOfDay);
cout<<"It's the"<<numberOfDay<<"day of the year"<<endl;
cout<<"continue:y/n?\n";
cin>>more;
}
}