打印

PIC16F877A有关位数组的问题

[复制链接]
3663|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 limin86918 于 2010-4-11 19:04 编辑

最近在做一个试验台挂件识别和按键指示灯操作的小项目,原来是用西门子S7-200
实现的,由于功能比较简单,BOSS(我的研究生导师)嫌PLC太贵了(总共承包了学校
8台试验台,主要是电力谐波和无功补偿方面的试验台,供本科生做实验用),要我(
申明一下,我是一名电气工程专业研一学生)用单片机去代替以节约成本。现在我的
进度到了现在这个程度:硬件电路设计完毕,并且分块功能调试成功,现在是卡在PIC16F877A编程上了,就差功能的整合了。希望各位老鸟、高手指点赐教,小弟在此
谢过了!
    现在我的问题是:试验台有八个挂件,每个挂件串入或者并入主供电线上,串并关系通过相应继电器的吸合控制,继电器控制的单片机I/O端口为:RC1,RC2,RC3,RA0,RA1,RA2,RB5,RB0(位置与挂件序号对应,如RC1控制一号挂件的串并),每次扫描挂件编码时(编码有6位,包括串并位C/B,0定义为串入,1为并入),如果检测到C/B=0,则让相应的继电器吸合。扫描的方法采用for循环,将地址从0b00~0b111扫描,我要怎么样编程在for循环中控制无规则的I/O端口呢?我的想法是把这些无规则的端口放在一个数组里,控制下标就可以实现有序控制了,但是程序报错了。请高手指点。

以下为我编写的程序,报错的(位数组定义有问题?):
#include "head.h"
uchar flag;        //自检键是否按下标志,uchar,uint在头文件中定义
uchar finish;      //自检完成标志
uchar data[8];     //定义一个8位数组存放读取的编码板数据
bit relay[12]={RC0,RC1,RC2,RC3,RA0,RA1,RA2,RB5,RB0,RB1,RB2,RB3};
//上面是继电器控制位,这样定义可以么?有位组成的数组么?
/******************************************************/
//延时子程序
void delay(uint x)   
{
uchar y;
for(;x>0;x--)
  for(y=0;y<120;y++);
}
/******************************************************/
//端口初始化子程序
void init()
{
  TRISA=0x38;   //RA<0:2>做继电器输出控制口,RA<3:5>做按键操作输入口
  TRISB=0x00;   //RB<0:2,4:5>口做继电器输出控制口,其他口做ICSP调试口
  TRISC=0xc0;   //RC<0:3>口做继电器输出控制口,RC<6:7>做RS232通讯输入端口
  TRISD=0xff;   //RD<0:6>数据总线输入口
  TRISE=0x00;   //RE<0:2>地址总线输出口
  PORTA=0x00;
  PORTB=0x00;
  PORTC=0x00;
  PORTD=0x00;
  PORTE=0x00;   //I/O端口数据初始化为零  
  ADCON1=0x06;  //A、E口为模拟输入复用口,初始化关闭A/D采样功能
  flag=0;       //是否按下自检标志初始化为零   
}
/******************************************************/
//自检数据读取、控制继电器子程序
void check()
{
  uchar num=0;   //定义数组下标
  DIS_CHECK=1;   //自检灯以一定频率闪烁
  delay(200);
  for(PORTE=0x00;PORTE<=0x07;PORTE++)  //地址线(RE<0:2>)从0b000-0b111扫描
    {
      if(LIFE&!CB)      //有挂件且C/B位为零则动作相应继电器
       relay[num+1]=1; //挂件控制继电器从第二个开始,第一个为主继电器
      data[num]=PORTD;  //读取相应数据,如没有挂件数据为零
      num++;            //下标自加
      DIS_CHECK=!DIS_CHECK;  //自检灯以一定频率闪烁
      delay(200);
    }
}
/******************************************************/
//按键指示灯控制子程序
void button_lamp()
{
if(RUN&flag)  //启动按键检测
{
  delay(35);     //延时消除按键抖动
  if(RUN&flag)
  {
            DIS_RUN=1;
   DIS_CHECK=0;
            DIS_STOP=0;
  }
        flag=0;
}
    if(STOP)       //停止按键检测
{
  delay(35); //延时消除按键抖动
  if(STOP)
  {
            DIS_RUN=0;
   DIS_CHECK=0;
            DIS_STOP=1;
  }
}
if(CHECK&DIS_STOP)    //自检按键检测
{
  delay(35);        //延时消除按键抖动
  if(CHECK&DIS_STOP)
  {
            DIS_RUN=0;
            DIS_STOP=1;
            flag=1;
            check();
  }
}
}
/******************************************************/
//主程序
void main()
{
  init();
  while(1)
    {
     button_lamp();
    }
}

头文件head.h定义:
#include<pic.h>
#define uint unsigned int
#define uchar unsigned char
#define  RUN      RA3
#define  STOP     RA4
#define  CHECK    RA5
#define DIS_STOP  RB0
#define DIS_CHECK RB1
#define DIS_RUN   RB2
#define   AB1     RE0
#define   AB2     RE1
#define   AB3     RE2
#define   BM1     RD0
#define   BM2     RD1
#define   BM3     RD2
#define   BM4     RD3
#define   BM5     RD4
#define   CB      RD5
#define   LIFE    RD6
沙发
limin86918|  楼主 | 2010-4-11 15:16 | 只看该作者
本帖最后由 limin86918 于 2010-4-11 15:52 编辑

怎么出现偷笑的表情符号了呢。。。应该是;P
   把调试中的错误报告也贴上来:

Build D:\Program Files\Microchip\programs\all_test\all_test for device 16F877A
Using driver C:\Program Files\HI-TECH Software\PICC\9.70\bin\picc.exe
Make: The target "D:\Program Files\Microchip\programs\all_test\all.p1" is up to date.
Executing: "C:\Program Files\HI-TECH Software\PICC\9.70\bin\picc.exe" -oall_test.cof -mall_test.map --summary=default --output=default all.p1 --chip=16F877A -P --runtime=default --opt=default -D__DEBUG=1 -g --asmlist "--errformat=Error   [%n] %f; %l.%c %s" "--msgformat=Advisory[%n] %s" "--warnformat=Warning [%n] %f; %l.%c %s"
(1273) Omniscient Code Generation not available in Lite mode (warning)
HI-TECH C Compiler for PIC10/12/16 MCUs (Lite Mode)  V9.70
Copyright (C) 2009 Microchip Technology Inc.
Error   [1082] D:\Program Files\Microchip\programs\all_test\all.c; 6. size of initialized array element is zero
********** Build failed! **********
出错的位置就在   bit relay[12]={RC0,RC1,RC2,RC3,RA0,RA1,RA2,RB5,RB0,RB1,RB2,RB3};
定义那里。

我查看了很多书籍没有看见将位放在数组中的。。。请高手指点,应该怎么去解决呢?迷茫中。。。

使用特权

评论回复
板凳
limin86918|  楼主 | 2010-4-11 15:49 | 只看该作者
本帖最后由 limin86918 于 2010-4-11 18:33 编辑

如果问题得到了解决我很乐意将我的一些资料发布出来,供网友们交流。在做实际的硬件之前,我用PROTEUS仿真做出了仿真模型。
由于图片不能以网络的形式引用,所以我以附件的形式上传了。

原理图说明:1.仿真中用LED代替了实际中的继电器。
                 2.项目中本来有8个挂件识别电路,由于是一样的,只是编码不同,所以  
                    只画两个。

PROTEUS.jpg (2.06 MB )

PROTEUS.jpg

使用特权

评论回复
地板
limin86918|  楼主 | 2010-4-12 23:21 | 只看该作者
看来问题比较专业,来看贴的人都吓跑了。。。
   经过一天辛苦的调试,终于调试成功了。查看了很多相关书籍,没有位数组的。还是采用很传统的if语句改写的。

使用特权

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

本版积分规则

1

主题

8

帖子

0

粉丝