关于SCT15单片机读IO口状态的问题 5

如题,我通过给P1.0口分别加正脉冲或负脉冲,通过读IO口的状态,进行计数,并通过1602显示99次以内的数据。但有个问题,我一直困惑,官方资料上显示,在读OI口状态时,... 如题,我通过给P1.0口分别加正脉冲或负脉冲,通过读IO口的状态,进行计数,并通过1602显示99次以内的数据。但有个问题,我一直困惑,官方资料上显示,在读OI口状态时,要先向端口写1,然后才能读准确。但我在下面的程序中,当给正脉冲时,需要向IO口写1,才能读出1的输入,当IO口输入负脉冲时,需要向IO口写0,才能读出输入0的信号状态。为什么是这样?请各位教教我。谢谢谢谢!后附程序#include <STC15F2K60S2.H>#define uchar unsigned char // 定义STC15单片机端口sbit ds=P1^0; //脉冲信号输入口sbit RS=P4^2; sbit EN=P4^1; //延时子函数。(晶振11.0592MHz)void delayms(uint xms){ uint i,j; for(i=xms;i>0;i--) for(j=850;j>0;j--); //1个循环是1毫秒}//向LCD1602写指令子函数void write_com(uchar com){ RS=0; //RS置0,向LCD发出写指令的信号 delayms(1); P0=com; //"COM"(LCD内部命令)值赋给p0口。 delayms(1); EN=1; //E置1,产生高电平的信号。 delayms(1); EN=0; //E置0,产生宽度是1ms的高脉冲信号,把命令写入LCD。 delayms(1);}//向LCD1602写数据子函数void write_data(uchar dat){ RS=1; //RS置1,向LCD发出写数据的信号。 delayms(1); P0=dat; //"dat"(LCD显示数据)值赋给p0口。 delayms(1); EN=1; //E置1,产生高电平的信号。 delayms(1); EN=0; //E置0,产生宽度是1ms的高脉冲信号,把数据写入LCD。 delayms(1);}void main(){ uchar a,b,temp=0; //设定所有I/O为准双向(弱上拉)模式 P0M1 = 0x00; P0M0 = 0x00; P1M1 = 0x00; P1M0 = 0x00; P2M1 = 0x00; P2M0 = 0x00; P3M1 = 0x00; P3M0 = 0x00; P4M1 = 0x00; P4M0 = 0x00; P5M1 = 0x00; P5M0 = 0x00; P6M1 = 0x00; P6M0 = 0x00; P7M1 = 0x00; P7M0 = 0x00; //LCD1602初始化 delayms(1); write_com(0x38); write_com(0x0c); write_com(0x06); write_com(0x01); ds=0; while(1) { P1=0X00; if(ds==1) //判断ds(P1.0口)是否加高电平 { delayms(200); //延时(去抖) P1=0X00; if(ds==1) //再次判断ds(P1.0口)是否加高电平 { temp++; } P1=0X00; while(ds==0); //等待高电平变低电平 } a=temp/10; b=temp%10; write_com(0x80); //显示脉冲次数 write_data(0x30+a); write_data(0x30+b); }}
我用的STC15W4K48S4单片机
展开
 我来答
匿名用户
2017-06-22
展开全部
首先你的程序中while循环中的程序有明显错误:
“P1=0X00;if(ds==1) //判断ds(P1.0口)是否加高电平
因为你前面定义端口:“sbit ds=P1^0; //脉冲信号输入口” 已经把P1.0定义为脉冲输入,当“P1 =0X00”时,P1.0至P1.7都变成低电平了, P1.0自然就被单片机内部控制为0电平,你后面的“if(ds==1) //判断ds”判断语句已经没有任何意义了。
单片机不能检测负电压,只能检测高低电平。
这个脉冲要从外部输入,例如用按键代替。不可以用程序本身从内部施加控制,一旦内部控制成低电平,怎么检测都是低电平。
另外,STC15W4K48S4单片机手册提到的“要先锁存为1”,指的就是这个道理,你应该这样写:“ds = 1;”,或者写:“P1 = 0xff;”,然后判断:“if(ds==1)”,就是对外部脉冲的正确判断。
如果只是外部输入脉冲,内部程序不改变端口状态,只写一次“ds = 1 ”就可以。
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式