找回密码
 立即注册

QQ登录

只需一步,快速开始

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

STC8A8k64S4A12基础例程

  [复制链接]
回帖奖励 1 黑币 回复本帖可获得 1 黑币奖励! 每人限 1 次
跳转到指定楼层
楼主
ID:646076 发表于 2019-11-30 21:26 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
附部分程序
-----------------------------------------------------------------------------------------------------------------
IIC:
void Delay10us()                //@24.000MHz
{
        unsigned char i;

        i = 78;
        while (--i);
}
void I2C_Start()
{
        I2C_SDA=1;
        I2C_SCL=1;  //保持高电平
        Delay10us();
        I2C_SDA=0;  //SLC高电平SDA下降沿是起始信号
        Delay10us();
        I2C_SCL=0;  //SCL只有为低电平的时候SDA可以改变,SCL高电平时读取SDA
       
}
bit I2C_Write(uchar dat)
{
        bit ack;
        uchar mask;
        for(mask=0x80;mask!=0;mask>>=1)
        {
                if((mask&dat)==0)  //按位取值,最高位先取
                        I2C_SDA=0;
                else
                        I2C_SDA=1;
                Delay10us();
                I2C_SCL=1;  //从机读取SDA
                Delay10us();
                I2C_SCL=0;
        }
        I2C_SDA=1;  //释放总线,位从机产生应答做准备
        Delay10us();
        I2C_SCL=1;
        ack=I2C_SDA;  //读取产生的应答信号
        Delay10us();
        I2C_SCL=0;
        return ack;
}
void I2C_Stop()
{
        I2C_SCL=0;
        I2C_SDA=0;  //结束前都保持低电平
        Delay10us();
        I2C_SCL=1;
        Delay10us();
        I2C_SDA=1;
        Delay10us();        //防止影响到下一次的起始信号
}
bit I2C_Addresing(uchar addr)  //寻址,成功返回0否则返回1
{
        bit ack=0;
        I2C_Start();
        ack=I2C_Write(addr<<1);  //习惯上高七位时地址,lsb是读写
        I2C_Stop();
        return ack;  //返回应答信号
}
//主机从从机读取一个字节(不是最后一个字节),从机发送应答信号,主动权还在从机上
uchar I2C_ReadAck()  
{
        uchar mask;
        uchar dat;
        I2C_SDA=1;   //保持高电平
        for(mask=0x80;mask!=0;mask>>=1)  //高位到低位依次读取
        {
                Delay10us();
                I2C_SCL=1;  //拉高准备读取SDA
                if(I2C_SDA==0)
                {
                        dat&=~mask;  //SDA==dat对应位
                }
                else
                        dat|=mask;
                Delay10us();
                I2C_SCL=0;  //使从机准备下一位数据发送
        }
        I2C_SDA=0;  //拉低SDA发送应答信号,SDA控制权仍然在从机手里
        Delay10us();
        I2C_SCL=1;  //读取应答信号,从机继续向主机发送信号
        Delay10us();
        I2C_SCL=0; //准备下一位数据的发送
        return dat;
}
//主机从从机读取最后一个字节,从机发送非应答信号,将SDA主动权交给主机
uchar I2C_ReadNack()
{
        uchar mask;
        uchar dat;
        I2C_SDA=1;
        for(mask=0x81;mask!=0;mask>>=1)
        {
                Delay10us();
                I2C_SCL=1;
                if(I2C_SDA==0)
                        dat&=~mask;
                else
                        dat|=mask;
                Delay10us();
                I2C_SCL=0;
        }
        I2C_SDA=1;  //拉高SDA,发送非应答信号,将SDA主动权交给主机
        Delay10us();
        I2C_SCL=1;        //读取非应答信号,停止从机向主机发送信号
        Delay10us();
        I2C_SCL=0;
        return dat;
}

---------------------------------------------------------------------------------------------------------------
EEPROM(AT24C04)://读写单字节数据uchar E2_ReadByte(uchar addr)
{
        uchar dat;
        I2C_Start();
        I2C_Write(0x50<<1);  //起始信号+首字节(0写1读)0x50是at24c04的高七位地址
        I2C_Write(addr);  //送入要读取的地址  addr是器件中的某个存储地址
        I2C_Start();  //再次发送起始信号
        I2C_Write((0x50<<1)|0x01);  //发送器件地址+读操作
        dat=I2C_ReadNack();  //读取后就发送非应答信号停止读取
        I2C_Stop();
        return dat;
}
void E2_WriteByte(uchar addr,uchar dat)
{
        I2C_Start();
        I2C_Write(0x50<<1);  //写操作,因为接下来还要向E2里面发送数据
        I2C_Write(addr);
        I2C_Write(dat);
        I2C_Stop();
}
//读写多字节数据
void E2_ReadNByte(uchar *buf,uchar addr,uchar len)
{
        do
        {
                I2C_Start();
                if(!I2C_Write(0x50<<1))  //应答0,即从机准备ok,跳出等待
                {
                        break;
                }I2C_Stop();       
        }while(1);
        I2C_Write(addr);  //内部存储地址
        I2C_Start();
        I2C_Write((0x50<<1)|0x01);
        while(len>1)  //操作的不是最后一个字节,返回ack
        {
                *buf++=I2C_ReadAck();
                len--;
        }
        *buf=I2C_ReadNack();  //读最后一个字节,返回nack,停止读
        I2C_Stop();
}
void E2_WriteNByte(uchar *buf,uchar addr,uchar len)
{
        //等待忙信号结束???
        while(len--)  //等待写的数据从ram搬移到rom???
        {
                do
                {
                        I2C_Start();
                        if(!I2C_Write(0x50<<1))
                        {
                                break;
                        }
                        I2C_Stop();
                }while(1);
                I2C_Write(addr++);  //发送要写入数据的地址
                I2C_Write(*buf++);  //发送要写入得数据
                I2C_Stop();
        }
}
-----------------------------------------------------------------------------------------------------------------
PCF8591:
uchar GetADCValue(uchar chn)  //读取模拟信号
{
        uchar val;
        I2C_Start();
        if(I2C_Write(0x48<<1))  //pcf8591高七位地址
        {
                I2C_Stop();  //没有应答则停止
                return 0;
        }
        I2C_Write(0x40|chn);  //如果有应答位,则写入控制字节,确定写入的是哪一个通道
        I2C_Start();  //重启动
        I2C_Write(0x48<<1|0x01);  //读操作(读取模拟量)
        I2C_ReadAck();  //提供SCL时钟,时模拟量开始转换
        val=I2C_ReadNack();
        I2C_Stop();
        return val;
}
void ValueToFigure(uchar val)  //将模拟信号转化为数字
{
        val=(val*25)/255;
        str[0]=val/10;
        str[1]=val%10;  //实际电压值
        smg_dis[0]=str[0];
        smg_dis[1]=str[1];
}

--------------------------------------------------------------------------------------------------------------
DS1302:
uchar Write_Addr_Ds1302[7]={0x80,0x82,0x84,0x86,0x88,0x8a,0x8c};//写数据命令
uchar Read_Addr_Ds1302[7]={0x81,0x83,0x85,0x87,0x89,0x8b,0x8d};//读数据命令
uchar Time[7]={0x11,0x36,0x18,0x23,0x11,0x06,0x19};  //秒分时日月周年
void Write_Data_Ds1302(uchar addr,uchar dat)  //写数据
{
        uchar idata i;
          CE=0;
        _nop_();
        SCLK=0;
        _nop_();
        CE=1;
        _nop_();
        for(i=0;i<8;i++)
        {
          IO=addr&0x01;//传输最低位
                addr>>=1;//
                SCLK=1;
                _nop_();
                SCLK=0;
                _nop_();
        }
        for(i=0;i<8;i++)
        {
                  IO=dat&0x01;//传输最低位
                dat>>=1;//
                SCLK=1;
                _nop_();
                SCLK=0;
                _nop_();
        }
        CE=0;//传输数据完成
        _nop_();
}
uchar Read_Data_Ds1302(uchar addr)  //读取该地址对应的数据
{
        uchar xdata i,dat,dat1;
          CE=0;
        _nop_();
        SCLK=0;
        _nop_();
        CE=1;
        _nop_();
        for(i=0;i<8;i++)
        {
                  IO=addr&0x01;//传输最低位
                addr>>=1;//
                SCLK=1;
                _nop_();
                SCLK=0;
                _nop_();
        }
        for(i=0;i<8;i++)
        {
                  dat1=IO;//传输最低位
                //        dat>>=1;//
                dat=(dat>>1)|(dat1<<7);
                SCLK=1;
                _nop_();
                SCLK=0;
                _nop_();
        }
        CE=0;//传输数据完成
         _nop_();        //以下为DS1302复位的稳定时间,必须的。
        SCLK= 1;
        _nop_();
        IO = 0;
        _nop_();
        IO = 1;
        _nop_();
        return dat;
}
void Init_Ds1302()
{
        uchar i;
        Write_Data_Ds1302(0x8e,0x00);  //关闭写保护
        for(i=0;i<7;i++)
        {
                Write_Data_Ds1302(Write_Addr_Ds1302[i],Time[i]);
        }
}
void Read_Time_Ds1302()  //读取时钟信息
{
        uchar i;
        for(i=0;i<7;i++)
        {
                Time[i]=Read_Data_Ds1302(Read_Addr_Ds1302[i]);  //输入地址,返回数据,赋值给Time[i]
                Delay1ms();
        }
}

---------------------------------------------------------------------------------------------------------------------------



8a8k例程哒哒哒.zip

456.84 KB, 下载次数: 142, 下载积分: 黑币 -5

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏3 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:164988 发表于 2020-3-27 13:09 | 只看该作者
下载学习学习,STC8XXXXX芯片
回复

使用道具 举报

板凳
ID:633321 发表于 2020-5-13 21:14 | 只看该作者
下载学习一下
回复

使用道具 举报

地板
ID:88256 发表于 2020-6-17 22:57 | 只看该作者
这是工作在内部24M模式吗?
回复

使用道具 举报

5#
ID:895931 发表于 2021-3-31 16:30 | 只看该作者
好像有点少例程
回复

使用道具 举报

6#
ID:941396 发表于 2021-6-24 13:52 | 只看该作者
找一个能用的上的学习一下
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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