5721|5

78

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

C8051F020的P7口数据访问? [复制链接]

高手们好,在对 c8050f020编程时,通过 sbit P7_1 = P7^1; 定义P7口,编译时 编译器通知error C146: 'P7': invalid base address,查芯片资料得知f020的高端口P4-P7不能位寻址,只能字节寻址。

  请问用什么语句定义P7口来实现对P7口的控制?

  现在要给P7.0到P7.7发送八位数据,给P6.0到P6.7发送八位地址怎么操作,请大虾们提出解决方案啊,谢谢!

最新回复

上面的程序有错误 //串口初始化 void UART0_Init(void) { SCON1 = 0x50; //选择串口方式1,波特率可变 SCON0=0101,0000 TMOD = 0x20; //选择T1,方式2,自动再装入8位计数器 TH1 = (int)TXVAL; //T1初值,根据波特率,时钟等计算. 0xF4, bps=4800bps TL1 = (int)TXVAL; ES0 = 1; //UART0中断开启 TR1 = 1; //启动定时器T1 PCON  ?= PCONVAL; //PCON=0x00,SMOD = 0 ; PCON=0x80,SMOD=1 TI0 = 1; //声明TX0就绪,可以发送 TR0 = 1; } 里面的SCON1 = 0x50; //选择串口方式1,波特率可变 SCON0=0101,0000 应该改为 SCON0 = 0x50; //选择串口方式1,波特率可变 SCON0=0101,0000 我很自信的以为UART0对应串口0,UART1对应串口1,不过看起来似乎完全不是这样的。  详情 回复 发表于 2007-10-19 14:38
点赞 关注

回复
举报

70

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
C语言提供了强大的位操作能力...

#define setP7(bit) P7 |= 0x01 << bit
#define clrP7(bit) P7 &= ~(0x01 <
 
 

回复

71

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
我是初学者,不知道这样整个字节操作对不对?

P7 = 0xf1; 这是不是就是把数据0xf1赋给P7口?赋完以后,P7.0 = 1,P7.1 = 0;....
unsigned char P;
p = P7;这两句是否能实现提取P7口的数据?
另外,如果用P7口接受发送过来的数据,怎么提取此数据,希望高手指点一二,感激不尽啊
 
 
 

回复

65

帖子

0

TA的资源

一粒金砂(初级)

4
 
P7 = 0xf1; 这是不是就是把数据0xf1赋给P7口?赋完以后,P7.0 = 1,P7.1 = 0;....
unsigned char P;
p = P7;这两句是否能实现提取P7口的数据?

.........
对,你都说对了

如果再不自信那可以先看看数据手册

分析一下管脚结构就可以哈
 
 
 

回复

68

帖子

0

TA的资源

一粒金砂(初级)

5
 
难得逮个高手,谢谢啦,呵呵,索性再问下
c8050f020有有UART0和UART1两种工作方式,且C8051F020有两个串口分别是串口0和串口1,根据原理图,串口0是P0.0和P0.1,串口1是P0.2和P0.3,现在我有以下用UART0编的串口通讯程序:
//端口初始化
void PORT_Init(void)
{
XBR0 = 0x04; //允许UART0,RX,TX连到2个端口引脚. XBR0=0000,0100
XBR1 = 0x00;
XBR2 = 0x40; //交*开关使能
P0MDOUT |= 0x03; //P0.0为推拉方式输出,即TX0,RX0所在的端口 0000,0011
P1MDOUT |=0x40; //P1.6为推拉方式输出,即LED所在的端口 0100,0000
}
//串口初始化
void UART0_Init(void)
{
SCON1 = 0x50; //选择串口方式1,波特率可变 SCON0=0101,0000
TMOD = 0x20; //选择T1,方式2,自动再装入8位计数器
TH1 = (int)TXVAL; //T1初值,根据波特率,时钟等计算. 0xF4, bps=4800bps
TL1 = (int)TXVAL;
ES0 = 1; //UART0中断开启
TR1 = 1; //启动定时器T1
PCON |= PCONVAL; //PCON=0x00,SMOD = 0 ; PCON=0x80,SMOD=1
TI0 = 1; //声明TX0就绪,可以发送
TR0 = 1;
}
//发送单个字符
void Send_Char(uchar ch)
{
SBUF0 = ch; //送入缓冲区
while(TI0 == 0); //等待发送完毕
TI0 = 0; //软件清零
}
//UART0中断服务程序. 接收字符
void UART0_ISR(void) interrupt 4 using 1
{
uchar rxch;
if(RI0) //中断标志 RI0=1 数据完整接收
{
RI0 = 0; //软件清零
rxch = SBUF0; //读缓冲
if(readCounts>=MAX_LEN)
{
readCounts = 0;
readFlag = 1;
}
trdata[readCounts] = rxch; //存入数组,供发送
readCounts++;
}
}

——————————————————————————————————————————
请问,此通讯是基于串口0的么?怎么看?如果我要将此串口通讯程序改为串口1,该如何设置?
另外,如果用UART1工作方式来进行串口1通讯又该如何修改呢?
还有一个比较重要的问题就是你刚开始是怎么学c51编程的,^_^。
此贴分虽然不多,下次另开贴。。。。。
 
 
 

回复

60

帖子

0

TA的资源

一粒金砂(初级)

6
 
上面的程序有错误
//串口初始化
void UART0_Init(void)
{
SCON1 = 0x50; //选择串口方式1,波特率可变 SCON0=0101,0000
TMOD = 0x20; //选择T1,方式2,自动再装入8位计数器
TH1 = (int)TXVAL; //T1初值,根据波特率,时钟等计算. 0xF4, bps=4800bps
TL1 = (int)TXVAL;
ES0 = 1; //UART0中断开启
TR1 = 1; //启动定时器T1
PCON  ?= PCONVAL; //PCON=0x00,SMOD = 0 ; PCON=0x80,SMOD=1
TI0 = 1; //声明TX0就绪,可以发送
TR0 = 1;
}
里面的SCON1 = 0x50; //选择串口方式1,波特率可变 SCON0=0101,0000 应该改为
SCON0 = 0x50; //选择串口方式1,波特率可变 SCON0=0101,0000
我很自信的以为UART0对应串口0,UART1对应串口1,不过看起来似乎完全不是这样的。
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/7 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表