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

標(biāo)題: STC51單片機(jī)IIC例程 [打印本頁(yè)]

作者: hanbinghyj0215    時(shí)間: 2017-9-18 16:44
標(biāo)題: STC51單片機(jī)IIC例程
初學(xué)51單片機(jī),請(qǐng)多關(guān)照
代碼下載:
51 IIC示例.zip (65.27 KB, 下載次數(shù): 62)

  1. /******************** (C) COPYRIGHT 2015 ********************
  2. * 文件名          : main.c
  3. * 作者            : 優(yōu)靈電子開(kāi)發(fā)團(tuán)隊(duì)
  4. * 版本            : V3.1.0.0
  5. * 日期            : 2015-5-10
  6. * 描述            : 接收來(lái)自串口的簡(jiǎn)單數(shù)據(jù),給模塊用IIC發(fā)送對(duì)應(yīng)命令,執(zhí)行成功后
  7.                                                                                 直接通過(guò)串口返回?cái)?shù)據(jù)。
  8. * 技術(shù)支持        : QQ: 3419865840
  9. ********************************************************************************/

  10. /* 包含文件 -------------------------------------------------------------------*/
  11. #include"main.h"
  12. #include<intrins.h>
  13. /* 類型定義 -------------------------------------------------------------------*/
  14. typedef struct _CMD
  15. {
  16.   unsigned char Buffer[32];
  17.   unsigned char Point;
  18.   unsigned char RecFlag;
  19. }CMD;
  20. /* 宏定義 ---------------------------------------------------------------------*/
  21. #define SlaveAddress 0X00
  22. /* 本文件使用的變量 -----------------------------------------------------------*/
  23. sbit SCL = P1^7;
  24. sbit SDA = P1^6;
  25. CMD Cmd;
  26. /* 本文件使用的函數(shù)聲明 -------------------------------------------------------*/
  27. void Delay5us();
  28. void IIC_Start();
  29. void IIC_Stop();
  30. void IIC_SendByte(unsigned char dat);
  31. unsigned char IIC_RecvByte();
  32. void IIC_SendACK(bit ack);
  33. bit IIC_RecvACK();
  34. unsigned char CheckSum(unsigned char *dat, unsigned char num);
  35. void ClearBuffer(void);
  36. void Command(void);
  37. /* 本文件函數(shù)體 ---------------------------------------------------------------*/

  38. /*******************************************************************************
  39. * 函數(shù)名         : main
  40. * 描述           : 主函數(shù)
  41. * 輸入           : 無(wú)
  42. * 輸出           : 無(wú)
  43. * 返回           : 無(wú)
  44. *******************************************************************************/
  45. void main(void)
  46. {
  47.         //串口初始化,單片機(jī)型號(hào)STC89C52RC,晶振是11.0592M,波特率9600
  48.         SCON = 0X50;
  49.         TMOD = 0X20;
  50.         TH1 = TL1 = 0XFD;
  51.         TR1 = 1;
  52.        
  53.         while(1)
  54.         {
  55.                 if(RI)
  56.                 {
  57.                         RI = 0;
  58.                         //一鍵讀卡命令
  59.                         if(SBUF  == 0x10)
  60.                         {
  61.                                 Cmd.Buffer[0] = 0x03;        //命令長(zhǎng)度
  62.                                 Cmd.Buffer[1] = 0x00;        //地址
  63.                                 Cmd.Buffer[2] = 0x10; //命令字
  64.                                
  65.                                 Command();
  66.                                 //正確時(shí)返回10字節(jié)
  67.                                 //0.命令長(zhǎng)度 為0x0A
  68.                                 //1.命令字節(jié)為0x90
  69.                                 //2.執(zhí)行狀態(tài)為0
  70.                                 //3.4.卡類型
  71.                                 //5.6.7.8卡號(hào)
  72.                                 //錯(cuò)誤時(shí)返回3字節(jié)
  73.                                 //0.命令長(zhǎng)度為0x03
  74.                                 //1.命令字為0x90
  75.                                 //2.執(zhí)行狀態(tài)可能是0xfe,0xff
  76.                         }
  77.                         //讀塊數(shù)據(jù)
  78.                         else if(SBUF == 0X11)
  79.                         {
  80.                                 Cmd.Buffer[0] = 0x04;        //命令長(zhǎng)度
  81.                                 Cmd.Buffer[1] = 0x00; //地址
  82.                                 Cmd.Buffer[2] = 0x11; //命令字
  83.                                 Cmd.Buffer[3] = 0x01; //塊號(hào)
  84.                                
  85.                                 Command();
  86.                         }
  87.                         //寫(xiě)塊數(shù)據(jù)
  88.                         else if(SBUF == 0X12)
  89.                         {
  90.                                 Cmd.Buffer[0] = 0x14;//命令長(zhǎng)度
  91.                                 Cmd.Buffer[1] = 0x00;//地址
  92.                                 Cmd.Buffer[2] = 0x12;//命令字
  93.                                 Cmd.Buffer[3] = 0x01;//塊號(hào)
  94.                                 Cmd.Buffer[4] = 0x00;//數(shù)據(jù)
  95.                                 Cmd.Buffer[5] = 0x11;
  96.                                 Cmd.Buffer[6] = 0x22;
  97.                                 Cmd.Buffer[7] = 0x33;
  98.                                 Cmd.Buffer[8] = 0x44;
  99.                                 Cmd.Buffer[9] = 0x55;
  100.                                 Cmd.Buffer[10] = 0x66;
  101.                                 Cmd.Buffer[11] = 0x77;
  102.                                 Cmd.Buffer[12] = 0x88;
  103.                                 Cmd.Buffer[13] = 0x99;
  104.                                 Cmd.Buffer[14] = 0xAA;
  105.                                 Cmd.Buffer[15] = 0xBB;
  106.                                 Cmd.Buffer[16] = 0xCC;
  107.                                 Cmd.Buffer[17] = 0xDD;
  108.                                 Cmd.Buffer[18] = 0xEE;
  109.                                 Cmd.Buffer[19] = 0xFF;
  110.                                
  111.                                 Command();
  112.                         }
  113.                         //辦卡
  114.                         else if(SBUF == 0X13)
  115.                         {
  116.                                 Cmd.Buffer[0] = 0x09;//命令長(zhǎng)度
  117.                                 Cmd.Buffer[1] = 0x00;//地址
  118.                                 Cmd.Buffer[2] = 0x13;//命令字
  119.                                 Cmd.Buffer[3] = 0x01;//塊號(hào)
  120.                                 Cmd.Buffer[4] = 0x00;//固定為0
  121.                                 Cmd.Buffer[5] = 0x00;//四字節(jié)數(shù)據(jù)
  122.                                 Cmd.Buffer[6] = 0x00;
  123.                                 Cmd.Buffer[7] = 0x00;
  124.                                 Cmd.Buffer[8] = 0x00;
  125.                                
  126.                                 Command();
  127.                         }
  128.                         //恢復(fù)卡
  129.                         else if(SBUF == 0X14)
  130.                         {
  131.                                 Cmd.Buffer[0] = 0x07;//命令長(zhǎng)度
  132.                                 Cmd.Buffer[1] = 0x00;//地址
  133.                                 Cmd.Buffer[2] = 0x14;//命令字
  134.                                 Cmd.Buffer[3] = 0x01;//塊號(hào)
  135.                                 Cmd.Buffer[4] = 0x38;//固定
  136.                                 Cmd.Buffer[5] = 0x52;//固定
  137.                                 Cmd.Buffer[6] = 0x7A;//固定
  138.                                
  139.                                 Command();
  140.                         }
  141.                         //充值
  142.                         else if(SBUF == 0X15)
  143.                         {
  144.                                 Cmd.Buffer[0] = 0x08;//長(zhǎng)度
  145.                                 Cmd.Buffer[1] = 0x00;//地址
  146.                                 Cmd.Buffer[2] = 0x15;//命令字
  147.                                 Cmd.Buffer[3] = 0x01;//塊號(hào)
  148.                                 Cmd.Buffer[4] = 0x00;//四字節(jié)數(shù)值
  149.                                 Cmd.Buffer[5] = 0x00;
  150.                                 Cmd.Buffer[6] = 0x00;
  151.                                 Cmd.Buffer[7] = 0x00;

  152.                                 Command();
  153.                         }
  154.                         //扣款
  155.                         else if(SBUF == 0X16)
  156.                         {
  157.                                 Cmd.Buffer[0] = 0x08;//長(zhǎng)度
  158.                                 Cmd.Buffer[1] = 0x00;//地址
  159.                                 Cmd.Buffer[2] = 0x16;//命令字
  160.                                 Cmd.Buffer[3] = 0x01;//塊號(hào)
  161.                                 Cmd.Buffer[4] = 0x00;//四字節(jié)數(shù)值
  162.                                 Cmd.Buffer[5] = 0x00;
  163.                                 Cmd.Buffer[6] = 0x00;
  164.                                 Cmd.Buffer[7] = 0x00;
  165.                                
  166.                                 Command();
  167.                         }
  168.                         //裝載密碼
  169.                         else if(SBUF == 0X2B)
  170.                         {
  171.                                 Cmd.Buffer[0] = 0x15;//長(zhǎng)度
  172.                                 Cmd.Buffer[1] = 0x00;//地址
  173.                                 Cmd.Buffer[2] = 0x2B;//命令字
  174.                                 Cmd.Buffer[3] = 0xFF;//6字節(jié)密鑰A
  175.                                 Cmd.Buffer[4] = 0xFF;
  176.                                 Cmd.Buffer[5] = 0xFF;
  177.                                 Cmd.Buffer[6] = 0xFF;
  178.                                 Cmd.Buffer[7] = 0xFF;
  179.                                 Cmd.Buffer[8] = 0xFF;
  180.                                 Cmd.Buffer[9] = 0xFF;//6字節(jié)密鑰B
  181.                                 Cmd.Buffer[10] = 0xFF;
  182.                                 Cmd.Buffer[11] = 0xFF;
  183.                                 Cmd.Buffer[12] = 0xFF;
  184.                                 Cmd.Buffer[13] = 0xFF;
  185.                                 Cmd.Buffer[14] = 0xFF;
  186.                                 Cmd.Buffer[15] = 0x00;//密鑰模式
  187.                                 Cmd.Buffer[16] = 0x03;//固定03
  188.                                 Cmd.Buffer[17] = 0x08;//固定08
  189.                                 Cmd.Buffer[18] = 0x05;//固定05
  190.                                 Cmd.Buffer[19] = 0x02;//固定02
  191.                                 Cmd.Buffer[20] = 0x07;//固定07
  192.                                
  193.                                 Command();
  194.                         }
  195.                         //設(shè)置波特率
  196.                         else if(SBUF == 0X2C)
  197.                         {
  198.                                 Cmd.Buffer[0] = 0x0A;//長(zhǎng)度
  199.                                 Cmd.Buffer[1] = 0x00;//地址
  200.                                 Cmd.Buffer[2] = 0x2C;//命令字
  201.                                 Cmd.Buffer[3] = 0x00;//四字節(jié)波特率(19200)
  202.                                 Cmd.Buffer[4] = 0x00;
  203.                                 Cmd.Buffer[5] = 0x4B;
  204.                                 Cmd.Buffer[6] = 0x00;
  205.                                 Cmd.Buffer[7] = 0x98;//固定98
  206.                                 Cmd.Buffer[8] = 0x24;//固定24
  207.                                 Cmd.Buffer[9] = 0x31;//固定31
  208.                                
  209.                                 Command();
  210.                         }
  211.                         //設(shè)置地址
  212.                         else if(SBUF == 0X2D)
  213.                         {
  214.                                 Cmd.Buffer[0] = 0x07;//長(zhǎng)度
  215.                                 Cmd.Buffer[1] = 0x00;//地址
  216.                                 Cmd.Buffer[2] = 0x2D;//命令字
  217.                                 Cmd.Buffer[3] = 0x01;//新地址
  218.                                 Cmd.Buffer[4] = 0x37;//固定37
  219.                                 Cmd.Buffer[5] = 0x21;//固定21
  220.                                 Cmd.Buffer[6] = 0x56;//固定56
  221.                                
  222.                                 Command();
  223.                         }
  224.                         //設(shè)置工作模式
  225.                         else if(SBUF == 0X2E)
  226.                         {
  227.                                 Cmd.Buffer[0] = 0x0D;//長(zhǎng)度
  228.                                 Cmd.Buffer[1] = 0x00;//地址
  229.                                 Cmd.Buffer[2] = 0x2E;//命令字
  230.                                 Cmd.Buffer[3] = 0x00;//模式
  231.                                 Cmd.Buffer[4] = 0x0A;//模式+0A
  232.                                 Cmd.Buffer[5] = 0x01;//塊號(hào)
  233.                                 Cmd.Buffer[6] = 0x00;//四字節(jié)操作值
  234.                                 Cmd.Buffer[7] = 0x00;
  235.                                 Cmd.Buffer[8] = 0x00;
  236.                                 Cmd.Buffer[9] = 0x01;
  237.                                 Cmd.Buffer[10] = 0x23;//固定23
  238.                                 Cmd.Buffer[11] = 0x12;//固定12
  239.                                 Cmd.Buffer[12] = 0x54;//固定54
  240.                                
  241.                                 Command();
  242.                         }
  243.                 }
  244.         }
  245. }

  246. /*******************************************************************************
  247. * 函數(shù)名         : Command
  248. * 描述           : 執(zhí)行命令,發(fā)送IIC數(shù)據(jù),接收IIC數(shù)據(jù),串口發(fā)出
  249. * 輸入           : 無(wú)
  250. * 輸出           : 無(wú)
  251. * 返回           : 無(wú)
  252. *******************************************************************************/
  253. void Command(void)
  254. {
  255.         unsigned char i;
  256.        
  257.         //校驗(yàn)
  258.         Cmd.Buffer[Cmd.Buffer[0]] = CheckSum(Cmd.Buffer, Cmd.Buffer[0]);
  259.         //開(kāi)始發(fā)送
  260.         IIC_Start();
  261.         IIC_SendByte(SlaveAddress);
  262.        
  263.         for(i = 0; i < Cmd.Buffer[0] + 1; i++)
  264.         {
  265.                 IIC_SendByte(Cmd.Buffer[i]);
  266.         }
  267.         IIC_Stop();
  268.        
  269.         ClearBuffer();
  270.        
  271.         //開(kāi)始接收
  272.         IIC_Start();
  273.         IIC_SendByte(SlaveAddress|0x01);
  274.        
  275.         do
  276.         {
  277.                 //模塊正忙時(shí)為返回7F
  278.                 Cmd.Buffer[0] = IIC_RecvByte();
  279.                 IIC_SendACK(0);
  280.         }while(Cmd.Buffer[0] == 0x7F);
  281.        
  282.         for(i = 0; i < Cmd.Buffer[0]-1; i++)
  283.         {
  284.                 Cmd.Buffer[i+1] = IIC_RecvByte();
  285.                 IIC_SendACK(0);
  286.         }
  287.         Cmd.Buffer[i+1] = IIC_RecvByte();
  288.         IIC_SendACK(1);
  289.        
  290.         IIC_Stop();
  291.         //開(kāi)始從串口發(fā)送
  292.         for(i = 0; i < Cmd.Buffer[0] + 1; i++)
  293.         {
  294.                 SBUF = Cmd.Buffer[i];TI = 0; while(TI == 0);
  295.         }
  296. }

  297. /*******************************************************************************
  298. * 函數(shù)名         : ClearBuffer
  299. * 描述           : 清除緩存
  300. * 輸入           : 無(wú)
  301. * 輸出           : 無(wú)
  302. * 返回           : 無(wú)
  303. *******************************************************************************/
  304. void ClearBuffer(void)
  305. {
  306.         unsigned char i;
  307.         for(i = 0; i < 32; i++)
  308.         {
  309.                 Cmd.Buffer[i] = 0;
  310.         }
  311. }

  312. /*******************************************************************************
  313. * 函數(shù)名         : CheckSum
  314. * 描述           : 校驗(yàn)函數(shù)
  315. * 輸入           : dat: 校驗(yàn)的數(shù)據(jù)數(shù)組
  316.                                                                          num: 校驗(yàn)的個(gè)數(shù)
  317. * 輸出           : 無(wú)
  318. * 返回           : 校驗(yàn)碼
  319. *******************************************************************************/
  320. unsigned char CheckSum(unsigned char *dat, unsigned char num)
  321. {
  322.   unsigned char bTemp = 0, i;
  323.   
  324.   for(i = 0; i < num; i ++){bTemp ^= dat[i];}
  325.   return bTemp;
  326. }

  327. /*******************************************************************************
  328. * 函數(shù)名         : IIC_SendByte
  329. * 描述           : IIC發(fā)送一字節(jié)數(shù)據(jù)
  330. * 輸入           : dat: 字節(jié)數(shù)據(jù)
  331. * 輸出           : 無(wú)
  332. * 返回           : 無(wú)
  333. *******************************************************************************/
  334. void IIC_SendByte(unsigned char dat)
  335. {
  336.     unsigned char i;
  337.        
  338.     for (i = 0; i < 8; i++)     //8位計(jì)數(shù)器
  339.     {
  340.         dat <<= 1;              //移出數(shù)據(jù)的最高位
  341.         SDA = CY;               //送數(shù)據(jù)口
  342.         SCL = 1;                //拉高時(shí)鐘線
  343.         Delay5us();             //延時(shí)
  344.         SCL = 0;                //拉低時(shí)鐘線
  345.         Delay5us();             //延時(shí)
  346.     }
  347.     IIC_RecvACK();
  348. }

  349. /*******************************************************************************
  350. * 函數(shù)名         : IIC_RecvByte
  351. * 描述           : IIC接收一字節(jié)數(shù)據(jù)
  352. * 輸入           : 無(wú)
  353. * 輸出           : 無(wú)
  354. * 返回           : 一字節(jié)數(shù)據(jù)
  355. *******************************************************************************/
  356. unsigned char IIC_RecvByte()
  357. {
  358.     unsigned char i;
  359.     unsigned char dat = 0;
  360.     SDA = 1;                    //使能內(nèi)部上拉,準(zhǔn)備讀取數(shù)據(jù),
  361.     for (i=0; i<8; i++)         //8位計(jì)數(shù)器
  362.     {
  363.         dat <<= 1;
  364.         SCL = 1;                //拉高時(shí)鐘線
  365.         Delay5us();             //延時(shí)
  366.         dat |= SDA;             //讀數(shù)據(jù)               
  367.         SCL = 0;                //拉低時(shí)鐘線
  368.         Delay5us();             //延時(shí)
  369.     }
  370.                
  371.     return dat;
  372. }

  373. /*******************************************************************************
  374. * 函數(shù)名         : IIC_SendACK
  375. * 描述           : IIC發(fā)送應(yīng)答
  376. * 輸入           : ack: 應(yīng)答位
  377. * 輸出           : 無(wú)
  378. * 返回           : 無(wú)
  379. *******************************************************************************/
  380. void IIC_SendACK(bit ack)
  381. {
  382.     SDA = ack;                  //寫(xiě)應(yīng)答信號(hào)
  383.     SCL = 1;                    //拉高時(shí)鐘線
  384.     Delay5us();                 //延時(shí)
  385.     SCL = 0;                    //拉低時(shí)鐘線
  386.     Delay5us();                 //延時(shí)
  387. }

  388. /*******************************************************************************
  389. * 函數(shù)名         : IIC_RecvACK
  390. * 描述           : IIC接收應(yīng)答
  391. * 輸入           : 無(wú)
  392. * 輸出           : 無(wú)
  393. * 返回           : 應(yīng)答位
  394. *******************************************************************************/
  395. bit IIC_RecvACK()
  396. {
  397.     SCL = 1;                    //拉高時(shí)鐘線
  398.     Delay5us();                 //延時(shí)
  399.     CY = SDA;                   //讀應(yīng)答信號(hào)
  400.     SCL = 0;                    //拉低時(shí)鐘線
  401.     Delay5us();                 //延時(shí)
  402.     return CY;
  403. }

  404. /*******************************************************************************
  405. * 函數(shù)名         : IIC_Start
  406. * 描述           : IIC起始信號(hào)
  407. * 輸入           : 無(wú)
  408. * 輸出           : 無(wú)
  409. * 返回           : 無(wú)
  410. *******************************************************************************/
  411. void IIC_Start()
  412. {
  413.     SDA = 1;                    //拉高數(shù)據(jù)線
  414.     SCL = 1;                    //拉高時(shí)鐘線
  415.     Delay5us();                 //延時(shí)
  416.     SDA = 0;                    //產(chǎn)生下降沿
  417.     Delay5us();                 //延時(shí)
  418.     SCL = 0;                    //拉低時(shí)鐘線
  419. }

  420. /*******************************************************************************
  421. * 函數(shù)名         : IIC_Stop
  422. * 描述           : IIC停止信號(hào)
  423. * 輸入           : 無(wú)
  424. * 輸出           : 無(wú)
  425. * 返回           : 無(wú)
  426. *******************************************************************************/
  427. void IIC_Stop()
  428. {
  429.     SDA = 0;                    //拉低數(shù)據(jù)線
  430.     SCL = 1;                    //拉高時(shí)鐘線
  431.     Delay5us();                 //延時(shí)
  432.     SDA = 1;                    //產(chǎn)生上升沿
  433.     Delay5us();                 //延時(shí)
  434. }

  435. /*******************************************************************************
  436. * 函數(shù)名         : Delay5us
  437. * 描述           : 延時(shí)5微秒(STC89C52RC@11.0592M)
  438.                                                                                 不同的工作環(huán)境,需要調(diào)整此函數(shù)
  439.                                                                                 當(dāng)改用1T的MCU時(shí),請(qǐng)調(diào)整此延時(shí)函數(shù)
  440. * 輸入           : 無(wú)
  441. * 輸出           : 無(wú)
  442. * 返回           : 無(wú)
  443. *******************************************************************************/
  444. void Delay5us()
  445. {
  446.         _nop_();_nop_();_nop_();_nop_();
  447.         _nop_();_nop_();_nop_();_nop_();
  448.         _nop_();_nop_();_nop_();_nop_();
  449.         _nop_();_nop_();_nop_();_nop_();
  450.         _nop_();_nop_();_nop_();_nop_();
  451.         _nop_();_nop_();_nop_();_nop_();
  452. }
復(fù)制代碼



作者: LXJ50    時(shí)間: 2017-9-18 20:43
樓主厲害!謝謝分享,下載學(xué)習(xí)。
作者: 1334022368    時(shí)間: 2018-1-3 21:54
不錯(cuò),學(xué)習(xí)了
作者: qidiao007    時(shí)間: 2019-12-18 09:57
下載了 學(xué)習(xí)!!!
作者: lozoho    時(shí)間: 2020-10-26 15:42
學(xué)習(xí)了,感謝樓主啦




歡迎光臨 (http://www.zg4o1577.cn/bbs/) Powered by Discuz! X3.1
主站蜘蛛池模板: 亚洲综合色网站 | 九色视频网站 | 亚洲色欲色欲www | 精品久久久久久久久久久下田 | 日韩精品成人免费观看视频 | 夜夜夜久久久 | 第四色狠狠 | 欧美精品1区 | 在线观看av不卡 | 午夜免费观看体验区 | 久久精品91久久久久久再现 | 国产一级特黄视频 | 午夜视频一区二区 | 一级a性色生活片久久毛片波多野 | 在线免费视频一区 | 色综合99| 天天操夜夜骑 | 国产视频欧美 | 一区二区三区精品视频 | 精产国产伦理一二三区 | 男人天堂av网站 | 亚洲欧美中文字幕在线观看 | 综合伊人| 天天曰夜夜 | 精品久久久久一区二区国产 | av国产精品毛片一区二区小说 | 日韩三级电影在线看 | 精品一区二区三区四区五区 | 免费国产一区二区 | 久久免费小视频 | 亚洲人成人网 | 日韩精品在线看 | 亚洲乱码国产乱码精品精98午夜 | 成人免费看 | 日本久久久影视 | 亚洲精品一区二区三区蜜桃久 | 久久久久久国产精品免费免费 | 国产中文字幕网 | 久久av一区二区三区 | 日韩乱码av | 亚洲一区二区久久久 |