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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

STC51單片機IIC例程

[復制鏈接]
跳轉到指定樓層
樓主
ID:233894 發表于 2017-9-18 16:44 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
初學51單片機,請多關照
代碼下載:
51 IIC示例.zip (65.27 KB, 下載次數: 62)

  1. /******************** (C) COPYRIGHT 2015 ********************
  2. * 文件名          : main.c
  3. * 作者            : 優靈電子開發團隊
  4. * 版本            : V3.1.0.0
  5. * 日期            : 2015-5-10
  6. * 描述            : 接收來自串口的簡單數據,給模塊用IIC發送對應命令,執行成功后
  7.                                                                                 直接通過串口返回數據。
  8. * 技術支持        : 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. /* 本文件使用的函數聲明 -------------------------------------------------------*/
  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. /* 本文件函數體 ---------------------------------------------------------------*/

  38. /*******************************************************************************
  39. * 函數名         : main
  40. * 描述           : 主函數
  41. * 輸入           : 無
  42. * 輸出           : 無
  43. * 返回           : 無
  44. *******************************************************************************/
  45. void main(void)
  46. {
  47.         //串口初始化,單片機型號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;        //命令長度
  62.                                 Cmd.Buffer[1] = 0x00;        //地址
  63.                                 Cmd.Buffer[2] = 0x10; //命令字
  64.                                
  65.                                 Command();
  66.                                 //正確時返回10字節
  67.                                 //0.命令長度 為0x0A
  68.                                 //1.命令字節為0x90
  69.                                 //2.執行狀態為0
  70.                                 //3.4.卡類型
  71.                                 //5.6.7.8卡號
  72.                                 //錯誤時返回3字節
  73.                                 //0.命令長度為0x03
  74.                                 //1.命令字為0x90
  75.                                 //2.執行狀態可能是0xfe,0xff
  76.                         }
  77.                         //讀塊數據
  78.                         else if(SBUF == 0X11)
  79.                         {
  80.                                 Cmd.Buffer[0] = 0x04;        //命令長度
  81.                                 Cmd.Buffer[1] = 0x00; //地址
  82.                                 Cmd.Buffer[2] = 0x11; //命令字
  83.                                 Cmd.Buffer[3] = 0x01; //塊號
  84.                                
  85.                                 Command();
  86.                         }
  87.                         //寫塊數據
  88.                         else if(SBUF == 0X12)
  89.                         {
  90.                                 Cmd.Buffer[0] = 0x14;//命令長度
  91.                                 Cmd.Buffer[1] = 0x00;//地址
  92.                                 Cmd.Buffer[2] = 0x12;//命令字
  93.                                 Cmd.Buffer[3] = 0x01;//塊號
  94.                                 Cmd.Buffer[4] = 0x00;//數據
  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;//命令長度
  117.                                 Cmd.Buffer[1] = 0x00;//地址
  118.                                 Cmd.Buffer[2] = 0x13;//命令字
  119.                                 Cmd.Buffer[3] = 0x01;//塊號
  120.                                 Cmd.Buffer[4] = 0x00;//固定為0
  121.                                 Cmd.Buffer[5] = 0x00;//四字節數據
  122.                                 Cmd.Buffer[6] = 0x00;
  123.                                 Cmd.Buffer[7] = 0x00;
  124.                                 Cmd.Buffer[8] = 0x00;
  125.                                
  126.                                 Command();
  127.                         }
  128.                         //恢復卡
  129.                         else if(SBUF == 0X14)
  130.                         {
  131.                                 Cmd.Buffer[0] = 0x07;//命令長度
  132.                                 Cmd.Buffer[1] = 0x00;//地址
  133.                                 Cmd.Buffer[2] = 0x14;//命令字
  134.                                 Cmd.Buffer[3] = 0x01;//塊號
  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;//長度
  145.                                 Cmd.Buffer[1] = 0x00;//地址
  146.                                 Cmd.Buffer[2] = 0x15;//命令字
  147.                                 Cmd.Buffer[3] = 0x01;//塊號
  148.                                 Cmd.Buffer[4] = 0x00;//四字節數值
  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;//長度
  158.                                 Cmd.Buffer[1] = 0x00;//地址
  159.                                 Cmd.Buffer[2] = 0x16;//命令字
  160.                                 Cmd.Buffer[3] = 0x01;//塊號
  161.                                 Cmd.Buffer[4] = 0x00;//四字節數值
  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;//長度
  172.                                 Cmd.Buffer[1] = 0x00;//地址
  173.                                 Cmd.Buffer[2] = 0x2B;//命令字
  174.                                 Cmd.Buffer[3] = 0xFF;//6字節密鑰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字節密鑰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.                         //設置波特率
  196.                         else if(SBUF == 0X2C)
  197.                         {
  198.                                 Cmd.Buffer[0] = 0x0A;//長度
  199.                                 Cmd.Buffer[1] = 0x00;//地址
  200.                                 Cmd.Buffer[2] = 0x2C;//命令字
  201.                                 Cmd.Buffer[3] = 0x00;//四字節波特率(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.                         //設置地址
  212.                         else if(SBUF == 0X2D)
  213.                         {
  214.                                 Cmd.Buffer[0] = 0x07;//長度
  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.                         //設置工作模式
  225.                         else if(SBUF == 0X2E)
  226.                         {
  227.                                 Cmd.Buffer[0] = 0x0D;//長度
  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;//塊號
  233.                                 Cmd.Buffer[6] = 0x00;//四字節操作值
  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. * 函數名         : Command
  248. * 描述           : 執行命令,發送IIC數據,接收IIC數據,串口發出
  249. * 輸入           : 無
  250. * 輸出           : 無
  251. * 返回           : 無
  252. *******************************************************************************/
  253. void Command(void)
  254. {
  255.         unsigned char i;
  256.        
  257.         //校驗
  258.         Cmd.Buffer[Cmd.Buffer[0]] = CheckSum(Cmd.Buffer, Cmd.Buffer[0]);
  259.         //開始發送
  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.         //開始接收
  272.         IIC_Start();
  273.         IIC_SendByte(SlaveAddress|0x01);
  274.        
  275.         do
  276.         {
  277.                 //模塊正忙時為返回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.         //開始從串口發送
  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. * 函數名         : ClearBuffer
  299. * 描述           : 清除緩存
  300. * 輸入           : 無
  301. * 輸出           : 無
  302. * 返回           : 無
  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. * 函數名         : CheckSum
  314. * 描述           : 校驗函數
  315. * 輸入           : dat: 校驗的數據數組
  316.                                                                          num: 校驗的個數
  317. * 輸出           : 無
  318. * 返回           : 校驗碼
  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. * 函數名         : IIC_SendByte
  329. * 描述           : IIC發送一字節數據
  330. * 輸入           : dat: 字節數據
  331. * 輸出           : 無
  332. * 返回           : 無
  333. *******************************************************************************/
  334. void IIC_SendByte(unsigned char dat)
  335. {
  336.     unsigned char i;
  337.        
  338.     for (i = 0; i < 8; i++)     //8位計數器
  339.     {
  340.         dat <<= 1;              //移出數據的最高位
  341.         SDA = CY;               //送數據口
  342.         SCL = 1;                //拉高時鐘線
  343.         Delay5us();             //延時
  344.         SCL = 0;                //拉低時鐘線
  345.         Delay5us();             //延時
  346.     }
  347.     IIC_RecvACK();
  348. }

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

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

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

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

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

  435. /*******************************************************************************
  436. * 函數名         : Delay5us
  437. * 描述           : 延時5微秒(STC89C52RC@11.0592M)
  438.                                                                                 不同的工作環境,需要調整此函數
  439.                                                                                 當改用1T的MCU時,請調整此延時函數
  440. * 輸入           : 無
  441. * 輸出           : 無
  442. * 返回           : 無
  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. }
復制代碼


評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

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

使用道具 舉報

沙發
ID:164988 發表于 2017-9-18 20:43 | 只看該作者
樓主厲害!謝謝分享,下載學習。
回復

使用道具 舉報

板凳
ID:271078 發表于 2018-1-3 21:54 | 只看該作者
不錯,學習了
回復

使用道具 舉報

地板
ID:258676 發表于 2019-12-18 09:57 | 只看該作者
下載了 學習!!!
回復

使用道具 舉報

5#
ID:317362 發表于 2020-10-26 15:42 | 只看該作者
學習了,感謝樓主啦
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: av网站免费观看 | 中文字字幕一区二区三区四区五区 | 91看片免费版 | 日韩中文一区 | 免费视频99 | 色婷婷在线视频 | 一区精品视频 | 97久久久 | 成人在线小视频 | 成av在线 | 午夜视频一区二区 | 日韩欧美国产一区二区三区 | 久久乐国产精品 | 欧美日韩亚洲视频 | 国产精品视频二区三区 | 亚洲一区二区视频 | 九九热精品在线视频 | 中文字幕在线视频观看 | 亚洲精品九九 | 亚洲天堂精品久久 | 国产精品免费在线 | 在线午夜 | 91久操网| 国产成人综合av | 国产一区二区a | 在线亚洲免费 | 久久99精品久久久久久国产越南 | 国产日韩精品久久 | 亚洲视频中文 | 日韩中文在线观看 | 米奇成人网 | 欧美日韩国产高清 | 亚洲免费在线 | 久久精彩视频 | 亚洲国产成人精品女人久久久 | 欧美国产日韩一区二区三区 | 亚洲欧美一区二区三区情侣bbw | 国产大学生情侣呻吟视频 | 色视频欧美 | 99在线精品视频 | jav成人av免费播放 |