- #include<reg52.h> //52系列单片机头文件
- #include<stdio.h>
- #define uchar unsigned char //定义无符号数据类型
- #define uint unsigned int
- sbit sda=P2^0;//串行数据输入/输出端
- sbit scl=P2^0;//串行时钟输入端
- uint i;
- char b[8],su[8]={'s','u','j','u','n','j','u','n'};
- void delay(){;;} //定义延时空操作
- void init1(){
- PCON|=0x80;
- SCON=0x50;//串口控制寄存器,等价于SM0=0,SM1=1,SM2=0,串口方式一通信
- TMOD=0X20; //设置定时器1为模式2,做为波特率发生器,8位初值自动重装的8位定时器,定时到TH1的值自动装到TL1
- TH1=0xff;//设置波特率为9600
- TL1=0xff;
-
- TI = 1;//向CPU发送串口中断申请,直接使用printf必须加入此句才能实现发送
- TR1=1; //启动波特率发生器
- }
- void delay1ms(uint z)//延时1ms函数
- {
- uint x,y;
- for(x=z;x>0;x--)
- for(y=110;y>0;y--);
- }
- void start()//启动信号:SCL在高电平期间,SDA一个下降沿启动信号
- {
- sda=1;
- delay();//空操作延时
- scl=1;
- delay();
- sda=0;
- delay();
- }
- void stop()//停止信号:SCL在高电平期间,SDA一个上升沿停止信号
- {
- sda=0;
- delay();
- scl=1;
- delay();
- sda=1;
- delay();
- }
- void respons()//应答信号:SLC在高电平期间,SDA被从设备拉为低电平表示电平答应
- {
- 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)//写一个字节,串行发送1字节时,需要把其中的8位一位一位地发送出去
- {
- uchar i,temp;
- temp=date;
- for(i=0;i<8;i++);{
- temp=temp<<1;//将temp左移一位,最高位将移入PSW寄存器的CY位中
- scl=0;
- delay();
- sda=CY;//将CY赋给SDA进而在SCL的控制下发送出去
- delay();
- scl=1;
- delay();
- }
- scl=0;
- delay();
- sda=1;
- delay();
- }
- uchar read_byte()//读一字节
- {
- uchar i,k;//定义临时变量
- scl=0;
- delay();
- sda=1;
- delay();
- for(i=0;i<8;i++)//依次把8个独立的位放入1字节中来完成接收
- {
- scl=1;
- delay();
- k=(k<<1)|sda;//将k左移一位与SDA进行“或”运算
- scl=0;
- delay();
- }
- return k;
- }
- void write_add(uchar address,uchar date)
- {
- start();
- write_byte(0xa0);
- respons();
- write_byte(address);
- respons();
- write_byte(date);
- respons();
- stop();
- }
- uchar read_add(uchar address)
- {
- uchar date;
- start();
- write_byte(0xa0);
- respons();
- write_byte(address);
- respons();
- start();
- write_byte(0xa1);
- respons();
- start();
- date=read_byte();
- stop();
- return date;
- }
- void main() //主函数
- {
- init();
- init1();
- P1=0xFF;
- while(1){
- for(i=0;i<8;i++)
- {
- b[i]=su[i];
- write_add(23,b[i]);
- delay1ms(100);
- P1=read_add(23);
- b[i]=read_add(23);
- }
- delay1ms(1000);
- for(i=1;i<8;i++);
- printf("%c\n",b[i]);
- }
- }
复制代码 |