您现在所在的是:

单片机论坛

回帖:6个,阅读:657 [上一页] [1] [下一页]
1000
sunsoncheng
文章数:109
年度积分:50
历史总积分:1000
注册时间:2010/5/25
发站内信
发表于: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;
}

9620
Kate
文章数:1123
年度积分:68
历史总积分:9620
注册时间:2002/3/24
发站内信
发表于:2012/9/27 17:37:59
#1楼
问题点: key1=1;
1000
sunsoncheng
文章数:109
年度积分:50
历史总积分:1000
注册时间:2010/5/25
发站内信
发表于:2012/9/27 21:50:43
#2楼
要确定该线是否真的低电平,不是要先置高电平,如果它接了地,一定会回低电平,再检测?

要改的话如何改呢?

谢谢
19249
pqsh 版主
文章数:7422
年度积分:1079
历史总积分:19249
注册时间:2006/8/22
发站内信
2018论坛解答高手
发表于:2012/9/28 9:33:38
#3楼
没仔细看.但一般程序试好了,是不会出问题的.
是不是硬件干扰或硬件设计问题?
如果我忘了我
请帮忙记得我
pqsh@163,326199298@v&q同号
1000
sunsoncheng
文章数:109
年度积分:50
历史总积分:1000
注册时间:2010/5/25
发站内信
发表于:2012/9/28 16:35:01
#4楼
都加了点延时,好象就行了,多谢各位
3641
yueliang150
文章数:389
年度积分:50
历史总积分:3641
注册时间:2003/4/24
发站内信
发表于:2012/10/7 23:30:06
#5楼
KEY1=1在while前初始化;
1:KEY1=1在while前初始化;
2:或者key1=1;后加个NOP延时再判断:STC单片机速度快,管脚初始化高就判断低,有可能管脚还没有反转过来;
附件
单片机、ARM产品开发设计;
小设备、夹具、治具控制器设计开发;数码管、点阵LED电子看板开发;
587
hack2012
文章数:283
年度积分:50
历史总积分:587
注册时间:2012/11/9
发站内信
发表于:2012/11/17 17:39:29
#6楼
以下是引用sunsoncheng2012/9/27 21:50:43的发言:
要确定该线是否真的低电平,不是要先置高电平,如果它接了地,一定会回低电平,再检测?

要改的话如何改呢?

谢谢
学习各种机械方面的知识,本人离心机个人小站(cnfuge.yangyang520.com),初学者前来本
楼观帖,还请大家多多指教。

关于我们 | 联系我们 | 广告服务 | 本站动态 | 友情链接 | 法律声明 | 非法和不良信息举报

工控网客服热线:0755-86369299
版权所有 工控网 Copyright©2024 Gkong.com, All Rights Reserved

78.0005