打印

求proteus仿真图,,

[复制链接]
1231|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
yang123456789|  楼主 | 2014-3-15 16:29 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
     #include<reg52.h>
         #define uint unsigned int
         #define uchar unsigned char
        /* sbit LSA=P2^1;
         sbit LSB=P2^2;
         sbit LSC=P2^3;         */
         sbit a1=P1^0;
         sbit a2=P1^1;
         sbit a3=P1^2;
         sbit a4=P1^3;

         sbit dq=P2^0;
         sbit beep=P2^1;
         sbit du=P3^7;

         sbit key1=P2^4; //DS18B20选择按键
     sbit key2=P2^5; //报警上下限温度设置键
     sbit key3=P2^6; //温度设置加1键
     sbit key4=P2^7; //温度设置减1键

         
         unsigned char code table[]={0x3f,0x06,0x5b,0x4f,
        0x66,0x6d,0x7d,0x07,
        0x7f,0x6f,0x00 };
        uchar code table1[]={
    0xbf,0x86,0xdb,0xcf, //共阴极数码管字型码,带小数点
    0xe6,0xed,0xfd,0x87,
    0xff,0xef,0x00};

         
        // unsigned char Data[8];
         uchar SN[3][8];
         uchar ba,sh,ge,aa,tmh,tml;
         uint max,min,ID,keycon,t,xs,m,temp1;

         void rom();
         void key(void);
         void alarm();
         void display1(int m);
         void keyselect(void);
         void increase();
         void decrease();
         void readtemp();
         uchar Ds18b20Init();
         void Ds18b20WriteByte(uchar dat);
         uchar Ds18b20ReadByte();
         void display(uchar ba,uchar sh,uchar ge,uchar aa);
         void delay1ms(uint y)
         {
                uint x;
                for( ; y>0; y--)
                {
                        for(x=110; x>0; x--);
                }
         }
     void main()
         {
          //float a;
          //int tp;
          
         // unsigned char i;
         // unsigned int j;
          
          max=40;
          min=20;
          ID=0;
          keycon=0;
          rom();
          while(1)
           {key();
            keyselect();
            Ds18b20Init();
            delay1ms(1);
            Ds18b20WriteByte(0xcc);
            Ds18b20WriteByte(0x44);//温度转换
                readtemp();
           /* Ds18b20WriteByte(0xbe);//发送读取命令

            tml=Ds18b20ReadByte();
            tmh=Ds18b20ReadByte();*/
           }
            alarm();
                ba=t/100;
        sh=t%100/10;
        ge=t%10;
        aa=xs%10;
                if(ID==0) //没有任何设定按键按下,显示温度
                {
                        display(ba,sh,ge,aa);
                }
               
       


           /*if(tp<0)
                     tp=tmh;
            tp<<=8;
            tp|=tml;
            a=tp;
                {
                  Data[0]=0x40;
                  tp=tp-1;
                  tp=~tp;
                  a=tp;
                  tp=a*0.0625*100+0.5;
                  }
                 else
                  {
                  Data[0]=0x00;
                  a=tp;
                  tp=a*0.0625*100+0.5;
                  }
             Data[1]=table[tp/10000];
             Data[2]=table[tp%10000/1000];
             Data[3]=table[tp%1000/100]|0x80;
             Data[4]=table[tp%100/10];
             Data[5]=table[tp%10];  
          
             for(i=0;i<8;i++)
                     {switch(i)
                           
                    {case(0):
                                LSA=0;LSB=0;LSC=0; break;//显示第0位
                         case(1):
                                LSA=1;LSB=0;LSC=0; break;//显示第1位
                         case(2):
                                LSA=0;LSB=1;LSC=0; break;//显示第2位
                         case(3):
                                LSA=1;LSB=1;LSC=0; break;//显示第3位
                         case(4):
                                LSA=0;LSB=0;LSC=1; break;//显示第4位
                         case(5):
                                LSA=1;LSB=0;LSC=1; break;//显示第5位
                         case(6):
                                LSA=0;LSB=1;LSC=1; break;//显示第6位
                         case(7):
                                LSA=1;LSB=1;LSC=1; break;//显示第7位       
                    }
                 P0=Data[i];
                 j=300;
                 while(j--);
                 P0=0x00;
                }*/
         }

         uchar Ds18b20Init()
         {
         uchar i;
         dq = 0;                         //将总线拉低480us~960us
         i = 70;       
         while(i--);//延时642us
         dq = 1;                        //然后拉高总线,如果DS18B20做出反应会将在15us~60us后总线拉低
         i = 0;
         while(dq)        //等待DS18B20拉低总线
                {
                        delay1ms(1);
                        i++;
                        if(i>5)//等待>5MS
                        {
                                return 0;//初始化失败
                        }
               
                }
         return 1;//初始化成功
         }
       
     void Ds18b20WriteByte(uchar dat)
         {
                uint i, j;
                for(j=0; j<8; j++)
                {
                        dq = 0;                       //每写入一位数据之前先把总线拉低1us
                        i++;
                        dq = dat & 0x01;  //然后写入一个数据,从最低位开始
                        i=6;
                        while(i--); //延时68us,持续时间最少60us
                        dq = 1;        //然后释放总线,至少1us给总线恢复时间才能接着写入第二个数值
                        dat >>= 1;
                }
         }

    uchar Ds18b20ReadByte()
         {
                uchar byte, bi;
                uint i, j;       
                for(j=8; j>0; j--)
                {
                        dq = 0;//先将总线拉低1us
                        i++;
                        dq = 1;//然后释放总线
                        i++;
                        i++;//延时6us等待数据稳定
                        bi = dq;         //读取数据,从最低位开始读取
                        /*将byte左移一位,然后与上右移7位后的bi,注意移动之后移掉那位补0。*/
                        byte = (byte >> 1) | (bi << 7);                                                  
                        i = 4;                //读取完之后等待48us再接着读取下一个数
                        while(i--);
                }                               
                return byte;
         }
        void readtemp()
         {
                uchar i,j;
                uchar tml,tmh,t;
                i=0;
                if(keycon==0) //按键寻址,选择要显示的检测器件
                        {
                        j=1;
                        }
                if(keycon==1)
                        {
                        j=2;
                        }
                if(keycon==2)
                        {
                        j=3;
                        }
                Ds18b20Init(); //复位
                delay1ms(1000); //延时
                Ds18b20WriteByte(0x55); //发送ROM匹配命令
                for(i=0;i<8;i++)
                        {
                        Ds18b20WriteByte(SN[j][i]); //发送64位序列号
                        }
                Ds18b20WriteByte(0xbe); //发送读取命令
                tml=Ds18b20ReadByte(); //读取温度值低位
                tmh=Ds18b20ReadByte(); //度取温度值高位
                tmh=(i<<4)&0x7f; //屏蔽最高位(一位符号位)
                tml=tml>>4; //低位右移,舍弃小数位。
                t=tmh|tml; //实际温度整数部分
                temp1=tml&0x0f;
                xs=temp1*0.0625*10; //小数部分,若为0.5则算为了5来显示
        }
        void key(void)
        {
          do
          {
                if(key2==0) //判断SET键是否按下
                {
                        delay1ms(20); //延时去抖
                        if(key2==0)
                        {
                        ID++;
                        if(ID>=3)
                                {
                                ID=0;
                                }
                        while(key2==0);
                        }
                }
                if(ID==1) //ID=1进入报警温度上限值设定
                {
                display1(max); //显示报警温度上限值
                   if(key3==0)
                        {
                        delay1ms(20);
                        if(key3==0) //判断加1键是否按下
                                {
                                increase(); //加"1"
                                display1(max); //重新显示报警温度上限值
                                }
                        while(key3==0);
                        }
                   if(key4==0)
                   {
                   delay1ms(20);
                   if(key4==0) //判断减1键是否按下
                                {
                                decrease(); //减"1"
                                display1(max); //重新显示报警温度上限值
                                }
                    while(key4==0); //知道释放按键,退出循环
                   }
                }
                if(ID==2) //ID=2进入报警温度下限值设定
                {
                 display1(min); //重新显示报警温度下限值
                  if(key3==0)
                   {
                    delay1ms(20);
                    if(key3==0) //判断加1键是否按下
                       {
                       increase(); //加"1"
                       display1(min);
                       }
                    while(key3==0);
                   }
                  if(key4==0)
                   {
                    delay1ms(20);
                    if(key4==0) //判断减1键是否按下
                           {
                                decrease(); //减"1"
                                display1(min); //重新显示报警温度下限值
                           }
                     while(key4==0);
                   }
                }
          }
          while(ID==0); //进入循环,知直到D=0,即SET按键要按第三下才能退出该温度设定程序
        }
    void rom()
        {
        uchar sn1; //以下是定义8个序列号变量
        uchar sn2;
        uchar sn3;
        uchar sn4;
        uchar sn5;
        uchar sn6;
        uchar sn7;
        uchar sn8;
       
        Ds18b20Init(); //复位
        delay1ms(1000); //延时1S
        Ds18b20WriteByte(0x33); //发送读序列号子程序
        sn1=Ds18b20ReadByte(); //读取第一个序列号,
        sn2=Ds18b20ReadByte(); //读取第二个序列号
        sn3=Ds18b20ReadByte();
        sn4=Ds18b20ReadByte();
        sn5=Ds18b20ReadByte();
        sn6=Ds18b20ReadByte();
        sn7=Ds18b20ReadByte();
        sn8=Ds18b20ReadByte();
        }
        void keyselect(void)
        {
        keycon=0; //器件选择标志位
        if(key1==0)
                {
                delay1ms(20);
                if(key1==0)
                        {
                        keycon++; //通过器件选择按键自加,标志位值代表三个不同器件
                        if(keycon>=3)
                                        {
                                        keycon=0;
                                        }
                        while(key1==0);
                        }
                }
        }
        void increase()
        {
                if(ID==1)
                {
                        max++;
                        if(max>=70) //设定上限温度不得超过70,超过就默认为70
                        {
                        max=70;
                        }
                }
                if(ID==2)
                {
                        if(min<max-10)
                    {
                      min++;
                        }
                        else
                        {
                        min=max-10;
                        }
                }
        }
        void decrease()
        {
                if(ID==1)
                {
                        if(max<min+10)
                        {
                        max--;
                        }
                        else
                        {
                        max=min+10;
                        }
                }
                if(ID==2)
                {
                        min--;
                        if(min<=0) //下限设定不得低于0,若低于就默认为0
                        {
                        min=0;
                        }
                }
        }
        void alarm()
        {
                beep=1;
                if(t>=max) //温度大于设定最大值进入报警循环
                        {
                        beep=0; //打开蜂鸣器
                        delay1ms(500); //延时
                        beep=1; //关闭蜂鸣器
                        delay1ms(500); //延时
                        }
                if(t<=min) //温度小于设定最小值进入报警循环
                        {
                        beep=0;
                        delay1ms(500);
                        beep=1;
                        delay1ms(500);
                        }
        }
        void display1(int m)
        {
        a1 = a2 = a3 = a4 = 1;
       
        /*P0 = 0xff;
        P0 = table[11];
        a1 =0;
        delay1ms(1);
        P0 = 0xff;
        a1 =1;
        P0=0xfe;
        a1 =0;
        delay1ms(2);
       
       
       
        P0 = 0xff;
        P0 = table[T/10];
        a2 =0;
        delay1ms(1);
        P0 = 0xff;
        a2 =1;
        P0=0xfd;
        a2 =0;
        delay1ms(2);*/
       
        du=1; //段选打开,让十位要显示字符的代码传到所有位中
        P0=table[m/10];
        du=0;
        delay1ms(1);
        P0=0xff;
        a2=0; //位选打开,选择第二个数码管,即十位显示
        P0=0xfd;

       
        delay1ms(2);
       
        /*P0 = 0xff;
        P0 = table[T%10];
        a3 =0;
        delay1ms(1);
        P0 = 0xff;
        a3 =1;
        P0=0xfb;
        a3 =0;
        delayms(2);         */
       
        du=1; //段选打开,让个位要显示字符的代码传到所有位中
        P0=table1[m%10];
        du=0;
        delay1ms(1) ;
        P0=0xff;
        a3=0; //位选打开,选择第三个数码管,即个位显示
        P0=0xfb;

        delay1ms(2);
       
        /*P0 = 0xff;
        P0 = table[1];
        a4 =0;
        delay1ms(1);
        P0 = 0xff;
        a4 =1;
        P0=0xf7;
        a4 =0;
        delay1ms(2);*/
       
        du=1; //段选打开,让小数位要显示字符的代码传到所有位中
        P0=table[1]; //小数位一直显示0
        du=0;
        delay1ms(1);
        P0=0xff;
        a4=0; //位选打开,选择第四个数码管,即小数位显示
        P0=0xf7;

       
        delay1ms(2);
       
        }
        void display(uchar ba,uchar sh,uchar ge,uchar aa)
        {
        a1=a2=a3=a4=1;
       
        P0 = 0xff;
        P0 = table[ba];
        a1 = 0;
        delay1ms(5);
       
        P0 = 0xff;
        P0 = table[sh];
        a2 = 0;
        delay1ms(5);
       
        P0 = 0xff;
        P0 = table1[ge];
        a3 = 0;
        delay1ms(5);
       
        P0 = 0xff;
        P0 = table[aa];
        a4 =0;
        delay1ms(5);
       
       
        }
         


相关帖子

沙发
four_zhg| | 2014-3-15 16:43 | 只看该作者
你可以在坛里找个proteusr的软件,然后根据程序自己搭一个
http://pan.baidu.com/share/link? ... 0&uk=1627858430

使用特权

评论回复
板凳
xiaox314| | 2014-3-17 09:10 | 只看该作者
谁会有这么合适的,这些都不难的,自己动手,很快的~

使用特权

评论回复
地板
wolension| | 2014-3-18 08:38 | 只看该作者
伸手党,贴一段不知哪来的代码,没有原理图,没有其他说明,这人懒得也太……
至少也得有个“这是我们老师提供的代码,让我们回去调试”什么之类的描术吧?
反正都是求人,不如就跟老师说,求考试通过,求毕业得了……
利用百度,学习一下那个软件自己画一下不行吗?

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

2

帖子

0

粉丝