欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136
標題:
使用PCF8591進行ADDA轉換 電路圖+程序
[打印本頁]
作者:
piaolin
時間:
2015-10-29 17:39
標題:
使用PCF8591進行ADDA轉換 電路圖+程序
本帖最后由 piaolin 于 2015-10-29 17:45 編輯
1.電路圖
2.AD轉換
//AD轉換,P0口連接J12(數碼管)
//功能:通過轉動滑動變阻器改變模擬輸入
//通過AD轉換,把數值用數碼管顯示
#include <reg51.h>
#define uchar unsigned char
#define uint unsigned int
#define PCF8591 0x90 //PCF8591 地址
bit write=0; //寫24c02的標志
sbit SCL=P2^1; //串行時鐘輸入端
sbit SDA=P2^0; //串行數據輸入端
sbit LS138A=P2^2;//138譯碼器的3位 控制數碼管的
sbit LS138B=P2^3;
sbit LS138C=P2^4;
uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //數顯管字模
void delay() //延時4-5個微秒
{;;}
void delay_1ms(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--)
;
}
void start()//開始信號
{
SDA=1;
delay();
SCL=1;
delay();
SDA=0;
delay();
}
void stop() //停止信號
{
SDA=0;
delay();
SCL=1;
delay();
SDA=1;
delay();
}
void respons()//應答 相當于一個智能的延時函數
{
uchar i;
SCL=1;
delay();
while((SDA==1)&&(i<250))
i++;
SCL=0;
delay();
}
void init() //初始化
{
SDA=1;
delay();
SCL=1;
delay();
}
uchar read_byte()
{
uchar i,k;
SCL=0;
delay();
SDA=1;
delay();
for(i=0;i<8;i++)
{
SCL=1;
delay();
k=(k<<1)|SDA;//先左移一位,再在最低位接受當前位
SCL=0;
delay();
}
return k;
}
void write_byte(uchar date) //寫一字節數據
{
uchar i,temp;
temp=date;
for(i=0;i<8;i++)
{
temp=temp<<1; //左移一位 移出的一位在CY中
SCL=0; //只有在scl=0時sda能變化值
delay();
SDA=CY;
delay();
SCL=1;
delay();
}
SCL=0;
delay();
SDA=1;
delay();
}
void write_add(uchar control,uchar date)
{
start();
write_byte(PCF8591); //10010000 前四位固定 接下來三位全部被接地了 所以都是0 最后一位是寫 所以為低電平
respons();
write_byte(control);
respons();
write_byte(date);
respons();
stop();
}
uchar read_add(uchar control)
{
uchar date;
start();
write_byte(PCF8591);
respons();
write_byte(control);
respons();
start();
write_byte(PCF8591+1); //把最后一位變成1,讀
respons();
date=read_byte();
stop();
return date;
}
void display(uchar ge,uchar shi,uchar bai)
{
P0=0xff;
LS138A=1; //第一位
LS138B=1;
LS138C=1;
P0=table[ge];
delay_1ms(5);
P0=0xff;
LS138A=0; //第二位
LS138B=1;
LS138C=1;
P0=table[shi];
delay_1ms(5);
P0=0xff;
LS138A=1; //第三位
LS138B=0;
LS138C=1;
P0=table[bai];
delay_1ms(5);
}
void main()
{
uchar num,ge,shi,bai;
init();
while(1)
{
display(ge,shi,bai);
num=read_add(0x40);
ge=num;
num/=10;
shi=num;
num/=10;
bai=num;
}
}
復制代碼
3.DA轉換
//I2C總線很強大
//程序功能:通過DA轉換把輸出電壓逐漸增大,使加在上面的發光二級管慢慢變亮
// 到最亮后再變暗,如此循環
#include <reg51.h>
#define uchar unsigned char
#define uint unsigned int
#define PCF8591 0x90 //PCF8591 地址
sbit SCL=P2^1; //串行時鐘輸入端
sbit SDA=P2^0; //串行數據輸入端
void delay() //延時4-5個微秒
{;;}
void delay_1ms(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--)
;
}
void start()//開始信號
{
SDA=1;
delay();
SCL=1;
delay();
SDA=0;
delay();
}
void stop() //停止信號
{
SDA=0;
delay();
SCL=1;
delay();
SDA=1;
delay();
}
void respons()//應答 相當于一個智能的延時函數
{
uchar i;
SCL=1;
delay();
while((SDA==1)&&(i<250))
i++;
SCL=0;
delay();
}
void init() //初始化
{
SDA=1;
delay();
SCL=1;
delay();
}
void write_byte(uchar date) //寫一字節數據
{
uchar i,temp;
temp=date;
for(i=0;i<8;i++)
{
temp=temp<<1; //左移一位 移出的一位在CY中
SCL=0; //只有在scl=0時sda能變化值
delay();
SDA=CY;
delay();
SCL=1;
delay();
}
SCL=0;
delay();
SDA=1;
delay();
}
void write_add(uchar control,uchar date)
{
start();
write_byte(PCF8591); //10010000 前四位固定 接下來三位全部被接地了 所以都是0 最后一位是寫 所以為低電平
respons();
write_byte(control);
respons();
write_byte(date);
respons();
stop();
}
void main()
{
uchar a;
init();
while(1)
{
write_add(0x40,a);
delay_1ms(5);
a++;
if(a>250)
a=0;
}
}
復制代碼
I2C總線的用法請參閱我的前一篇文章:
http://m.raoushi.com/bbs/dpj-39852-1.html
作者:
qxw199586
時間:
2017-4-22 13:34
很給力!!
作者:
玩世不恭11
時間:
2018-11-20 02:04
贊一個!樓主大愛你
作者:
mt6639
時間:
2019-1-25 15:27
謝謝大佬
歡迎光臨 (http://m.raoushi.com/bbs/)
Powered by Discuz! X3.1