找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2293|回复: 0
打印 上一主题 下一主题
收起左侧

AD,看了论坛里的教程,仿真下,但没反应

[复制链接]
跳转到指定楼层
楼主
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空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表