发表于:2012/9/27 16:45:24
#0楼
初学c,写下了这个程序,用于检测相应的管脚的电平状态,并将最后形成的顺序
形成一个数字发送出去
现在出现的问题是,本来程序是按要求按下key1键才会产生发送动作的,但现在是单片机在办公室上试机时没有问题,
但如果装好外围电路,就是用了几个中继器,对相应的地方进行监控.
现在是不按下按纽,它也会自动发送信号
并且是无规律的
#include<STC12C5A60S2.H>
sbit P12=P1^2; //作为0线的检查
sbit P00=P0^0; //准备1000为开始点
sbit P01=P0^1;
sbit P02=P0^2;
sbit P03=P0^3;
sbit P04=P0^4;
sbit P05=P0^5;
sbit P06=P0^6;
sbit P07=P0^7;
sbit key1=P1^0;
unsigned char SentNo;
void init(); //串口初始化子程序
void delay(unsigned int i) // 长延时 约1ms
{
unsigned int k,j;
for(k=i;k>0;k--)
for(j=1000;j>0;j--);
}
void shortdelay(unsigned int i) // 短延时 约10Us
{
unsigned int k,j;
for(k=i;k>0;k--)
for(j=10;j>0;j--);
}
void send(unsigned char ch) //串口1发送数据子程序
{
ES=0;
SBUF=ch;
while(!TI);
TI=0;
}
char panduan() //判断各指定管脚电平的子程序
{
SentNo=100;
P0=0xff; //判断先置高电平 每次都是7?是电平的问题?
P12=0x0; //0xff; //也会用到这个脚? 会用到P1口
//这里的判断总是出问题不知是何原因?每次都是07就有问题了
if(P07==0)
{ SentNo=8; return 0; }
if(P06==0)
{ SentNo=7; return 0; }
if(P05==0)
{ SentNo=6; return 0; }
if(P04==0)
{ SentNo=5; return 0; }
if(P03==0)
{ SentNo=4; return 0; }
if(P02==0)
{ SentNo=3; return 0; }
if(P01==0)
{ SentNo=2; return 0; }
if(P00==0)
{ SentNo=1; return 0; }
if(P12==0)
{ SentNo=0; return 0; } //开始点
}
main() //主程序,
{
init(); //串口初始化
delay(700); //约3秒
while(1) //这里有与没有;的差别很大 有后面的都不再执行,
{
key1=1; //置高电平用于确定是否真的接入了低电平!
if (!key1)
{
delay(1); //此结构即所谓的防抖动功能了
if(!key1)
{
delay(2) ; //加延时,看看有什么问题
panduan() ; //判断管脚的状况
send(0x55); //发送数据 '前导数
shortdelay(1); //延时约20Us
send(SentNo); //发送数据 '这个数据没有
shortdelay(1); //延时约20Us
send(0xdd); //发送数据 '结束码
delay(700); //约5秒后再检查
}
}
}
}
void init() //串口一的通讯初始化处理
{
TMOD=0x20;
SCON=0x50;
TH1=0xfd;
TL1=0xfd;
EA=1;
ES=1;
TR1=1;
}