回覆列表
  • 1 # 我是阿嘛

    如果你的微控制器有內部AD,可以直接將GP2D12的OUTPUT腳連線到微控制器的AD輸入端,如果沒有內部AD,需要接一塊AD轉換晶片再連線到微控制器

    下面這段程式使用了AD晶片ADC0809,微控制器是STC89C52RC.用液晶LCD1602來顯示資料,可參考.

    #include

    #include

    typedef unsigned char BYTE;

    typedef unsigned int WORD;

    typedef bit BOOL ;

    sbit rs = P2^0;

    sbit rw = P2^1;

    sbit ep = P2^2;

    sbit ST = P3^0;

    sbit OE = P3^1;

    sbit EOC = P3^2;

    sbit CLK = P3^3;

    int flag;

    delay(BYTE ms)

    { // 延時子程式

    BYTE i;

    while(ms--)

    {

    for(i = 0; i

    {

    _nop_();

    _nop_();

    _nop_();

    _nop_();

    }

    }

    }

    BOOL lcd_bz()

    { // 測試LCD忙碌狀態

    BOOL result;

    rs = 0;

    rw = 1;

    ep = 1;

    _nop_();

    _nop_();

    _nop_();

    _nop_();

    result = (BOOL)(P0 & 0x80);

    ep = 0;

    return result;

    }

    lcd_wcmd(BYTE cmd)

    { // 寫入指令資料到LCD

    while(lcd_bz());

    rs = 0;

    rw = 0;

    ep = 0;

    _nop_();

    _nop_();

    P0 = cmd;

    _nop_();

    _nop_();

    _nop_();

    _nop_();

    ep = 1;

    _nop_();

    _nop_();

    _nop_();

    _nop_();

    ep = 0;

    }

    lcd_pos(BYTE pos)

    { //設定顯示位置

    lcd_wcmd(pos | 0x80);

    }

    lcd_wdat(BYTE dat)

    { //寫入字元顯示資料到LCD

    while(lcd_bz());

    rs = 1;

    rw = 0;

    ep = 0;

    P0 = dat;

    _nop_();

    _nop_();

    _nop_();

    _nop_();

    ep = 1;

    _nop_();

    _nop_();

    _nop_();

    _nop_();

    ep = 0;

    }

    lcd_init()

    { //LCD初始化設定

    lcd_wcmd(0x38);

    delay(1);

    lcd_wcmd(0x0c);

    delay(1);

    lcd_wcmd(0x06);

    delay(1);

    lcd_wcmd(0x01); //清除LCD的顯示內容

    delay(1);

    }

    void t0() interrupt 1 using 0

    {

    CLK=~CLK; //ADC0809 CLK

    }

    void t1() interrupt 3 using 0

    {

    flag++;

    }

    main()

    {

    long int temp;

    long int temp1;

    int d100;

    int d10;

    ST=0;

    OE=0;

    TMOD=0x12;

    TH0=246;TL0=246; //50KHZ

    TH1=0;TL1=0; //50KHZ

    TR0=1;ET0=1;TR1=1;ET1=1;EA=1;

    lcd_init(); // 初始化LCD

    delay(10);

    flag=0;

    while(1)

    {

    if (flag==5)

    {

    flag=0;

    ST=1;ST=0; //給一個脈衝,上升沿暫存器復位,下降沿AD轉換開始

    while(EOC==0); //當EOC為1時,轉換結束

    OE=1; //暫存器資料輸出到D0-D7

    temp=P1;

    OE=0; //DO-D7復位

    temp1=(temp*500)/256; //AD值轉換成電壓值(V=AD*VREF/256)

    //顯示AD值

    d100=temp/100;

    lcd_pos(0x00);

    lcd_wdat(0x30+d100);

    temp=temp%100;

    d10=temp/10;

    lcd_pos(0x01);

    lcd_wdat(0x30+d10);

    temp=temp%10;

    lcd_pos(0x02);

    lcd_wdat(0x30+temp);

    //顯示電壓值

    d100=temp1/100;

    lcd_pos(0x40);

    lcd_wdat(0x30+d100);

    temp1=temp1%100;

    lcd_pos(0x41);

    lcd_wdat(0x2e);

    d10=temp1/10;

    lcd_pos(0x42);

    lcd_wdat(0x30+d10);

    temp1=temp1%10;

    lcd_pos(0x43);

    lcd_wdat(0x30+temp1);

    }

    }

    }

  • 中秋節和大豐收的關聯?
  • ag次級聯賽復仇wf失敗,蓮一打九拖不動隊友,流蘇太撈當初是否該讓夢淚出戰?