用51单片机来实现对某个引脚出现高电平次数的计数 你好,冒昧求问,关于用51单片机实现对p1.1引脚出现的高电...

作者&投稿:主父具 (若有异议请与网页底部的电邮联系)
//main.c
#define uchar unsigned char
#define uint unsigned int
sbit level = P1^0;
int num,num3,num2,num1,num0;
void DelayMs(uint ms)
{
 unsigned int i,j;
 for( i = 0; i < ms; i ++ )
  for( j = 115; j > 0; j --);
}

void main()
{
 LcdReset();
 num = 0;
 while (1)
 {
  level = 0; 
  DisplayListChar(0,0,"num:",5); 
  if (level == 1)
  num++;
  num3 = (num/1000)%10;
  num2 = (num/100)%10;
  num1 = (num/10)%10;
  num0 = num%10; 
  DelayMs(20);
  DispOneChar(6,0,num3 + '0');
  DispOneChar(7,0,num2 + '0');
  DispOneChar(8,0,num1 + '0');
  DispOneChar(9,0,num0 + '0'); 
  DelayMs(20);
 }



//1602.h 

#define dataport P0  //8位数据口(硬件)
#define buly 0x80    //忙检测DB7
sbit rs=P2^6;  //寄存器选择输入端(硬件)
sbit rw=P2^5;  //读写控制输入端(硬件)
sbit e =P2^7;  //使能信号输入端(硬件)
/*****************************液晶显示头文件*******************************/
/*-------- 简易延时函数 ---------*/
void delay(unsigned int j) 
{
for(j;j>0;j--);
}
void Delay5Ms(void)
{
unsigned int TempCyc = 4552;
while(TempCyc--);
}
/*--------------延时--------*/
void Lcddelay(unsigned char MS)
{
  unsigned char i,j;
  while(MS!=0)
   { j = 4;
    while(j!=0)
     {
      i=0xf0;
      while(i!=0){i--;}
      j--;
     }
    MS--;
   }
}
/*---------------    检测lcd状态 --------------------*/
void WaitForEnable(void)
{
 dataport=0xff;
 rs=0;rw=1;Lcddelay(5);_nop_();e=1;_nop_();_nop_();
 while(dataport&buly);
 e=0;
}
/*-------------------- 写控制字  --------------*/
void LcdWriteCommand(unsigned char CMD,unsigned char AttribC)
{
 if(AttribC) WaitForEnable();
 rs=0;rw=0;_nop_();
 dataport=CMD; Lcddelay(5);_nop_();
 e=1;_nop_();_nop_();e=0;
}
/*----------   显示光标定位 ------------*/
void LocateXY(char polx,char poly)
{
 unsigned char temp;
 temp=polx&0xf;
 poly&=0x1;
 if(poly) temp|=0x40;
 temp|=0x80;
 LcdWriteCommand(temp,0);
}
/*------------ 写字符 ---------------*/
void LcdWriteLata(char lataW)
{
 WaitForEnable();
 rs=1;rw=0;_nop_();
 dataport=lataW;Lcddelay(5);_nop_();
 e=1;_nop_();_nop_();e=0;
 
}
/*-------------  在指定位置显示单个字符 -----------------*/
void DispOneChar(unsigned char x,unsigned char y,unsigned char Wlata)
{
 LocateXY(x,y);
 LcdWriteLata(Wlata);
}

/*--------- 初始化 ----------*/
void LcdReset(void)
{
 LcdWriteCommand(0x38,0);
 Lcddelay(5);
 LcdWriteCommand(0x38,0);
 Lcddelay(5);
 LcdWriteCommand(0x38,0);
 Lcddelay(5);
 LcdWriteCommand(0x38,1);// 清屏
 LcdWriteCommand(0x08,1);
 LcdWriteCommand(0x01,1);
 LcdWriteCommand(0x06,1);
 LcdWriteCommand(0x0c,1);
}
/*---------------  在指定位置显示字符串 -----------------------*/
void DisplayListChar(unsigned char X, unsigned char Y, unsigned char code *DLata,unsigned char L)
{
unsigned char i;
for(i=0;i<L;i++)
DispOneChar(X++,Y,DLata[i]);
}

刚写的,已经烧写通过了,你自己改一下那个数字显示部分!



将P1.1脚设置成输入,检测P1.1对应的寄存器状态就好了。每当从低电平变为高电平的时候,计数+1,显示在1602上就可以了。

用51单片机对输入高电平的次数进行计数~

先用反相器将高电平反相,这样就可以用外部中断计数脉冲数。可以随时返回计数值,如果想要自已控制然后看到计数值,可以再用外部中断1,按键后显示计数值。

计数很容易,但显示比较困难,因无论是数码管还是液晶屏显示占用时间都比较长,容易丢失脉冲,除非脉冲频率很低
while(1)
{
while(p1.1==0);//等待高电平来到
a++; //变量加1
display(a);//显示
while(p1.1!=0);//等待高电平过去

用计数器比较好,不占用CPU时间,但脉冲信号只能输入P3.4 和P3.5引脚 

用汇编语言编写51单片机程序时候,读引脚要先写MOV P1,#0FFH,才能读引脚...
答:MOV P1,#0FFH 这就是锁存了,P1的8个脚全为高电平了。也就是置高了,置低也是这么写,只是立即数要有0,例如 MOV P1,#0FH,这是就是高四位置低电平,低四位置高电平。读引脚是:MOV A,P1,这是读8位 也可以只读一位 没有那么多的麻烦,别听网上或书上乱讲一通,就是两条MOV指令搞定了...

我想用51单片机做一个外部计数的程序,每当高电平到来计数一次,记满5次...
答:利用 T1 / P3.5 输入(下降沿计数)初始化:TMOD = 0x60; //计数,自装载模式 TH1=256-5;TL1=256-5;TR1=1;ET1 = 1;EA = 1;...void timer1() interrupt 3 //溢出一回就把端口电平翻转一下 { P1 = ~P1;}

51单片机的晶振频率是6MHZ,由p1.1引脚输出1000HZ方波,求程序
答:/*1.用定时器T1产生一个1000Hz的方波,由p1.1引脚输出,fosc=6MHz*/ include<reg52.h> define uint unsigned int define uchar unsigned char sbit F=P1^1;void timer1_init(){ TMOD=0x10;//将定时器1设置为工作方式1 TH1=(65536-6000)/256;//定时器每加一时间为1/fsoc,定时时间为1/...

51单片机中断0引脚的作用是什么?
答:51单片机的IT0位是控制外部中断0的触发方式的。外部中断0触发方式控制位,1表示边沿触发,0表示电平触发。如果IT0设置为0,则外部中断0引脚被拉至低电平即可引发外部中断。如果IT0设置为1,则外部中断0引脚需要检测到下降沿才能引发外部中断。EX0是外部中断0的使能控制位,如果EX0设置为0,则外部中断0...

51单片机怎么通过一个管脚控制另一个管脚?
答:是引脚,不是管脚。行列式键盘,就是这种控制方法。去掉按键,把引脚直接连在一起,即可。

如图 利用51单片机引脚P1.0引接一只LED,送“0”信号时点亮灯,送“1...
答:呵呵 为你解答 1 你的程序中使用的控制引脚为P1.1与电路图中控制LED的引脚P1.0也没有对应上啊 2 修改如下:include "reg51.h"sbit P1_0=P1^0;void main(){ P1_0=0; \\ P1.0为低电平时, LED为灭 } 3 其实电路图 可以更简化和使用些 如下是常用的LED接法 P1...

51单片机晶振频率为12MHz,用定时器T1在P1.0引脚上输出周期为2秒,占 ...
答:include<reg51.h> define uchar unsigned char uchar cnt;sbit p10=P1^0;void t0isr(void) interrupt 3 { TH1=(65536-50000)/256;TL1=(65536-50000)%256;cnt++;if(cnt>=20){ cnt=0;p10=~p10;} } main(){ TMOD=0x10;TH1=(65536-50000)/256;TL1=(65536-50000)%256;TR1=1;ET1=1;E...

用C语言表示MCS-51单片机p0.0引脚连接控制东西方向红色灯?
答:在程序的前面先定义引脚,sbit ledr=P0^0;主程序中就可以用定义的引脚控制红色灯,假如是0有效点亮灯,则C语言可写成:ledr=0; //亮灯 ledr=1; //灭灯

51单片机的引脚结构和功能
答:3、控制引脚(1根)RST/VPP(Pin1):复位引脚,引脚上出现2个机器周期的高电平将使单片机复位。4、可编程输入/输出引脚(15根)P1口: 8位准双向I/O口线,P1.0~P1.7 ,共8根 P3口: 8位准双向I/O口线,P3.0~P3.5、P3.7,共7根 聪明的你一定会发现:标准51单片机有32根可编程I...

51单片机怎么控制引脚的输出电压?
答:首先你要了解芯片ML4435的作用及如何控制,可以看它的datasheet 我没用过这个芯片我一般控制直流电机都是用的H桥电路,你要知道芯片ML4435 5脚控制速度是 如何控制,如果是频率的高低,你可以用定时器来产生定时中断让单片机一个端口来接5脚,我用H桥控制速度都是调节其占空比 ...