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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3686|回復(fù): 1
打印 上一主題 下一主題
收起左側(cè)

IIC模塊化編程,使用PCF8591輸出正弦波

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:297159 發(fā)表于 2018-7-2 13:51 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
主程序:#include<IIC.h>
sbit  SCL=P2^0;
sbit  SDA=P2^1;
uchar code Tosin[255]={                                                                  //定義code數(shù)組,放在rom中。
0x80,0x83,0x86,0x89,0x8D,0x90,0x93,0x96,
0x99,0x9C,0x9F,0xA2,0xA5,0xA8,0xAB,0xAE,
0xB1,0xB4,0xB7,0xBA,0xBC,0xBF,0xC2,0xC5,
0xC7,0xCA,0xCC,0xCF,0xD1,0xD4,0xD6,0xD8,
0xDA,0xDD,0xDF,0xE1,0xE3,0xE5,0xE7,0xE9,
0xEA,0xEC,0xEE,0xEF,0xF1,0xF2,0xF4,0xF5,
0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,
0xFD,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xFD,
0xFD,0xFC,0xFB,0xFA,0xF9,0xF8,0xF7,0xF6,
0xF5,0xF4,0xF2,0xF1,0xEF,0xEE,0xEC,0xEA,
0xE9,0xE7,0xE5,0xE3,0xE1,0xDE,0xDD,0xDA,
0xD8,0xD6,0xD4,0xD1,0xCF,0xCC,0xCA,0xC7,
0xC5,0xC2,0xBF,0xBC,0xBA,0xB7,0xB4,0xB1,
0xAE,0xAB,0xA8,0xA5,0xA2,0x9F,0x9C,0x99,
0x96,0x93,0x90,0x8D,0x89,0x86,0x83,0x80,
0x80,0x7C,0x79,0x78,0x72,0x6F,0x6C,0x69,
0x66,0x63,0x60,0x5D,0x5A,0x57,0x55,0x51,
0x4E,0x4C,0x48,0x45,0x43,0x40,0x3D,0x3A,
0x38,0x35,0x33,0x30,0x2E,0x2B,0x29,0x27,
0x25,0x22,0x20,0x1E,0x1C,0x1A,0x18,0x16,
0x15,0x13,0x11,0x10,0x0E,0x0D,0x0B,0x0A,
0x09,0x08,0x07,0x06,0x05,0x04,0x03,0x02,
0x02,0x01,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x02,
0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,
0x0A,0x0B,0x0D,0x0E,0x10,0x11,0x13,0x15,
0x16,0x18,0x1A,0x1C,0x1E,0x20,0x22,0x25,
0x27,0x29,0x2B,0x2E,0x30,0x33,0x35,0x38,
0x3A,0x3D,0x40,0x43,0x45,0x48,0x4C,0x4E,
0x51,0x55,0x57,0x5A,0x5D,0x60,0x63,0x66,
0x69,0x6C,0x6F,0x72,0x76,0x79,0x7C
};
void main()
{
                  uint i;
                I2C_init();
            while(1)
           {               
                 for(i = 255; i > 0; i--)
               {
             I2C_TransmitData(0x40, Tosin[i]);       
             //0 0-analogue output enable glag  0 0 analogue  input programming ,0 0-auto analogue increase flag 11-通道選擇位                
                   }       
           }       

}

頭文件:
#ifndef __IIC_H__
#define __IIC_H__

#include"reg52.h"
#include"intrins.h"

#define uchar unsigned char        //定義無符號字符型變量
#define uint  unsigned int  //定義無符號整型變量


void  I2C_init();         //IIC初始化
void  I2C_Start();  //IIC開始
void  I2C_Stop();         //IIC停止

void  Master_ACK(bit i); //主機發(fā)送非應(yīng)答和應(yīng)答
bit   Test_ACK();                  //從機應(yīng)答和非應(yīng)答檢測

void  I2C_send_byte(uchar byte);         //IIC發(fā)送一字節(jié)數(shù)據(jù),8位
uchar I2C_read_byte();                                //IIC讀取一字節(jié)數(shù)據(jù),8位

bit   I2C_TransmitData(uchar ADDR, DATA);   //IIC發(fā)送一字節(jié)數(shù)據(jù),給總線上的從機發(fā)送。bit返回值函數(shù)用來檢測一字節(jié)數(shù)據(jù)是否發(fā)送成功給從機。
uchar I2C_ReceiveData(uchar ADDR);          //IIC接收一字節(jié)數(shù)據(jù),從總線的從機上接收數(shù)據(jù)。uchar返回值函數(shù)用來返回從從機所讀取的一字節(jié)數(shù)據(jù)。

void delay_5us();                //5us延時函數(shù)
void delayms(uint z);        //ms級延時函數(shù)

#endif//定義結(jié)束



頭文件對應(yīng)的.c文件:
#include<IIC.h>
#include<reg52.h>
uchar device_ADDR=0x90;        //在這里可以改器件地址
sbit SCL=P2^0;
sbit SDA=P2^1;
/*I2C初始化*/
void I2C_init()       
{
        SDA = 1;
        _nop_();
        SCL = 1;
        _nop_();
}

/*I2C起始信號*/
void I2C_Start()  
{
        SCL = 1;
        _nop_();
        SDA = 1;
        delay_5us();
        SDA = 0;
        delay_5us();
}

/*I2C終止信號*/
void I2C_Stop()
{
        SDA = 0;
        _nop_();
        SCL = 1;
        delay_5us();
        SDA = 1;
        delay_5us();
}

/*主機發(fā)送應(yīng)答*/
void Master_ACK(bit i)               
{
        SCL = 0; // 拉低時鐘總線允許SDA數(shù)據(jù)總線上的數(shù)據(jù)變化
        _nop_(); // 讓總線穩(wěn)定
        if (i)         //如果i = 1 那么拉低數(shù)據(jù)總線 表示主機應(yīng)答
        {
                SDA = 0;
        }
        else         
        {
                SDA = 1;         //發(fā)送非應(yīng)答
        }
        _nop_();//讓總線穩(wěn)定
        SCL = 1;//拉高時鐘總線 讓從機從SDA線上讀走 主機的應(yīng)答信號
        delay_5us();
        SCL = 0;//拉低時鐘總線, 占用總線繼續(xù)通信
        _nop_();
        SDA = 1;//釋放SDA數(shù)據(jù)總線。
        _nop_();
}

/*檢測從機應(yīng)答*/
bit Test_ACK()
{
        SCL = 1;
        delay_5us();
        if (SDA)
        {
                SCL = 0;
                _nop_();
                I2C_Stop();
                return(0);
        }
        else
        {
                SCL = 0;
                _nop_();
                return(1);
        }
}

/*發(fā)送一個字節(jié)*/
void I2C_send_byte(uchar byte)
{
        uchar i;
        for(i = 0 ; i < 8 ; i++)
        {
                SCL = 0;
                _nop_();
                if (byte & 0x80)
                {                               
                        SDA = 1;       
                        _nop_();                                  
                }                               
                else
                {
                        SDA = 0;
                        _nop_();
                }
                SCL = 1;
                _nop_();
                byte <<= 1;        // 0101 0100B
        }
        SCL = 0;
        _nop_();
        SDA = 1;
        _nop_();
}

   /*I2C 讀一字節(jié)*/
uchar I2C_read_byte()
{
        uchar dat,i;
        SCL = 0;
        _nop_();
        SDA = 1;
        _nop_();
        for(i = 0 ; i < 8 ; i++)
        {
                SCL = 1;
                _nop_();
                if (SDA)                            
                {
                         dat |= 0x01; //
                }
                else
                {
                        dat &=  0xfe;        //1111 1110
                }
                _nop_();
                SCL = 0 ;
                _nop_();
                if(i < 7)
                {
                        dat = dat << 1;       
                }
        }
        return(dat);
}

/*I2C發(fā)送數(shù)據(jù)*/
bit I2C_TransmitData(uchar ADDR, DATA)
{
        I2C_Start();

        I2C_send_byte(device_ADDR+0);  //器件地址+0;寫入,1010,0000=0xa0.
        if (!Test_ACK())
        {
                return(0);
        }

        I2C_send_byte(ADDR);    //寫入IIC總線上的哪一個存儲單元,如果是PCF8591的話,就是控制字
        if (!Test_ACK())
        {
                return(0);
        }

        I2C_send_byte(DATA);

        if (!Test_ACK())
        {
                return(0);
        }

        I2C_Stop();
        return(1);       
}  

/*I2C接收數(shù)據(jù)*/
uchar I2C_ReceiveData(uchar ADDR)
{
        uchar DATA;
        I2C_Start();
        I2C_send_byte(device_ADDR+0);
        if (!Test_ACK())
        {
                return(0);
        }

        I2C_send_byte(ADDR); //從哪個存儲單元讀取數(shù)據(jù),例如AT24C02的話,有256個字節(jié)存儲單元(256*8=2048位。)ADDR可以是0-255之間的數(shù)。
        //如果是PCF8591的話,ADDR就是控制字,控制字假如為0000 0010.則讀取通道2上的模擬量轉(zhuǎn)化為的數(shù)字量。
        Master_ACK(0);                 //

        I2C_Start();
        I2C_send_byte(device_ADDR+1); //發(fā)送一字節(jié)從機地址,且方向為1,為寫

        if (!Test_ACK())
        {
                return(0);
        }
        DATA = I2C_read_byte();
       
        Master_ACK(0);
        I2C_Stop();
        return(DATA);       
}

/*5us延時函數(shù)*/
void delay_5us()  
{
        _nop_();
}
/*1Ms延時*/
void delayms(uint z)
{
        uint x,y;
        for(x = z; x > 0; x--)
                for(y = 114; y > 0 ; y--);
}


這是一個簡單一點的程序,以后看情況加其他波形和波形按鍵選擇。PCF8591是8位DA輸出。Vref接的+5V。希望在這里得到大家的指正,同時歡迎大家一起交流學(xué)習(xí)!


屏幕截圖(3).png (272.95 KB, 下載次數(shù): 47)

proteus仿真圖

proteus仿真圖

屏幕截圖(5).png (384.74 KB, 下載次數(shù): 47)

正弦波形圖

正弦波形圖

評分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復(fù)

使用道具 舉報

沙發(fā)
ID:297159 發(fā)表于 2018-7-2 13:54 | 只看該作者
那個數(shù)碼管模塊是不需要的。。可以不看
回復(fù)

使用道具 舉報

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

本版積分規(guī)則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 久久精品色欧美aⅴ一区二区 | 国产精品久久久久久久7777 | 亚洲一级av毛片 | 欧美一区中文字幕 | 免费国产一区二区 | 亚洲一区视频在线 | 中文字幕一区二区三区乱码在线 | 免费成人高清 | 精品久久久久一区二区国产 | 高清视频一区二区三区 | 亚洲一区中文 | 毛片一级黄色 | 久久久久久久一区 | 国内av在线 | 日本成人福利视频 | 中文字幕一区二区三区不卡 | 久久久一区二区 | 夜夜骑综合 | 亚洲第一成人影院 | 久久久久久免费看 | 国产精品特级毛片一区二区三区 | 亚洲精品国产成人 | 91性高湖久久久久久久久_久久99 | av资源中文在线 | 久久成人免费观看 | 精品国产一区久久 | 伊人一区| 久草在线青青草 | 天天操夜夜操 | 日韩欧美中文字幕在线观看 | 精品小视频 | 在线观看第一区 | 欧美久久免费观看 | 日本网站免费在线观看 | 91久久精品一区二区二区 | 天天射天天操天天干 | 成人亚洲视频 | 一区视频在线播放 | 91精品国产91久久久久久密臀 | 久久精品国产久精国产 | 人人澡人人射 |