打印

请教:读单片机P0口状态,如何转换成十进制数?

[复制链接]
5495|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
hxjlm|  楼主 | 2013-2-23 14:56 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
沙发
hxjlm|  楼主 | 2013-2-23 18:42 | 只看该作者
我这个办法太麻烦,请指教再简单点的方法,谢谢!
#include<STC12C5630AD.h>
sbit DZ1=P0^0;
sbit DZ2=P0^1;
sbit DZ3=P0^2;
sbit DZ4=P0^3;//从机地址修改读入端口
uint8 xdata localAddr;//从机地址
void P0_DZ()//单片机地址设定子函数
{
        P0M0=0x0f;
        P0M1=0x00;//P0口的0.0/0.1/0.2/0.3为高阻输入
        switch (P0=0x0)
        {
                case  0x00 :     
                localAddr=00;           
                break;
      case  0x01 :                                                                 
      localAddr=01;         
      break;
                case  0x02 :     
                localAddr=02;           
                break;
      case  0x03 :                                                                 
      localAddr=03;         
      break;
                case  0x04 :     
                localAddr=04;           
                break;
      case  0x05 :                                                                 
      localAddr=05;         
      break;
                case  0x06 :     
                localAddr=06;           
                break;
      case  0x07 :                                                                 
      localAddr=07;   
      break;
                case  0x08 :     
                localAddr=08;           
                break;
      case  0x09 :                                                                 
      localAddr=09;         
      break;
                case  0x0A :     
                localAddr=10;           
                break;
      case  0x0B :                                                                 
      localAddr=11;         
      break;
                case  0x0C :     
                localAddr=12;           
                break;
      case  0x0D :                                                                 
      localAddr=13;         
      break;
                case  0x0E :     
                localAddr=14;           
                break;
      case  0x0F :                                                                 
      localAddr=15;   
      break;
      default  :             ;
}
void main()
{
        void P0_DZ()//调用从机地址读取子函数
        while(1)
        {
       
        }
}

使用特权

评论回复
板凳
dirtwillfly| | 2013-2-23 20:01 | 只看该作者
单独写个十六进制转十进制的函数不就可以了

使用特权

评论回复
地板
zaffwong| | 2013-2-25 16:28 | 只看该作者
比如P0=0x0f;如何让localAddr=16;;P

使用特权

评论回复
5
acone| | 2013-2-25 17:01 | 只看该作者
本帖最后由 acone 于 2013-2-25 17:03 编辑

一句话:localAddr = P0;如果只想要头四位:localAddr = P0 & 0x0f;

使用特权

评论回复
6
airwill| | 2013-2-25 18:06 | 只看该作者
本帖最后由 airwill 于 2013-2-25 18:07 编辑

switch (P0=0x0) 这个写法有问题哦

另外: localAddr=P0;  不就搞定了嘛
搞这么多 case

使用特权

评论回复
7
hxjlm|  楼主 | 2013-2-25 19:20 | 只看该作者
谢谢各位,我试试,是下面这个意思吧?好了和大家分享。
#include<STC12C5630AD.h>
sbit DZ1=P0^0;
sbit DZ2=P0^1;
sbit DZ3=P0^2;
sbit DZ4=P0^3;//从机地址修改端口
uint8 xdata localAddr;//从机地址
void P0_DZ()//单片机地址设定子函数
{
        P0M0=0x0f;
        P0M1=0x00;//P0口的0.0/0.1/0.2/0.3为高阻输入
    localAddr;=P0;//读取P0口状态
}
void main()
{
        void P0_DZ()//调用从机地址读取子函数
        while(1)
        {
        
        }
}

使用特权

评论回复
8
平常人| | 2013-2-25 20:26 | 只看该作者
十进制或十六进制只有在人来阅读时才有区别,让机器识别是没有区别,除非使用BCD表示法。

比如:
case  0x0C :     
       localAddr=12;           
       break;
从机器中存放方式看,0x0C或12是一样的;如果是BCD表示法,则用十六进制表示是0x12。

用二进制表示:  0x0C ==> 00001100;  0x12 ==> 00010010

使用特权

评论回复
9
hxjlm|  楼主 | 2013-2-26 10:37 | 只看该作者
/*********************************************
* 程序名 * 读地址实验
* 公司名 * 石家庄芯巢科技
* 编写人 *  何新建 
* 日  期 * 2013年2月25日
* 支  持 * STC12LE5608AD 外部11.0592MHZ晶振
* 接  口 * P1口高阻输入,读入状态确定地址号 端口高阻输入状态时是低电平0.21V,不接线读出0,如要读1,此端口直接接电源上
* 说  明 *  读出后由串口发出,串口小秘书查看正确否。实验通过(显示是十六进制)
*********************************************/
#include<STC12C5608AD.h>
#define uint    unsigned    int
uint a,b;//0~65535全局变量,定义1个可以使用本句,两个就要使用上面第二条宏定义
sbit DZ1=P1^0;
sbit DZ2=P1^1;
sbit DZ3=P1^2;
sbit DZ4=P1^3;//从机地址修改读入端口
uint xdata localAddr;//从机地址
/***************************************
P1口初始化
***************************************/
void P0_DZ()//单片机地址设定子函数
{
P1M0=0x0f;//0x0f,P1.0-P1.3高阻输入。0xf0时P1.4-P1.7高阻输入
P1M1=0x00;//
//localAddr=P0;
}
/********************************
*串行口通讯初始化*
********************************/
void initialize()//完成51初始化工作串行通信波特率初始化程序   
{   
    TMOD=0x20;//00100000设定定时器/计数器1,定时、方式2  1位起始位 8位数据 1位停止
    TH1=0xfd; //FD波特率初值9600  
    TL1=0xfd; //FD波特率重新装入值9600  
    TR1=1;   //启动定时器/计数器1
    SCON=0x50;  //01010000设置串行通信方式1 REN=1允许接收
    PCON=0x00;  //设置SMOD=0   
}
/**********************************
主函数
***********************************/
void main()
{
P0_DZ();//调用P1口初始化子函数
initialize();//调用串行口初始化函数
while(1)
{
  while(!RI);//等待接收标志位RI=1
  a=SBUF;//接收寄存器送接收缓冲区数组
  RI=0; //接收标志位清零
  localAddr=P1;
  SBUF=localAddr;//变量值送串行口发送寄存器
  while(!TI);//等待发送完成标志位TI=1
  TI=0;//清零发送标志位
}
}

使用特权

评论回复
10
hxjlm|  楼主 | 2013-2-26 10:56 | 只看该作者
本帖最后由 hxjlm 于 2013-2-26 11:17 编辑


黑线是把P1.0-P1.3任意脚接到电源上,全空时串行口小秘书显示P1口状态是0xf0.把黑线(电源正)接到P1.0脚,按一次小秘书的数据发送,返回数据是P1口最新状态,P1=0xf1,显示十进制还在郁闷中。
发送的数据没有任何意义,这里只是通知单片机重新返回1次检测到的P1口状态。

谢谢五楼的大侠,(一句话:localAddr = P0;如果只想要头四位:localAddr = P0 & 0x0f;)这句很好用
P1口空着时读出0x00,P1.0接正时显示0x01,P1.1接正时显示0x02,P1.2接正时显示0x04,P1.3接正时显示0x08。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

14

主题

117

帖子

0

粉丝