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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2499|回復: 0
打印 上一主題 下一主題
收起左側

單片機IC卡讀寫仿真程序

[復制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:556863 發(fā)表于 2020-11-18 11:28 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式

程序:
  1. #include "reg52.h"
  2. #include "lcd.h"

  3. unsigned char Rec_Buffer[4];
  4. #define DELAY_IIC_TIME 60
  5. #define TRUE 1
  6. #define FALSE 0

  7. sbit SCL=P1^0;        //時鐘線
  8. sbit SDA=P1^1;          //數(shù)據(jù)線

  9. unsigned int money;

  10. bit err_flag;


  11. //PC發(fā)送的命令
  12. #define CardID_Addr         0x00        //卡號 地址          00~02
  13. #define Password_Addr   0x0a        //密碼                     0a~0d
  14. #define Money_Addr             0x0f        //金額                   0f~10

  15. #define COM_RD_CARD 0x45   //上位機發(fā)的讀卡命令
  16. #define COM_WR_CARD 0x67        //上位機發(fā)的寫卡命令
  17. #define COM_ADD_MONEY 0xab        //上位機發(fā)的充錢命令
  18. #define COM_DEC_MONEY 0x89        //上位機發(fā)的扣錢命令

  19. #define COM_WR_ERROR  0xdd        //出錯

  20. #define FLAG_RD_OK        0x12                //上傳的數(shù)據(jù),表示讀卡完畢
  21. #define FLAG_WR_OK        0x34                 //上傳的數(shù)據(jù),表示寫卡完畢
  22. #define FLAG_RD_ER        0x56                //上傳的數(shù)據(jù),表示讀卡錯誤
  23. #define FLAG_WR_ER        0x78                //上傳的數(shù)據(jù),表示寫卡錯誤
  24. #define FLAG_NO_MONEY 0x9a                 //卡上金額不足
  25. #define FLAG_FULL_MONEY 0xbc        //卡上金額過多

  26. #define adr_mon_h 0x0f         //錢的高位地址
  27. #define adr_mon_l 0x10

  28. unsigned char Card_num[]={"ID:          "};
  29. unsigned char Money_num[]={"MONEY:    .  "};

  30. bit Check_Acknowledge(void);
  31. void I2C_Start(void);
  32. void I2C_Stop(void);
  33. unsigned char Read_One_Byte(unsigned char);
  34. unsigned char  ReadI2CByte(void);
  35. void Send_0(void);
  36. void Send_1(void);
  37. void WriteI2CByte(unsigned char) ;
  38. void Write_One_Byte(unsigned char,unsigned char);

  39. /********** Function Definition 函數(shù)定義 ************/
  40. void DELAY_IIC(unsigned int t)
  41. {
  42.         while(t!=0)
  43.         t--;
  44. }


  45. void I2C_Start(void)
  46. {
  47.         SDA=1;
  48.         SCL=1;
  49.         DELAY_IIC(DELAY_IIC_TIME);
  50.         SDA=0;
  51.         DELAY_IIC(DELAY_IIC_TIME);
  52.         SCL=0;
  53.         DELAY_IIC(DELAY_IIC_TIME);
  54. }


  55. void I2C_Stop(void)

  56. {
  57.         SDA=0;
  58.         SCL=1;
  59.         DELAY_IIC(DELAY_IIC_TIME);
  60.         SDA=1;
  61.         DELAY_IIC(DELAY_IIC_TIME);
  62.         SCL=0;
  63.         DELAY_IIC(DELAY_IIC_TIME);
  64. }


  65. void Send_0(void)
  66. {
  67.         SDA=0;
  68.         SCL=1;
  69.         DELAY_IIC(DELAY_IIC_TIME);
  70.         SCL=0;
  71.         DELAY_IIC(DELAY_IIC_TIME);
  72. }

  73. void Send_1(void)
  74. {
  75.         SDA=1;
  76.         SCL=1;
  77.         DELAY_IIC(DELAY_IIC_TIME);
  78.         SCL=0;
  79.         DELAY_IIC(DELAY_IIC_TIME);
  80. }


  81. bit Check_Acknowledge(void)
  82. {
  83.         SDA=1;
  84.         SCL=1;
  85.         DELAY_IIC(DELAY_IIC_TIME/2);
  86.         F0=SDA;
  87.         DELAY_IIC(DELAY_IIC_TIME/2);
  88.         SCL=0;
  89.         DELAY_IIC(DELAY_IIC_TIME);
  90.         if(F0==1)
  91.                 return FALSE;
  92.         return TRUE;
  93. }

  94. void WriteI2CByte(unsigned char b)
  95. {
  96.         char i;
  97.         for(i=0;i<8;i++)
  98.                 if((b<<i)&0x80)
  99.                         Send_1();
  100.         else           
  101.                 Send_0();
  102. }

  103. unsigned char ReadI2CByte(void)
  104. {
  105.         unsigned char b=0,i;
  106.         for(i=0;i<8;i++)
  107.         {
  108.                 SDA=1;
  109.                 SCL=1;
  110.                 DELAY_IIC(10);
  111.                 F0=SDA;
  112.                 DELAY_IIC(10);
  113.                 SCL=0;
  114.                 if(F0==1)
  115.                 {
  116.                         b=b<<1;
  117.                         b=b|0x01;
  118.                 }
  119.                 else
  120.                         b=b<<1;
  121.         }
  122.         return b;
  123. }

  124. /**********以下為讀寫24c02的函數(shù)**********/
  125. void Write_One_Byte(unsigned char addr,unsigned char thedata)
  126. {
  127.         bit acktemp=1;
  128.         I2C_Start();
  129.         WriteI2CByte(0xa0);
  130.         acktemp=Check_Acknowledge();
  131.         WriteI2CByte(addr);
  132.         acktemp=Check_Acknowledge();
  133.         WriteI2CByte(thedata);
  134.         acktemp=Check_Acknowledge();
  135.         I2C_Stop();
  136. }        

  137. unsigned char Read_One_Byte(unsigned char addr)
  138. {
  139.         bit acktemp=1;
  140.         unsigned char mydata;
  141.         I2C_Start();
  142.         WriteI2CByte(0xa0);
  143.         acktemp=Check_Acknowledge();
  144.         WriteI2CByte(addr);
  145.         acktemp=Check_Acknowledge();
  146.         I2C_Start();
  147.         WriteI2CByte(0xa1);
  148.         acktemp=Check_Acknowledge();
  149.         mydata=ReadI2CByte();
  150.         acktemp=Check_Acknowledge();
  151.         return mydata;
  152.         I2C_Stop();
  153. }

  154. char Num2Char(unsigned char ch)
  155. {
  156.         if(ch<=9)
  157.                  return (ch+'0');
  158.          else return (ch-10+'a');
  159. }

  160. void System_Init(void)
  161. {
  162.         TMOD=0x21;                //串行口初始化
  163.          TH1=0xfd;TL1=0xfd;        //設定波特率  9600  
  164.          PCON=0x00;
  165.          TR1=1;                        //啟動T1
  166.          SCON=0x50;        //串行口工作在方式1,并允許接收        
  167.           EA=1;                           
  168.         ES=1;        
  169. }

  170. void main(void)
  171. {
  172.         System_Init();                 //初始化
  173.         LCD_Init();

  174.          while(1)
  175.         {
  176.         //////////////此代碼用來測試IIC讀寫/////////////////
  177. #ifdef _IIC_DUBG                 
  178.                  Write_One_Byte(0,2); //ADD0 寫入數(shù)據(jù)2
  179.                  Write_One_Byte(1,7); //ADD1 寫入數(shù)據(jù)3
  180.                  LCD_Wr_Char(0,0,Read_One_Byte(0)+'0');         //讀取24C02 并在LM016顯示
  181.                  LCD_Wr_Char(1,0,Read_One_Byte(1)+'0');                 
  182. #endif                 
  183.         //////////////////IIC測試結束//////////////////////////
  184.                   Money_num[6]=((money/10000)%10)+'0';
  185.                   Money_num[7]=((money/1000)%10)+'0';
  186.                   Money_num[8]=((money/100)%10)+'0';
  187.                   Money_num[9]=((money/10)%10)+'0';
  188.                   Money_num[11]=(money%10)+'0';

  189.                 LCD_Wr_String(0,0,Card_num);
  190.                 LCD_Wr_String(0,1,Money_num);
  191.         }

  192. }

  193. //IC卡讀和寫子程序,中斷        
  194. void rxdata(void) interrupt 4 using 0
  195. {
  196.         unsigned char i,j;
  197.         unsigned char rdbuf[20]; //讀取卡中的數(shù)據(jù)緩沖
  198.         unsigned char RxBuf[20];  //讀取串口數(shù)據(jù)緩沖
  199.         EA=0;
  200.         for(i=0;i<2;i++) ////讀取命令,第一個字節(jié)為命令字節(jié),第二個字節(jié)為在第二個字節(jié)之后還有多少個字節(jié)           
  201.         {
  202.                 while(!RI);
  203.                 RI=0;
  204.                 RxBuf[i]=SBUF;  
  205.         }

  206.         if(RxBuf[1]!=0)          //如果字節(jié)數(shù)不是0,則繼續(xù)讀取剩余的數(shù)據(jù)
  207.         {
  208.                 for(i=0;i<RxBuf[1];i++)
  209.                 {
  210.                         while(!RI);
  211.                         RI=0;
  212.                         RxBuf[2+i]=SBUF;
  213.                 }
  214.         }

  215.         if(RxBuf[0]==COM_RD_CARD) //讀卡命令
  216.         {
  217.                 err_flag=0;
  218.                 rdbuf[0]=Read_One_Byte(CardID_Addr);   //讀卡中的ID號
  219.                 rdbuf[1]=Read_One_Byte(CardID_Addr+1);
  220.                 rdbuf[2]=Read_One_Byte(CardID_Addr+2);
  221.                 rdbuf[3]=Read_One_Byte(CardID_Addr+3);
  222.                 rdbuf[4]=Read_One_Byte(CardID_Addr+4);

  223.                 rdbuf[5]=Read_One_Byte(Money_Addr);
  224.                 rdbuf[6]=Read_One_Byte(Money_Addr+1);

  225.                 SBUF= COM_RD_CARD; //發(fā)送讀卡命令返回PC

  226.                 while(!TI);
  227.                 TI=0;

  228.                 for(j=0;j<7;j++) //發(fā)送卡數(shù)據(jù)返回PC
  229.                 {
  230.                         SBUF=rdbuf[j];
  231.                         while(!TI);
  232.                         TI=0;
  233.                 }

  234.               Card_num[3]=(rdbuf[0]>>4) +'0';         
  235.                   Card_num[4]=(rdbuf[0]&0x0f) +'0';  
  236.                   Card_num[5]=(rdbuf[1]>>4) + '0';
  237.                   Card_num[6]=(rdbuf[1]&0x0f) + '0';
  238.                   Card_num[7]=(rdbuf[2]>>4) + '0';
  239.                   Card_num[8]=(rdbuf[2]&0x0f) + '0';
  240.                   Card_num[9]=(rdbuf[3]>>4) + '0';
  241.                   Card_num[10]=(rdbuf[3]&0x0f) + '0';
  242.                   Card_num[11]=(rdbuf[4]>>4) + '0';
  243.                   Card_num[12]=(rdbuf[4]&0x0f) + '0';
  244.                         
  245.                   money=rdbuf[5]*256+rdbuf[6];

  246.         }
  247.         else if(RxBuf[0]==COM_WR_CARD) //寫卡命令
  248.         {
  249.                 err_flag=0;
  250.                 Write_One_Byte(CardID_Addr,RxBuf[2]); //寫卡號
  251.                 Write_One_Byte(CardID_Addr+1,RxBuf[3]);
  252.                 Write_One_Byte(CardID_Addr+2,RxBuf[4]);
  253.                 Write_One_Byte(CardID_Addr+3,RxBuf[5]);
  254.                 Write_One_Byte(CardID_Addr+4,RxBuf[6]);

  255.                 Write_One_Byte(Money_Addr,RxBuf[7]);
  256.                 Write_One_Byte(Money_Addr+1,RxBuf[8]);
  257.                 SBUF=COM_WR_CARD;while(!TI);TI=0;
  258.                 SBUF=COM_WR_CARD;while(!TI);TI=0;
  259.                 SBUF=COM_WR_CARD;while(!TI);TI=0;
  260.                 /*if((Read_One_Byte(CardID_Addr)!=RxBuf[2])
  261.                  ||(Read_One_Byte(CardID_Addr+1)!=RxBuf[3])
  262.                  ||(Read_One_Byte(CardID_Addr+2)!=RxBuf[4])
  263.                  ||(Read_One_Byte(CardID_Addr+3)!=RxBuf[5])
  264.                  ||(Read_One_Byte(CardID_Addr+4)!=RxBuf[6]))
  265.                  err_flag=1;

  266.                 if(!err_flag)
  267.                 {
  268.                         SBUF=COM_WR_CARD;while(!TI);TI=0;
  269.                         SBUF=COM_WR_CARD;while(!TI);TI=0;
  270.                         SBUF=COM_WR_CARD;while(!TI);TI=0;
  271.                         SBUF=COM_WR_CARD;while(!TI);TI=0;
  272.                 }
  273.                 else
  274.                 {
  275.                         SBUF=COM_WR_ERROR;
  276.                         while(!TI);
  277.                         TI=0;
  278.                 } */
  279.         }
  280.         else if(RxBuf[0]==COM_ADD_MONEY) //充錢命令
  281.         {
  282.                 err_flag=0;
  283.                 money=Read_One_Byte(Money_Addr)*256+Read_One_Byte(Money_Addr+1);
  284.                 money += (RxBuf[7]*256 + RxBuf[8]);

  285.                  if( Read_One_Byte(Money_Addr)!=(money/256)
  286.                  || Read_One_Byte(Money_Addr+1)!=(money%256))
  287.                          err_flag=1;

  288.                  if(!err_flag)
  289.                  {
  290.                         SBUF=COM_ADD_MONEY;
  291.                         while(!TI);
  292.                         TI=0;
  293.                  }else
  294.                  {
  295.                          SBUF=COM_WR_ERROR;
  296.                         while(!TI);
  297.                         TI=0;
  298.                  }
  299.         }
  300.         else if(RxBuf[0]==COM_DEC_MONEY)
  301.         {
  302.                          err_flag=0;
  303.                          money=Read_One_Byte(Money_Addr)*256+Read_One_Byte(Money_Addr+1);
  304.                          money -= (RxBuf[7]*256 + RxBuf[8]);

  305.                          Write_One_Byte(Money_Addr,money/256);
  306.                          Write_One_Byte(Money_Addr+1,money%256);         

  307.                          if( Read_One_Byte(Money_Addr)!=(money/256)
  308.                                  || Read_One_Byte(Money_Addr+1)!=(money%256))
  309.                          err_flag=1;

  310.                          if(!err_flag)
  311.                          {
  312.                                 SBUF=COM_DEC_MONEY;
  313.                                 while(!TI);
  314.                                 TI=0;
  315.                          }else
  316.                          {
  317.                                  SBUF=COM_WR_ERROR;
  318.                                 while(!TI);
  319.                                 TI=0;
  320.                          }                 
  321.         }
  322.         EA=1;

  323. }
復制代碼


IC Card.zip

3.18 MB, 下載次數(shù): 16, 下載積分: 黑幣 -5

MCU.zip

111.31 KB, 下載次數(shù): 12, 下載積分: 黑幣 -5

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

使用道具 舉報

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

本版積分規(guī)則

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

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

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 久草欧美 | 91精品国产高清一区二区三区 | 2023亚洲天堂 | 亚洲精品乱码久久久久久按摩观 | 天天舔天天 | 天天色综 | 国产精品免费一区二区三区 | 欧美日韩在线一区二区三区 | 一区二区三区精品在线视频 | 福利二区| 欧美一区二区三区四区视频 | 在线观看日韩精品视频 | 国产精品毛片久久久久久久 | 天天草视频 | 日韩精品av一区二区三区 | 91不卡 | 国产乱码精品一区二区三区五月婷 | 中文字幕综合 | 国产一在线观看 | 一区二区视频在线 | 黄色一级大片在线观看 | 91国语清晰打电话对白 | 毛片免费在线 | 黄色成人在线 | 青青草社区 | 懂色tv| 色综合一区二区三区 | 国产成人久久av免费高清密臂 | 人人干人人舔 | 国产精品久久久久久吹潮日韩动画 | 成人av一区二区亚洲精 | 成人在线观 | 日韩国产一区二区三区 | 欧美日韩在线视频一区 | 超碰精品在线观看 | 国产精品日韩 | 国产亚洲一区二区三区在线 | 日韩欧美三级电影 | 中文日韩字幕 | 精区3d动漫一品二品精区 | 中文字幕一区二区三区不卡 |