久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1582|回復(fù): 0
打印 上一主題 下一主題
收起左側(cè)

單片機(jī)IIC讀卡系統(tǒng)設(shè)計仿真程序

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
用STM32或者51單片機(jī)設(shè)計一個讀卡系統(tǒng),對外接的I2C接口電路或者SPI接口電路進(jìn)行讀寫操作,讀寫內(nèi)容可以通過數(shù)碼管或者其他監(jiān)視器件查看,并用示波器觀看通信線路波形。

單片機(jī)源程序如下:

  1. #include<reg51.h>
  2. #include<intrins.h>


  3. typedef unsigned int u16;
  4. typedef unsigned char u8;
  5. sbit SDA=P1^1;
  6. sbit SCL=P1^0;
  7. void At24CO2Write(u8 dat,u8 addr);
  8. u8 At24CO2Read(u8 addr);

  9. u8 numer[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
  10. u8 display[4];
  11. sbit A1=P2^2;
  12. sbit B1=P2^3;
  13. sbit C1=P2^4;
  14. #define SHUMA P0
  15. sbit K1=P3^0;//保存
  16. sbit K2=P3^1;//讀取
  17. sbit K3=P3^2;//num++
  18. sbit K4=P3^3;//清零

  19. sbit led=P2^0;
  20. u8 num;
  21. void delay(u16 i)
  22. {
  23. while(i--);
  24. }

  25. void delay10us(void)   
  26. {
  27.     unsigned char a,b;
  28.     for(b=1;b>0;b--)
  29.         for(a=2;a>0;a--);
  30. }

  31. void shumaguan(u8 word[])
  32. {         u8 i;
  33.   for(i=0;i<4;i++)
  34. {
  35.   switch(i)
  36.   {
  37.   case 0:C1=0;B1=0;A1=0;break;
  38.   case 1:C1=0;B1=0;A1=1;break;
  39.   case 2:C1=0;B1=1;A1=0;break;
  40.   case 3:C1=0;B1=1;A1=1;break;
  41.   }
  42.   SHUMA=word[i];
  43.   delay(100);
  44.   SHUMA=0x00;
  45. }
  46. }
  47. void Key(u8 dat)
  48. {
  49. if(K1==0)
  50. {
  51.   delay(1000);
  52.   if(K1==0)
  53.         {                At24CO2Write(dat,1);
  54.                         led =~led;
  55.         }
  56.   while(!K1);
  57. }
  58. if(K2==0)
  59. {
  60.   delay(1000);
  61.   if(K2==0)
  62.         {
  63.                 num=At24CO2Read(1);
  64.                 led =~led;
  65.         }
  66.   while(!K2);
  67. }
  68. if(K3==0)
  69. {
  70.   delay(1000);
  71.   if(K3==0)
  72.   num++;
  73.   while(!K3);
  74. }
  75. if(K4==0)
  76. {
  77.   delay(1000);
  78.   if(K4==0)
  79.   num=0;
  80.   while(!K4);
  81. }
  82. }
  83. void change()
  84. {
  85.    display[0]=numer[num/1000];
  86.          display[1]=numer[(num%1000)/100];
  87.          display[2]=numer[(num%100)/10];
  88.          display[3]=numer[num%10];
  89. }
  90. void main()
  91. {
  92. while(1)
  93. {
  94.    Key(num);
  95.    change();
  96.    shumaguan(display);
  97. }
  98. }


  99. void I2cStart() //開始函數(shù),時鐘信號始終為高,當(dāng)數(shù)據(jù)線由高變低時開始
  100. {
  101.   SDA=1;
  102.   delay10us();
  103.   SCL=1;
  104.   delay10us();
  105.   SDA=0;
  106.   delay10us();
  107.   SCL=0;
  108.   delay10us();
  109. }
  110. void I2cStop()        //停止函數(shù),時鐘信號始終為高,當(dāng)數(shù)據(jù)線由低變高時開結(jié)束
  111. {
  112.   SDA=0;
  113.   delay10us();
  114.   SCL=1;
  115.   delay10us();
  116.   SDA=1;
  117.   delay10us();
  118. }
  119. void I2cAck()
  120. {

  121.          SDA=0;
  122.          delay10us();
  123.          SCL=1;
  124.          delay10us();

  125.          SCL=0;
  126.          delay10us();
  127. }

  128. void nack()
  129. {
  130.         SDA = 1;        //拉高SDA,發(fā)送非應(yīng)答信號
  131.         Delay();        
  132.         SCL = 1;        //拉高SCL
  133.         Delay();        
  134.         SCL = 0;        //再拉低完成非應(yīng)答位,并保持住總線
  135. }

  136. u8 I2cSend(u8 dat)
  137. {
  138.         u8 i;
  139.         for(i=0x80; i!=0; i>>=1)        //從高位到低位依次進(jìn)行
  140.         {
  141.                 if((dat&i) == 0)        //該位的值依次輸出到SDA上
  142.                         SDA = 0;
  143.                 else
  144.                         SDA = 1;
  145.                 delay10us();
  146.                 SCL = 1;        //拉高SCL
  147.                 delay10us();
  148.                 SCL = 0;        //再拉低SCL完成一個位周期
  149.         }

  150. }
  151. u8 I2cRead()
  152. {
  153.          u8 i, dat;
  154.         
  155.         SDA = 1;        //確保主機(jī)釋放SDA
  156.         for(i=0x80; i!=0; i>>=1)        //從高位到低位依次進(jìn)行
  157.         {
  158.                 delay10us();
  159.                 SCL = 1;        //拉高SCL
  160.                 if(SDA == 0)        //讀取SDA的值
  161.                         dat &= ~i;        //為0時,dat中對應(yīng)位清零
  162.                 else
  163.                         dat |= i;        //為1時,dat中對應(yīng)位置1
  164.                 delay10us();
  165.                 SCL = 0;        //再拉低SCL使從機(jī)發(fā)送出下一位
  166.         }
  167.         return dat;

  168. }
  169. void At24CO2Write(u8 dat,u8 addr)
  170. {
  171.    I2cStart();
  172.    I2cSend(0xa0);
  173.          I2cAck();
  174.    I2cSend(addr);
  175.          I2cAck();
  176.    I2cSend(dat);
  177.          I2cAck();
  178.    I2cStop();
  179. }
  180. u8 At24CO2Read(u8 addr)
  181. {
  182.    u8 num;
  183.    I2cStart();
  184.    I2cSend(0xa0);
  185.          I2cAck();
  186.    I2cSend(addr);
  187.          I2cAck();
  188.    I2cStart();
  189.    I2cSend(0xa1);
  190.          I2cAck();
  191.    num=I2cRead();
  192. //         nack();
  193.    I2cStop();
  194.    return num;
  195. }



復(fù)制代碼
Keil代碼與Proteus仿真下載: 實(shí)驗(yàn)4.7z (73.56 KB, 下載次數(shù): 12)

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 午夜免费观看 | 亚洲视频在线观看 | 午夜三区| 综合国产在线 | 久久这里只有精品首页 | 日韩精品在线看 | 激情在线视频网站 | 日韩中文字幕在线观看 | 美女爽到呻吟久久久久 | 一区二区三区亚洲精品国 | www4虎| 国产日产精品一区二区三区四区 | 国产精品中文字幕在线 | 久久男人 | 蜜桃一区| 中文字幕不卡视频在线观看 | 国产精品久久久久久久模特 | 中文字幕在线不卡播放 | 麻豆精品国产91久久久久久 | 欧美一区二区三区一在线观看 | 国产精品免费观看视频 | 在线亚洲一区 | 91精产国品一二三区 | 国产一级免费视频 | 欧美一级二级三级视频 | 婷婷色成人 | 2023亚洲天堂| 欧美在线视频网站 | 国产亚洲精品a | 精品欧美一区二区三区久久久 | 国产午夜精品福利 | 国产精品国产三级国产播12软件 | 日韩高清国产一区在线 | aaaa网站 | 一区欧美 | 黄色成人在线观看 | 久久久久久久久国产精品 | 久久国产综合 | 久久久精品一区二区三区 | 国产91九色 | 国产九九精品 |