|
這是C51單片機(jī)設(shè)置外部?jī)?chǔ)存24c02的程序,
由LCD1602顯示被儲(chǔ)存的電壓
51hei.png (18.61 KB, 下載次數(shù): 71)
下載附件
2020-4-17 16:39 上傳
單片機(jī)源程序如下:
- #include<reg51.h>
- #include <intrins.h>
- #include<1602.h>
- #define uchar unsigned char
- #define Address_24C02 0xA0
- #define uint unsigned int
- #define ulong unsigned long
- #define _NOP_() _nop_();_nop_();_nop_();_nop_();_nop_()/*短暫延時(shí) 4.7us*/
- sbit IIc_Sad = P2^6;
- sbit IIc_Scl = P2^7;
- static void delay1(uint a)
- {
- uint x;
- for(;a>0;a--)
- for(x=114*10;x>0;x--);
- }
- /*以下五個(gè)函數(shù)是IIc 時(shí)序函數(shù)*/
- /* 啟動(dòng)I2C 總線*/
- void IIc_start()
- {
- IIc_Sad = 1;
- IIc_Scl = 1;
- _NOP_();
- IIc_Sad = 0;
- _NOP_();
- IIc_Scl = 0;
- }
- /*停止I2C 總線*/
- void IIc_stop()
- {
- IIc_Sad = 0;
- _NOP_();
- IIc_Scl = 1;
- _NOP_();
- IIc_Sad = 1; //總線置于空閑狀態(tài)
- }
- /*IIC 初始化子程序*/
- void IIc_init()
- {
- IIc_stop(); //結(jié)束之前IIC 的操作
- IIc_Scl = 1; //總線置于空閑狀態(tài)
- IIc_Sad = 1;
- }
- /*IIC 寫一個(gè)字節(jié) 返回應(yīng)答信號(hào) 返回1 設(shè)備正常*/
- bit IIc_write_byte(uchar date)
- {
- uchar i;
- bit ack;
- for(i=8;i>0;i--)
- {
- date <<= 1;
- IIc_Scl = 0;
- IIc_Sad = CY;
- _NOP_();
- IIc_Scl = 1;
- _NOP_();
- }
- IIc_Scl = 0;
- _NOP_();
- IIc_Sad = 1;/*8 位發(fā)送完后釋放數(shù)據(jù)線,準(zhǔn)備接收應(yīng)答位*/
- _NOP_();
- IIc_Scl = 1;
- if(IIc_Sad==0)//從機(jī)設(shè)備應(yīng)答 ack=1
- ack = 1;
- else
- ack = 0;
- IIc_Scl = 0;
- _NOP_();
- return(ack);
- }
- /*IIC 讀一個(gè)字節(jié) 主機(jī)應(yīng)答信號(hào)Master_ack 為1 是應(yīng)答 0 時(shí)非應(yīng)答*/
- uchar IIc_read_byte(bit Master_ack)
- {
- uchar i,vaule;
- IIc_Sad=1;
- for(i = 8;i > 0;i--)
- {
- vaule <<= 1;
- IIc_Scl = 1;
- _NOP_();
- if(IIc_Sad)
- vaule++;
- IIc_Scl = 0;
- _NOP_();
- }
- IIc_Sad = !Master_ack;//主機(jī)應(yīng)答信號(hào)
- _NOP_();
- IIc_Scl = 1;
- _NOP_();
- IIc_Scl = 0;
- _NOP_();
- return vaule;
- }
- /*以下是24C02 的讀寫函數(shù)*/
- /*在24c02 的add 地址中寫入一個(gè)數(shù)據(jù)date;返回1 設(shè)備正常*/
- bit Write_byte(uchar add,uchar date)
- {
- bit val;
- uchar i=0;
- IIc_init();
- IIc_start();
- val = IIc_write_byte(Address_24C02);//寫器件地址
- while(val==0)
- {
- if(i++==10) //等待超時(shí)(10ms) 可能器件不存在
- return(0);
- delay1(1); //等待一會(huì)
- IIc_start(); //重新發(fā)送
- val = IIc_write_byte(Address_24C02);//寫器件地址
- }
- IIc_write_byte(add);//寫存儲(chǔ)的地址
- IIc_write_byte(date);//寫數(shù)據(jù)
- IIc_stop();
- return(1);
- }
- bit Write_more_byte(uchar add,uchar number,uchar *p)
- {
- bit val;
- uchar i=0;
- IIc_init();
- IIc_start();
- val = IIc_write_byte(Address_24C02); //寫器件地址
- while(val==0)
- {
- if(i++==10) //等待超時(shí)(10ms)
- return(0);
- delay1(1); //等待一會(huì)
- IIc_start(); //重新發(fā)送
- val = IIc_write_byte(Address_24C02);//寫器件地址
- }
- IIc_write_byte(add);//寫存儲(chǔ)的地址
- for(i=0;number>0;number--)
- {
- IIc_write_byte(*p++);//寫存儲(chǔ)的數(shù)據(jù)
- }
- IIc_stop();
- return(1);
- }
- uchar read_byte(uchar add)
- {
- uchar val=0;
- bit R_flag=0;
- IIc_init();
- IIc_start();
- R_flag=IIc_write_byte(Address_24C02);//寫器件地址
- while(R_flag==0) //器件沒有應(yīng)答 可能是內(nèi)部編程/擦除周期
- {
- delay1(1); //等待一會(huì)
- IIc_start(); //重新發(fā)送
- R_flag=IIc_write_byte(Address_24C02);//寫器件地址
- }
- IIc_write_byte(add);//寫存儲(chǔ)的地址
- IIc_start();
- IIc_write_byte(Address_24C02+1);//寫器件地址(讀)
- val = IIc_read_byte(0);
- IIc_stop();
- return (val);
- }
- /*在24c02 的add 地址中連續(xù)讀出一串?dāng)?shù)據(jù)*p 可以一次性讀出存儲(chǔ)器中所有的數(shù)據(jù)*/
- void read_more_byte(uchar add,uchar number,uchar *p)
- {
- bit val=0;
- IIc_init();
- IIc_start();
- val = IIc_write_byte(Address_24C02); //寫器件地址
- while(val==0) //器件沒有應(yīng)答 可能是內(nèi)部編程/擦除周期
- {
- delay1(1); //等待一會(huì)
- IIc_start(); //重新發(fā)送
- val=IIc_write_byte(Address_24C02);//寫器件地址
- }
- IIc_write_byte(add);//寫存儲(chǔ)的地址
- IIc_start();
- IIc_write_byte(Address_24C02+1);//寫器件地址(讀)
- for(;number>1;number--)
- {
- *p++=IIc_read_byte(1);
- }
- *p = IIc_read_byte(0); //讀最后一個(gè)數(shù)據(jù)主機(jī)不應(yīng)答
- IIc_stop();
- }
- void main()
- {
- int i;
- //uchar xdata a[100];
- uchar temp=0;
- lcd_init();
- while(1)
- {
- //for(i=0;i<100;i++)
- //{
- //a[i]=i;
- //}
- Write_byte(0x05,8);
- //Write_more_byte(0,8,a);
- temp=read_byte(5);
- lcd_pos(0x0a);// 設(shè)置顯示位置
- lcd_wdat(0x30+temp);
- Write_byte(0xfa,9);
- //Write_more_byte(0,8,a);
- temp=read_byte(0xfa);
- lcd_pos(0x48);// 設(shè)置顯示位置
- lcd_wdat(0x30+temp);
- }
- }
復(fù)制代碼
所有資料51hei提供下載:
24c02.rar
(2.61 MB, 下載次數(shù): 40)
2020-4-17 16:20 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
|
|