zoukankan      html  css  js  c++  java
  • 10.03 简单的51单片机程序

    今天就写了两个程序,晚上准备去装一个linux以后方便学linux编程,收获呢就是对单片机的时序图模拟的顺利了点。。。
    贴上代码,装机去。

    #include "I2C.h"
    
    //延迟10us
    void Delay10us(void)
    {
        unsigned char a,b;
        for(b=1;b>0;b--)
            for(a=2;a>0;a--);
    }
    
    void I2cStart()
    {
        SDA=1;
        Delay10us();
        SCL=1;
        Delay10us();
        SDA=0;
        Delay10us();
        SCL=0;
        Delay10us();
    }
    
    void I2cEnd()
    {
        SDA=0;     //这里第一次写出现错误
        Delay10us();
        SCL=1;
        Delay10us();
        SDA=1;
        Delay10us();        
    }
    
    unsigned char I2cSendByte(unsigned char dat)
    {//这里没有思路,不会写
        unsigned char a=0, b=0;
        for(a=0; a<8; a++)
        {
            SDA=dat>>7;
            dat<<=1;
            Delay10us();
            SCL=1;
            Delay10us();
            SCL=0;
            Delay10us();
        }
        SDA=1;
        Delay10us();
        SCL=1;
        while(SDA)
        {
            b++;
            if(b>200)
            {
                SCL=0;
                Delay10us();
                return 0;
            }
        }
        SCL=0;
        Delay10us();
        return 1;
    }
    
    unsigned char I2cReadByte()
    {
        unsigned char a=0, dat=0;
        SDA=1;
        Delay10us();
        for(a=0; a<8; a++)
        {
            SCL=1;
            Delay10us();
            dat<<=1;
            dat|=SDA;
            Delay10us();
            SCL=0;
            Delay10us();
        }
        return dat;
    }
    
    void At24c02Write(unsigned char addr, unsigned char dat)
    {
        I2cStart();
        I2cSendByte(0xa0);
        I2cSendByte(addr);
        I2cSendByte(dat);
        I2cEnd();
    }
    
    unsigned char At24c02Read(unsigned char addr)
    {
        unsigned char num;
        I2cStart();
        I2cSendByte(0xa0);
        I2cSendByte(addr);
        I2cStart();
        I2cSendByte(0xa1);
        num=I2cReadByte();
        I2cEnd();
        return num;
    }
    #ifndef _I2C_H
    #define _I2C_H
    
    #include "reg51.h"
    
    sbit SDA=P2^0;  //把这里写成P3^0口了,以为是通过串行口来模仿I2C总线时序,导致最后写完以后调试花了1个小时
    sbit SCL=P2^1;
    
    void I2cStart();
    void I2cEnd();
    
    unsigned char I2cSendByte(unsigned char);      
    unsigned char I2cReadByte();
    
    void At24c02Write(unsigned char, unsigned char);
    unsigned char At24c02Read(unsigned char); 
    
    #endif
    #include "reg51.h"
    #include "I2C.h"
    
    typedef unsigned char u8;
    typedef unsigned int u16;
    
    sbit K1=P3^1;
    sbit K2=P3^0;
    sbit K3=P3^2;
    sbit K4=P3^3;
    
    sbit LSA=P2^2;
    sbit LSB=P2^3;
    sbit LSC=P2^4;
    
    u8 code smg[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
    char num=0;
    u8 Disp[4];
    
    void Delay(u16 i)
    {
        while(i--);
    }
    
    void KeyProc()
    {
        if(K1==0)
        {
            Delay(1000);
            if(K1==0)
                At24c02Write(1, num);
            while(!K1);
        }
        if(K2==0)
        {
            Delay(1000);
            if(K2==0)
                num=At24c02Read(1);
            while(!K2);
        }
        if(K3==0)
        {
            Delay(100);
            if(K3==0)
            {
                num++;
                if(num>255)num=0;
            }
            while(!K3);
        }
        if(K4==0)
        {
            Delay(1000);
            if(K4==0)
                num=0;
            while(!K4);
        }
    }
    
    void DataProc()
    {
        Disp[0]=smg[num/1000];
        Disp[1]=smg[num%1000/100];
        Disp[2]=smg[num%1000%100/10];
        Disp[3]=smg[num%1000%100%10];   
    }
    
    void Display()
    {
        u8 i;
        for(i=0; i<4; i++)
        {
            switch(i)
            {
                case 0: LSA=0; LSB=0; LSC=0; break;
                case 1: LSA=1; LSB=0; LSC=0; break;
                case 2: LSA=0; LSB=1; LSC=0; break;
                case 3: LSA=1; LSB=1; LSC=0; break;
            }
            P0=Disp[3-i];
            Delay(100);
            P0=0x00;
        }
    }
    
    void main()
    {
        while(1)
        {
            KeyProc();
            DataProc();
            Display();
        }
    }

    上面的程序主要是对I2C总线模拟。
    下面是对18B20数据线的传输模拟

    //mani.c
    #include "reg51.h"
    #include "temp.h"
    
    typedef unsigned char u8;
    typedef unsigned int u16;
    
    sbit LSA=P2^2;
    sbit LSB=P2^3;
    sbit LSC=P2^4;
    
    u8 code smg[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
    char num=0;
    u8 Disp[4], DisplayData[8];
    
    
    void Delay(u16 i)
    {
        while(i--);
    }
    
    void DataProc(int temp)
    {
        float tp;
        if(temp<0)
        {
            DisplayData[0]=0x40;
    
            temp-=1;
            temp=~temp;
            tp=temp;
            temp=tp*0.0625*100+0.5;
        }
        else
        {
            DisplayData[0]=0x00;
            temp=temp*0.0625*100+0.5;
        }
        Disp[1]=smg[temp/10000];
        Disp[2]=smg[temp%10000/1000];
        Disp[3]=smg[temp%10000%1000/100]|0x80;
        Disp[4]=smg[temp%100/10];   
        Disp[5]=smg[temp%100%10];
    }
    
    void Display()
    {
        u8 i;
        for(i=0; i<4; i++)
        {
            switch(i)
            {
                case 0: LSA=0; LSB=0; LSC=0; break;
                case 1: LSA=1; LSB=0; LSC=0; break;
                case 2: LSA=0; LSB=1; LSC=0; break;
                case 3: LSA=1; LSB=1; LSC=0; break;
                case 4: LSA=0; LSB=0; LSC=1; break;
                case 5: LSA=1; LSB=0; LSC=1; break;
            }
            P0=Disp[5-i];
            Delay(100);
            P0=0x00;
        }
    }
    
    void main()
    {   
        while(1)
        {
            DataProc(Ds18b20ReadTemp());
            Display();
        }
    }
    //18b20.h
    #ifndef _TEMP_H
    #define _TEMP_H
    
    #include <reg51.h>
    
    #ifndef uchar
    #define uchar unsigned char
    #endif
    
    #ifndef uint
    #define uint unsigned int
    #endif
    
    sbit DSPORT=P3^7;
    
    int Ds18b20ReadTemp();
    
    #endif
    //18b20.c
    #include "temp.h"
    
    void Delay1ms(uint y)
    {
        uint x;
        for(; y>0; y--)
        {
            for(x=110; x>0; x--);
        }
    }
    
    //1:成功; 0:失败
    uchar Ds18b20Init()
    {
        uchar i=0;
        DSPORT=0;
        i=70;
        while(i--);//642us
        DSPORT=1;
        i=0;
        while(DSPORT)
        {   
            Delay1ms(1);
            i++;
            if(i>5)
            {
                return 0;
            }   
        }
        return 1;
    }
    
    void Ds18b20WriteByte(uchar dat)
    {
        uchar i, j;
        for(j=0; j<8; j++)
        {
            DSPORT=0;
            i++;
            DSPORT=dat&0x01;
            i=6;
            while(i--);//68us
            DSPORT=1;
            dat>>=1;
        }
    }
    
    uchar Ds18b20ReadByte()
    {
        uint i, j;
        uchar bi, byte;
        for(j=8; j>0; j--)
        {
            DSPORT=0;
            i++;
            DSPORT=1;
            i++;
            i++;
            bi=DSPORT;
            byte=(byte>>1)|(bi<<7);
            i=4;
            while(i--);
        }
        return byte;
    }
    
    void Ds18b20ChangeTemp()
    {
        Ds18b20Init();
        Delay1ms(1);
        Ds18b20WriteByte(0xcc);
        Ds18b20WriteByte(0x44);
    }
    
    void Ds18b20ReadTempCom()
    {
        Ds18b20Init();
        Delay1ms(1);
        Ds18b20WriteByte(0xcc);
        Ds18b20WriteByte(0xbe); 
    }
    
    int Ds18b20ReadTemp()
    {
        int temp=0;
        uchar tmh, tml;
        Ds18b20ChangeTemp();
        Ds18b20ReadTempCom();
        tml=Ds18b20ReadByte();
        tmh=Ds18b20ReadByte();
        temp=tmh;
        temp<<=8;
        temp|=tml;
        return temp;
    }

    可以实现对温度的实时监控。
    装机去。

    起风了,努力生存
  • 相关阅读:
    (转载)如何通过Nicholas C. Zakas的面试
    (转载)Nicholas C. Zakas谈怎样才能成为优秀的前端工程师
    JavaScript程序开发(十三)—RegExp类型
    (转载)Nicholas C. Zakas如何面试前端工程师
    通用JS12——》变量、作用域与内存
    vuecli4 配置多页应用入坑详解
    事件委托
    nodejs中传入变量和格式说明符号来格式化用语
    原生js实现轮播图
    同步任务和异步任务
  • 原文地址:https://www.cnblogs.com/StivenYang/p/8441337.html
Copyright © 2011-2022 走看看