本帖最后由 gdmgb520 于 2009-11-2 11:36 编辑
#include <reg52.h>
#include <stdio.h>
#include <intrins.h>
#include <string.h>
#include <math.h>
#define uchar unsigned char
#define uint unsigned int
sbit A1=P0^0;
sbit A2=P0^1;
sbit A3=P0^2;
sbit A4=P0^3;
sbit A5=P0^4;
sbit A6=P0^5;
sbit s_led1=P0^6;
sbit s_led2=P0^7;
uchar dat[40]={255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255};
/***************************************************/
/*函数名称:5Ms延时
/*函数功能:
/*调用函数:无
/***************************************************/
void Delay5Ms(void)
{
unsigned int TempCyc = 5552;
while(TempCyc--);
}
/***************************************************/
/*函数名称:串口和定时器0初始化
/*函数功能:
/*调用函数:无
/***************************************************/
void InitSystem(void)
{
SCON = 0x50; //串口工作在方式1;允许接收
PCON = 0x00; // 波特率不*2
TMOD = 0x21; //定时器1工作在方式2,自动重装 //定时器0工作在方式1
TH1 = 0xFD; // 波特率为9600
TR1 = 1; // 定时器1启动计数
ES = 1; // 串口开中断
EA = 1; // 开总中断
// PS=0; //串口低中断优先级
PT0=1; //定时器T0高中断优先级
TR0=1; //启动定时器0
ET0=1; //开定时器0中断
}
/***************************************************/
/*函数名称:串口字节发送
/*函数功能:
/*调用函数:无
/***************************************************/
void Send_Char_Com(uint ch)
{
SBUF=ch;
while(TI==0); //TI为发送中断请求标志,在一帧数据发送完后被置位。所以该语句的意思是等待数据发送完成,即一直等到TI=1
TI=0; //在任何方式中TI都必须由软件清零
}
/***************************************************/
/*函数名称:数据采集
/*函数功能:每被调用进行一次数据采集
/*调用函数:无
/***************************************************/
void DataAcquisition(void)
{
static uint i=0; //定义一个静态变量作为计数器
if ((i & 0x01)!=0) //送地址,地址范围0x00--0x27(0-39)。
A1=1;
else
A1=0;
if ((i & 0x02)!=0)
A2=1;
else
A2=0;
if ((i&0x04)!=0)
A3=1;
else
A3=0;
if ((i&0x08)!=0)
A4=1;
else
A4=0;
if ((i&0x10)!=0)
A5=1;
else
A5=0;
if ((i&0x20)!=0)
A6=1;
else
A6=0;
P2=0xff; //读取P2口数据
dat=(P2 & dat); //低电平——动作,原来为零的位不管新数据是否为零都写零
i++;
if (i==40) //判断是否完成一次采集循环,当然在这种方式下完全可以不定义数组,
{
i=0;
}
}
/***************************************************/
/*函数名称:数据处理
/*函数功能:
/*调用函数:
/***************************************************/
void DataProcessing(void) //!!!!针对一次采集的数据处理
{
uchar j,k,temp;
uint num=0;
// uchar t=0;
for (j=0;j<40;j++)
{
temp=0x01;
for (k=0;k<8;k++)
{
//temp=0x01<<k;
if ((dat[j] & temp)==0) //节点有低电平时认为产生动作
{
num=j+k*40+1;
Send_Char_Com(num);
// Delay400Ms();
}
temp=temp<<1;
}
}
}
/***************************************************/
/*函数名称:定时器0中断
/*函数功能:每中断一次进行一次数据采集
/*调用函数:DataAcquisition()
/***************************************************/
void Timer0 (void) interrupt 1
{
TH0=0x4c;
TL0=0x00; //直接赋值,50ms中断
s_led2=~s_led2;
DataAcquisition();
}
/************************************************/
/*----------------主函数------------------------*/
/************************************************/
void main ()
{
InitSystem(); //初始化定时器0
while(1)
{
DataProcessing();
s_led1=~s_led1;
Delay5Ms();
}
}
我在debug模式下,当运行到77行时dat[0]的值莫名其妙地变成了0x00,本来应该是0xfe的。
哦,介绍一下我的程序。P0口0~5送地址,P2口采集数据(高电平或低电平)。大家能不能帮我看看问题出在哪里!
谢谢!
下面是我的C文件,我用的KeilC。 |