- #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]);
- }
- }
復制代碼 |