这是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)
|