Thông báo

Collapse
No announcement yet.

lại là đếm xung dùng 89C51

Collapse
X
 
  • Lọc
  • Giờ
  • Show
Clear All
new posts

  • lại là đếm xung dùng 89C51

    anh em giúp t cái mạch đếm xung đầu vào với, làm mãi mà không được, đây có cả mạch mô phỏng và code nữa, anh em sửa hộ t với.
    Attached Files

  • #2
    Bạn chưa post Code ?

    Kích từ, điều tốc, nhiệt độ , mức dầu, bảo vệ, đo mực nước, thông báo lũ...cho nhà máy Thủy Điện

    Comment


    • #3
      ui quên mất, đây là code của em:
      #include <AT89X51.H>
      #include <math.h>
      #define clin P0_0
      #define a P1_0
      #define b P1_1
      #define c P1_2
      #define d P1_3
      #define led1 P1_4
      #define led2 P1_5
      #define led3 P1_6
      #define clock P1_7
      void delay(unsigned char ms)
      {
      int i,j;
      for(i=1;i<=ms;i++)
      for(j=1;j<=120;j++)
      {;}
      }
      void LUA_CHON_SO(unsigned char SO)
      {
      switch(SO)
      {
      case 1:
      a=1;
      b=c=d=0;
      break;
      case 2:
      a=c=d=0;
      b=1;
      break;
      case 3:
      a=b=1;
      c=d=0;
      break;
      case 4:
      c=1;
      a=b=d=0;
      break;
      case 5:
      a=c=1;
      b=d=0;
      break;
      case 6:
      b=c=1;
      a=d=0;
      break;
      case 7:
      d=1;
      a=b=c=0;
      break;
      case 8:
      a=d=1;
      b=c=0;
      break;
      case 9:
      a=b=d=1;
      c=0;
      break;
      case 0:
      a=b=c=d=0;
      break;
      default: a=b=c=d=0;break;
      }
      }
      void HIENTHI(unsigned char led,SO)
      {
      if(led==1)
      {led1=1;led2=led3=0;}
      else if(led==2)
      {led1=led3=0;led2=1;}
      else if(led==3)
      {led1=led2=0;led3=1;}
      LUA_CHON_SO(SO);
      }
      void dem_xung(unsigned char dem)
      {
      if(clock==1) {delay(100);if(clock==0) {dem=dem+1;};}
      if(dem==10) {dem=0;};
      }
      void dem_giay(unsigned char dem)
      {
      if(dem==0) HIENTHI(3,0);delay(100);
      if(dem==1) HIENTHI(3,1);delay(100);
      if(dem==2) HIENTHI(3,2);delay(100);
      if(dem==3) HIENTHI(3,3);delay(100);
      if(dem==4) HIENTHI(3,4);delay(100);
      if(dem==5) HIENTHI(3,5);delay(100);
      if(dem==6) HIENTHI(3,6);delay(100);
      if(dem==7) HIENTHI(3,7);delay(100);
      if(dem==8) HIENTHI(3,8);delay(100);
      if(dem==9) HIENTHI(3,9);delay(100);
      dem_xung(dem);
      }
      main(unsigned char dem)
      {
      dem_xung(dem);
      dem_giay(dem);
      }

      Comment


      • #4
        t đa viết code hiển thị trên lcd khác cậu hiển thị trên led 7 đoạn.nhưng chỉ khác nhau phân hiển thị thôi.còn phần đo giống nhau.đây là code t viết về đo tần số ở 3 dải tần hiển thị lcd.các bạn xem và góp ý nhé:
        #include <REGX52.H>
        #include <stdio.h>
        ////////////////////
        sbit RS=P1^0;
        sbit RW=P1^1;
        sbit EN=P1^2;
        sbit xd=P3^6;
        sbit abc=P3^4;
        ////////////////////
        char x;
        //int daitan=1;
        char so[10]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x3 9};//ma ANCII cua cac so tu 0 den 9


        void delay_01s(int a) //so giay tre = 0.1s*a
        {
        int i,j;
        TMOD=0x15;
        for(j=0;j<a;j++)
        {
        for(i=1;i<=2;i++)
        {
        TH1=-50000/256;
        TL1=-50000%256;
        TR1=1;
        while(!TF1);
        TR1=TF1=0;
        }}
        }
        /////////////////////
        void delay(unsigned long int t)
        {
        unsigned long int i;
        for(i=0;i<t;i++);
        }
        /////////////////////
        void busy_flag(void) //kiem tra co ban cua LCD
        {
        P0=0xff;
        RS=0;
        RW=1;
        do
        {
        EN=1;
        delay(10);
        EN=0;
        x=P0;
        x=x&0x80;//neu x != 0x80 thi x = x&0x80=0
        //neu x = 0x80 thi x = x&0x80 = 0x80
        }
        while(x==0x80);//cho den khi x != 0x80
        }
        /////////////////////////
        void write_command(unsigned char LCD_command)//ghi ma lenh
        {
        busy_flag();
        P0=LCD_command;
        RS=0;
        RW=0;
        EN=1;
        delay(50);
        EN=0;
        delay(50);
        }
        /////////////////////////
        void write_data(unsigned char LCD_data)//ghi du lieu(tung ky tu don le)
        {
        busy_flag();
        P0=LCD_data;
        RS=1;
        RW=0;
        EN=1;
        delay(50);
        EN=0;
        delay(50);
        }
        //////////////////////////////
        void write_string(char *s)//ghi chuoi ky tu
        {
        while(*s)
        {
        write_data(*s);
        s++;
        }
        }
        //////////////////////////////
        void write_so_nguyen(int a)//hien thi so
        {
        int d=0,i;
        char s[10];
        if(a==0)
        write_data(so[a]);
        else
        while(a!=0) //tach so can hien thi thanh cac so co 1 chu so dua vao mang s[]
        {
        s[d]=a%10;
        a=a/10;
        d++;
        }
        for(i=d-1;i>=0;i--) //ghi lan luot cac so ra man hinh
        write_data(so[s[i]]);//so[s[i]] la cac ma ANCII tuong ung voi so s[i]
        }
        ///////////////////////////////////////////
        void init(void) //khoi tao LCD
        {
        write_command(0x01);//xoa man hinh
        write_command(0x03);//
        write_command(0x38);
        write_command(0x06);
        write_command(0x0c);
        }
        /////////////////////////////
        int dotanso(int n) //dem xung trong mot khoan thoi gian nhat dinh phu thuoc vao n
        //thoi gian dem = n * 0.1s
        //do xung co tan so > 100 Hz
        {
        TMOD=0x15; //timer0 che do 1,dem xung ngoai
        TH0=TL0=0; //xoa thanh ghi
        TR0=1; //cho timer0 hoat dong
        delay_01s(n);
        TR0=0; //dung timer0
        return (TH0*256+TL0)*10/n;//tra lai gia tri cua tan so da quy doi sang he thap phan
        }
        ///////////////////////////////////////
        unsigned int dotanso2(void)
        {
        IE=0x82;
        TMOD=0x52;
        TR1=0;
        TR0=0;
        TH1=TL1=0;
        TH0=TL0=-50;
        TR0=1;
        while(abc==0);
        while(abc==1);
        TR1=1;
        while(abc==0);
        while(abc==1);
        TR1=0;
        TR0=0;
        IE=0;
        return (int)(100000/(TH1*256+TL1));
        }
        void ngatT0(void) interrupt 1
        {
        xd=~xd;
        }

        ///////////////////////////////
        ///////////////////////////////
        void main()
        {
        unsigned int f, dk;
        delay(100);
        init();
        write_command(0x01);
        write_command(0x80);
        write_string("Tan so la:");
        write_command(0xc5);
        write_string("f=");
        while(1)
        {
        dk=dotanso(1);
        if(dk>=1000)
        {
        write_command(0xc7);
        f=dk;
        write_so_nguyen(f/1000);
        write_string(".");
        write_so_nguyen((f%1000)/100);
        write_so_nguyen((f%100)/10);
        write_string(" khz ");
        }
        else
        {
        dk=dotanso(10);
        write_command(0xc7);
        if(dk>=100||dk==0)
        {
        f=dk;
        write_so_nguyen(f);
        }
        else
        {
        f=dotanso2();
        write_so_nguyen(f/10);
        write_string(".");
        write_so_nguyen(f%10);
        }
        write_string(" Hz ");
        }
        }
        }

        Comment

        Về tác giả

        Collapse

        hoasua_2005 Tìm hiểu thêm về hoasua_2005

        Bài viết mới nhất

        Collapse

        Đang tải...
        X