找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2326|回復(fù): 0
打印 上一主題 下一主題
收起左側(cè)

AD,看了論壇里的教程,仿真下,但沒反應(yīng)

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:111517 發(fā)表于 2016-5-3 17:40 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
lcd正常的(注釋實在弄不出來,我一直對keil里的字符編碼不知怎么弄),代碼如下:
#include<reg52.h>
#include<math.h>
#include<intrins.h>

#define uint unsigned int
#define uchr unsigned char


void PrintError1();
void LcdDisstr(uchr *p);

sbit EN=P1^2;
sbit RS=P1^0;
sbit RW=P1^1;
sbit SDA=P1^3;
sbit SCL=P1^4;

uchr code error1a[]="Sorry! Device w-";
uchr code error1b[]="ith no response!";
uchr code str1[16];

uint Intime=0;

uchr T0RH;
uchr T0RL;

bit flag=0;
void delay1ms(uint x)
{
        uchr i;
        uint j;
        for(j=0;j<x;j++)
                for(i=0;i<110;i++);
}


void delaynus()
{
        _nop_();
        _nop_();
        _nop_();
}
void Wcom16(uchr com)                    //1602D′Ö¸áî
{
        RS=0;
        RW=0;
        P2=com;
        EN=1;
        delay1ms(5);
        EN=0;
}
void Wdat16(uchr dat)
{
        RS=1;
        RW=0;
        P2=dat;
        EN=1;
        delay1ms(5);
        EN=0;
}

void Init16()
{
        EN=1;
        Wcom16(0x38);
        Wcom16(0x0c);
        Wcom16(0x06);
        Wcom16(0x01);
}

void lcdtest()
{
        Wcom16(0x80);
        Wdat16('t');
        Wdat16('e');
        Wdat16('s');
        Wdat16('t');
        Wdat16('!');
}
/************************************
I2C2¿·Ö
*************************************/
void I2cStart()
{
        SDA=1;
        SCL=1;//     è·±£SDAoíSCLÎa1
        delaynus();
        SDA=0;
        delaynus();
        SCL=0;
}

void I2cStop()
{
        SCL=0;            //ê×Ïèè·±£SDAoíSCL¶¼êÇμíμçÆ½
        SDA=0;
        delaynus();
        SCL=1;             //Ïèà-¸ßSCL£¬Ôùà-¸ßSDA£»
        delaynus();
        SDA=1;
        delaynus();
}

bit I2cWrite(uchr dat)     //¸ßλÔúǰ£¬μíλÔúoó
{
        bit ask;
        uchr i;
        for(i=0x80;i!=0;i>>=1)
        {
                if((dat&i)==0)
                        SDA=0;
                else
                        SDA=1;
                delaynus();
                SCL=1;
                delaynus();
                SCL=0;       
        }
        SDA=1;
        delaynus();
        SCL=1;
        delaynus();
        ask=SDA;
        delaynus();
        SCL=0;
        return (~ask);
}
uchr I2cReadN()        //I2c×üÏß¶á2ù×÷£¬2¢·¢Ëí·Çó|′eDÅoÅ
{
        uchr mask;
        uchr dat;
       
        SDA=1;
        for(mask=0x80;mask!=0;mask>>=1)
        {
                delaynus();
                SCL=1;
                if(SDA==0)
                        dat&=~mask;
                else
                        dat|=mask;     //Îa1ê±£¬datÖD¶Ôó|λÖÃ1
                delaynus();
                SCL=0;
        }
        SDA=1;       //8λêy¾Y·¢Ëííêoó£¬à-¸ßSDA£¬·¢Ëí·Çó|′eDÅoÅ
        delaynus();
        SCL=1;
        delaynus();
        SCL=0;
       
        return dat;
}


uchr I2cReadA()        //I2c×üÏß¶á2ù×÷£¬2¢·¢Ëíó|′eDÅoÅ
{
        uchr mask;
        uchr dat;
       
        SDA=1;
        for(mask=0x80;mask!=0;mask>>=1)
        {
                delaynus();
                SCL=1;
                if(SDA==0)
                        dat&=~mask;
                else
                        dat|=mask;     //Îa1ê±£¬datÖD¶Ôó|λÖÃ1
                delaynus();
                SCL=0;
        }
        SDA=0;       //8λêy¾Y·¢Ëííêoó£¬à-¸ßSDA£¬·¢Ëíó|′eDÅoÅ
        delaynus();
        SCL=1;
        delaynus();
        SCL=0;
       
        return dat;
}

void PrintError1()
{
        uchr i;
        Wcom16(0x80);
        for(i=0;i<16;i++)
        {
                Wdat16(error1a);
                delay1ms(5);
        }
        Wcom16(0xc0);
        for(i=0;i<16;i++)
        {
                Wdat16(error1b);
                delay1ms(5);
        }
}

uchr GetadcNum(uchr chn)
{
        uchr num=3;
        I2cStart();
        if(!I2cWrite(0x90))
        {
                PrintError1();
                I2cStop();
                return 0;
        }
        I2cWrite(0x40|chn);
        I2cStart();
        I2cWrite(0x91);
        I2cReadA();
        num=I2cReadN();
        I2cStop();

        return num;
}

void NumtoStr(uchr *p,uchr num)
{
        num=(num*50)/255;   //òto¬ò»Î»ê®½øÖÆD¡êy
        p[0]=(num/10)+'0';  //Õûêy2¿·Ö
        p[1]='.';           //D¡êyμã
        p[2]=(num%10)+'0';
        p[3]='v';
        p[4]='\0';
        LcdDisstr(p);
        while(1);       
}

void SetT0(uint ms,uchr x,uchr mode)
{
    unsigned long tmp;

    tmp = x*1000000 / 12;      //¶¨ê±Æ÷¼ÆêyÆμÂê
    tmp = (tmp * ms) / 1000;  //¼ÆËãËùDè¼ÆêyÖμ=ÿÃëÖóÆμÂê*Ãëêy£¨òaÇóμÄmsêy/1000£©
    tmp = 65536 - tmp;        //×°ÔØÖμ
    tmp = tmp + 12;           //DTÕyÖD¶ÏÏìó|Ñóê±   ÖD¶Ïò»°ãÑóê±3-8¸öÖüÆú

    T0RH = (unsigned char)(tmp >> 8);  //×°ÔØ¼ÆêyÆ÷¸ßλ
    T0RL = (unsigned char)tmp;
          TMOD&=0xf0;
    TMOD |=mode;   //Ä£ê½ò»
    TH0 = T0RH;     //×°ÔØ3õê¼Öμ
    TL0 = T0RL;
    ET0 = 1;        //¿at0ÖD¶Ï
    TR0 = 1;        //¿aê¼¼Æê±
}

void LcdDisstr(uchr *p)
{
        uchr i;
        Wcom16(0x80);
        for(i=0;i<6;i++)
        {
                Wdat16(p);
                delay1ms(5);
        }
}

void main()
{
        uchr val;
        EA=1;
        SetT0(10,12,0x01);
        Init16();
        while(1)
        {
                        if (flag==1)
                        {
                         flag = 0;
                         val  = GetadcNum(0);                                 //¶áè¡í¨μà0μÄÖμ
                         NumtoStr(str1, val);  //½«Öμ×aÎa×Ö·û′®
                         LcdDisstr(str1);
        }
        }
}


void timer1 () interrupt 1
{
        TH0=T0RH;
        TL0=T0RL;
        Intime++;
        if(Intime>=30)
        {
                Intime=0;
                flag=1;
        }
}


哪位大神看看下,謝謝了!!


這是仿真的硬件連接
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復(fù) 返回頂部 返回列表