這是C51單片機設置外部儲存24c02的程序,
由LCD1602顯示被儲存的電壓
單片機源程序如下:
- #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_()/*短暫延時 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--);
- }
- /*以下五個函數是IIc 時序函數*/
- /* 啟動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; //總線置于空閑狀態
- }
- /*IIC 初始化子程序*/
- void IIc_init()
- {
- IIc_stop(); //結束之前IIC 的操作
- IIc_Scl = 1; //總線置于空閑狀態
- IIc_Sad = 1;
- }
- /*IIC 寫一個字節 返回應答信號 返回1 設備正常*/
- 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 位發送完后釋放數據線,準備接收應答位*/
- _NOP_();
- IIc_Scl = 1;
- if(IIc_Sad==0)//從機設備應答 ack=1
- ack = 1;
- else
- ack = 0;
- IIc_Scl = 0;
- _NOP_();
- return(ack);
- }
- /*IIC 讀一個字節 主機應答信號Master_ack 為1 是應答 0 時非應答*/
- 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;//主機應答信號
- _NOP_();
- IIc_Scl = 1;
- _NOP_();
- IIc_Scl = 0;
- _NOP_();
- return vaule;
- }
- /*以下是24C02 的讀寫函數*/
- /*在24c02 的add 地址中寫入一個數據date;返回1 設備正常*/
- 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) //等待超時(10ms) 可能器件不存在
- return(0);
- delay1(1); //等待一會
- IIc_start(); //重新發送
- val = IIc_write_byte(Address_24C02);//寫器件地址
- }
- IIc_write_byte(add);//寫存儲的地址
- IIc_write_byte(date);//寫數據
- 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) //等待超時(10ms)
- return(0);
- delay1(1); //等待一會
- IIc_start(); //重新發送
- val = IIc_write_byte(Address_24C02);//寫器件地址
- }
- IIc_write_byte(add);//寫存儲的地址
- for(i=0;number>0;number--)
- {
- IIc_write_byte(*p++);//寫存儲的數據
- }
- 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) //器件沒有應答 可能是內部編程/擦除周期
- {
- delay1(1); //等待一會
- IIc_start(); //重新發送
- R_flag=IIc_write_byte(Address_24C02);//寫器件地址
- }
- IIc_write_byte(add);//寫存儲的地址
- IIc_start();
- IIc_write_byte(Address_24C02+1);//寫器件地址(讀)
- val = IIc_read_byte(0);
- IIc_stop();
- return (val);
- }
- /*在24c02 的add 地址中連續讀出一串數據*p 可以一次性讀出存儲器中所有的數據*/
- 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) //器件沒有應答 可能是內部編程/擦除周期
- {
- delay1(1); //等待一會
- IIc_start(); //重新發送
- val=IIc_write_byte(Address_24C02);//寫器件地址
- }
- IIc_write_byte(add);//寫存儲的地址
- IIc_start();
- IIc_write_byte(Address_24C02+1);//寫器件地址(讀)
- for(;number>1;number--)
- {
- *p++=IIc_read_byte(1);
- }
- *p = IIc_read_byte(0); //讀最后一個數據主機不應答
- 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);// 設置顯示位置
- lcd_wdat(0x30+temp);
- Write_byte(0xfa,9);
- //Write_more_byte(0,8,a);
- temp=read_byte(0xfa);
- lcd_pos(0x48);// 設置顯示位置
- lcd_wdat(0x30+temp);
- }
- }
復制代碼
所有資料51hei提供下載:
24c02.rar
(2.61 MB, 下載次數: 40)
2020-4-17 16:20 上傳
點擊文件名下載附件
|