本帖最后由 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總線的用法請參閱我的前一篇文章:http://www.raoushi.com/bbs/dpj-39852-1.html |