|
用STM32或者51單片機(jī)設(shè)計一個讀卡系統(tǒng),對外接的I2C接口電路或者SPI接口電路進(jìn)行讀寫操作,讀寫內(nèi)容可以通過數(shù)碼管或者其他監(jiān)視器件查看,并用示波器觀看通信線路波形。
51hei.png (68.3 KB, 下載次數(shù): 64)
下載附件
2022-4-9 23:21 上傳
51hei.png (33.58 KB, 下載次數(shù): 39)
下載附件
2022-4-9 23:19 上傳
單片機(jī)源程序如下:
- #include<reg51.h>
- #include<intrins.h>
- typedef unsigned int u16;
- typedef unsigned char u8;
- sbit SDA=P1^1;
- sbit SCL=P1^0;
- void At24CO2Write(u8 dat,u8 addr);
- u8 At24CO2Read(u8 addr);
- u8 numer[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
- u8 display[4];
- sbit A1=P2^2;
- sbit B1=P2^3;
- sbit C1=P2^4;
- #define SHUMA P0
- sbit K1=P3^0;//保存
- sbit K2=P3^1;//讀取
- sbit K3=P3^2;//num++
- sbit K4=P3^3;//清零
- sbit led=P2^0;
- u8 num;
- void delay(u16 i)
- {
- while(i--);
- }
- void delay10us(void)
- {
- unsigned char a,b;
- for(b=1;b>0;b--)
- for(a=2;a>0;a--);
- }
- void shumaguan(u8 word[])
- { u8 i;
- for(i=0;i<4;i++)
- {
- switch(i)
- {
- case 0:C1=0;B1=0;A1=0;break;
- case 1:C1=0;B1=0;A1=1;break;
- case 2:C1=0;B1=1;A1=0;break;
- case 3:C1=0;B1=1;A1=1;break;
- }
- SHUMA=word[i];
- delay(100);
- SHUMA=0x00;
- }
- }
- void Key(u8 dat)
- {
- if(K1==0)
- {
- delay(1000);
- if(K1==0)
- { At24CO2Write(dat,1);
- led =~led;
- }
- while(!K1);
- }
- if(K2==0)
- {
- delay(1000);
- if(K2==0)
- {
- num=At24CO2Read(1);
- led =~led;
- }
- while(!K2);
- }
- if(K3==0)
- {
- delay(1000);
- if(K3==0)
- num++;
- while(!K3);
- }
- if(K4==0)
- {
- delay(1000);
- if(K4==0)
- num=0;
- while(!K4);
- }
- }
- void change()
- {
- display[0]=numer[num/1000];
- display[1]=numer[(num%1000)/100];
- display[2]=numer[(num%100)/10];
- display[3]=numer[num%10];
- }
- void main()
- {
- while(1)
- {
- Key(num);
- change();
- shumaguan(display);
- }
- }
- void I2cStart() //開始函數(shù),時鐘信號始終為高,當(dāng)數(shù)據(jù)線由高變低時開始
- {
- SDA=1;
- delay10us();
- SCL=1;
- delay10us();
- SDA=0;
- delay10us();
- SCL=0;
- delay10us();
- }
- void I2cStop() //停止函數(shù),時鐘信號始終為高,當(dāng)數(shù)據(jù)線由低變高時開結(jié)束
- {
- SDA=0;
- delay10us();
- SCL=1;
- delay10us();
- SDA=1;
- delay10us();
- }
- void I2cAck()
- {
- SDA=0;
- delay10us();
- SCL=1;
- delay10us();
- SCL=0;
- delay10us();
- }
-
- void nack()
- {
- SDA = 1; //拉高SDA,發(fā)送非應(yīng)答信號
- Delay();
- SCL = 1; //拉高SCL
- Delay();
- SCL = 0; //再拉低完成非應(yīng)答位,并保持住總線
- }
-
- u8 I2cSend(u8 dat)
- {
- u8 i;
- for(i=0x80; i!=0; i>>=1) //從高位到低位依次進(jìn)行
- {
- if((dat&i) == 0) //該位的值依次輸出到SDA上
- SDA = 0;
- else
- SDA = 1;
- delay10us();
- SCL = 1; //拉高SCL
- delay10us();
- SCL = 0; //再拉低SCL完成一個位周期
- }
- }
- u8 I2cRead()
- {
- u8 i, dat;
-
- SDA = 1; //確保主機(jī)釋放SDA
- for(i=0x80; i!=0; i>>=1) //從高位到低位依次進(jìn)行
- {
- delay10us();
- SCL = 1; //拉高SCL
- if(SDA == 0) //讀取SDA的值
- dat &= ~i; //為0時,dat中對應(yīng)位清零
- else
- dat |= i; //為1時,dat中對應(yīng)位置1
- delay10us();
- SCL = 0; //再拉低SCL使從機(jī)發(fā)送出下一位
- }
- return dat;
- }
- void At24CO2Write(u8 dat,u8 addr)
- {
- I2cStart();
- I2cSend(0xa0);
- I2cAck();
- I2cSend(addr);
- I2cAck();
- I2cSend(dat);
- I2cAck();
- I2cStop();
- }
- u8 At24CO2Read(u8 addr)
- {
- u8 num;
- I2cStart();
- I2cSend(0xa0);
- I2cAck();
- I2cSend(addr);
- I2cAck();
- I2cStart();
- I2cSend(0xa1);
- I2cAck();
- num=I2cRead();
- // nack();
- I2cStop();
- return num;
- }
復(fù)制代碼 Keil代碼與Proteus仿真下載:
實(shí)驗(yàn)4.7z
(73.56 KB, 下載次數(shù): 12)
2022-4-9 23:20 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
|
|