久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 7280|回復: 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

回復

使用道具 舉報

ID:164988 發表于 2020-3-27 13:09 | 顯示全部樓層
下載學習學習,STC8XXXXX芯片
回復

使用道具 舉報

ID:633321 發表于 2020-5-13 21:14 | 顯示全部樓層
下載學習一下
回復

使用道具 舉報

ID:88256 發表于 2020-6-17 22:57 | 顯示全部樓層
這是工作在內部24M模式嗎?
回復

使用道具 舉報

ID:895931 發表于 2021-3-31 16:30 | 顯示全部樓層
好像有點少例程
回復

使用道具 舉報

ID:941396 發表于 2021-6-24 13:52 | 顯示全部樓層
找一個能用的上的學習一下
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 黑人中文字幕一区二区三区 | 国产精品自产拍在线观看蜜 | 亚洲一区在线日韩在线深爱 | 日本中文字幕在线观看 | 啪啪精品 | 国产视频中文字幕在线观看 | 免费看黄色小视频 | 国产精品国色综合久久 | 久久久成人一区二区免费影院 | 精品欧美乱码久久久久久 | 亚洲一区二区视频 | 免费在线观看黄色av | 亚洲国产福利视频 | 一区二区三区四区在线 | 国产精品视频二区三区 | 一区二区在线 | 亚洲狠狠爱 | 精品国产精品三级精品av网址 | 亚洲视频在线一区 | 欧美成人精品一区二区男人看 | 中文字幕在线精品 | 欧美一区二区三区 | 国产精品久久久久久福利一牛影视 | 精品99在线 | 91麻豆精品一区二区三区 | 欧美一区二区三区视频 | 日本不卡一区二区三区 | 99精品99久久久久久宅男 | 国产午夜影院 | 久草在线视频中文 | 国产高清无av久久 | 精品亚洲一区二区三区四区五区 | 密室大逃脱第六季大神版在线观看 | 国产一区二区三区在线 | 国产一区二区影院 | 成人欧美一区二区三区视频xxx | 亚洲精品66| 久久婷婷国产香蕉 | 成人av一区 | 日日久| 久久久久国产成人精品亚洲午夜 |