久久久久久久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)
2017-9-18 16:44 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
/******************** (C) COPYRIGHT 2015 ********************
* 文件名 : main.c
* 作者 : 優(yōu)靈電子開(kāi)發(fā)團(tuán)隊(duì)
* 版本 : V3.1.0.0
* 日期 : 2015-5-10
* 描述 : 接收來(lái)自串口的簡(jiǎn)單數(shù)據(jù),給模塊用IIC發(fā)送對(duì)應(yīng)命令,執(zhí)行成功后
直接通過(guò)串口返回?cái)?shù)據(jù)。
* 技術(shù)支持 : QQ: 3419865840
********************************************************************************/
/* 包含文件 -------------------------------------------------------------------*/
#include"main.h"
#include<intrins.h>
/* 類型定義 -------------------------------------------------------------------*/
typedef struct _CMD
{
unsigned char Buffer[32];
unsigned char Point;
unsigned char RecFlag;
}CMD;
/* 宏定義 ---------------------------------------------------------------------*/
#define SlaveAddress 0X00
/* 本文件使用的變量 -----------------------------------------------------------*/
sbit SCL = P1^7;
sbit SDA = P1^6;
CMD Cmd;
/* 本文件使用的函數(shù)聲明 -------------------------------------------------------*/
void Delay5us();
void IIC_Start();
void IIC_Stop();
void IIC_SendByte(unsigned char dat);
unsigned char IIC_RecvByte();
void IIC_SendACK(bit ack);
bit IIC_RecvACK();
unsigned char CheckSum(unsigned char *dat, unsigned char num);
void ClearBuffer(void);
void Command(void);
/* 本文件函數(shù)體 ---------------------------------------------------------------*/
/*******************************************************************************
* 函數(shù)名 : main
* 描述 : 主函數(shù)
* 輸入 : 無(wú)
* 輸出 : 無(wú)
* 返回 : 無(wú)
*******************************************************************************/
void main(void)
{
//串口初始化,單片機(jī)型號(hào)STC89C52RC,晶振是11.0592M,波特率9600
SCON = 0X50;
TMOD = 0X20;
TH1 = TL1 = 0XFD;
TR1 = 1;
while(1)
{
if(RI)
{
RI = 0;
//一鍵讀卡命令
if(SBUF == 0x10)
{
Cmd.Buffer[0] = 0x03; //命令長(zhǎng)度
Cmd.Buffer[1] = 0x00; //地址
Cmd.Buffer[2] = 0x10; //命令字
Command();
//正確時(shí)返回10字節(jié)
//0.命令長(zhǎng)度 為0x0A
//1.命令字節(jié)為0x90
//2.執(zhí)行狀態(tài)為0
//3.4.卡類型
//5.6.7.8卡號(hào)
//錯(cuò)誤時(shí)返回3字節(jié)
//0.命令長(zhǎng)度為0x03
//1.命令字為0x90
//2.執(zhí)行狀態(tài)可能是0xfe,0xff
}
//讀塊數(shù)據(jù)
else if(SBUF == 0X11)
{
Cmd.Buffer[0] = 0x04; //命令長(zhǎng)度
Cmd.Buffer[1] = 0x00; //地址
Cmd.Buffer[2] = 0x11; //命令字
Cmd.Buffer[3] = 0x01; //塊號(hào)
Command();
}
//寫(xiě)塊數(shù)據(jù)
else if(SBUF == 0X12)
{
Cmd.Buffer[0] = 0x14;//命令長(zhǎng)度
Cmd.Buffer[1] = 0x00;//地址
Cmd.Buffer[2] = 0x12;//命令字
Cmd.Buffer[3] = 0x01;//塊號(hào)
Cmd.Buffer[4] = 0x00;//數(shù)據(jù)
Cmd.Buffer[5] = 0x11;
Cmd.Buffer[6] = 0x22;
Cmd.Buffer[7] = 0x33;
Cmd.Buffer[8] = 0x44;
Cmd.Buffer[9] = 0x55;
Cmd.Buffer[10] = 0x66;
Cmd.Buffer[11] = 0x77;
Cmd.Buffer[12] = 0x88;
Cmd.Buffer[13] = 0x99;
Cmd.Buffer[14] = 0xAA;
Cmd.Buffer[15] = 0xBB;
Cmd.Buffer[16] = 0xCC;
Cmd.Buffer[17] = 0xDD;
Cmd.Buffer[18] = 0xEE;
Cmd.Buffer[19] = 0xFF;
Command();
}
//辦卡
else if(SBUF == 0X13)
{
Cmd.Buffer[0] = 0x09;//命令長(zhǎng)度
Cmd.Buffer[1] = 0x00;//地址
Cmd.Buffer[2] = 0x13;//命令字
Cmd.Buffer[3] = 0x01;//塊號(hào)
Cmd.Buffer[4] = 0x00;//固定為0
Cmd.Buffer[5] = 0x00;//四字節(jié)數(shù)據(jù)
Cmd.Buffer[6] = 0x00;
Cmd.Buffer[7] = 0x00;
Cmd.Buffer[8] = 0x00;
Command();
}
//恢復(fù)卡
else if(SBUF == 0X14)
{
Cmd.Buffer[0] = 0x07;//命令長(zhǎng)度
Cmd.Buffer[1] = 0x00;//地址
Cmd.Buffer[2] = 0x14;//命令字
Cmd.Buffer[3] = 0x01;//塊號(hào)
Cmd.Buffer[4] = 0x38;//固定
Cmd.Buffer[5] = 0x52;//固定
Cmd.Buffer[6] = 0x7A;//固定
Command();
}
//充值
else if(SBUF == 0X15)
{
Cmd.Buffer[0] = 0x08;//長(zhǎng)度
Cmd.Buffer[1] = 0x00;//地址
Cmd.Buffer[2] = 0x15;//命令字
Cmd.Buffer[3] = 0x01;//塊號(hào)
Cmd.Buffer[4] = 0x00;//四字節(jié)數(shù)值
Cmd.Buffer[5] = 0x00;
Cmd.Buffer[6] = 0x00;
Cmd.Buffer[7] = 0x00;
Command();
}
//扣款
else if(SBUF == 0X16)
{
Cmd.Buffer[0] = 0x08;//長(zhǎng)度
Cmd.Buffer[1] = 0x00;//地址
Cmd.Buffer[2] = 0x16;//命令字
Cmd.Buffer[3] = 0x01;//塊號(hào)
Cmd.Buffer[4] = 0x00;//四字節(jié)數(shù)值
Cmd.Buffer[5] = 0x00;
Cmd.Buffer[6] = 0x00;
Cmd.Buffer[7] = 0x00;
Command();
}
//裝載密碼
else if(SBUF == 0X2B)
{
Cmd.Buffer[0] = 0x15;//長(zhǎng)度
Cmd.Buffer[1] = 0x00;//地址
Cmd.Buffer[2] = 0x2B;//命令字
Cmd.Buffer[3] = 0xFF;//6字節(jié)密鑰A
Cmd.Buffer[4] = 0xFF;
Cmd.Buffer[5] = 0xFF;
Cmd.Buffer[6] = 0xFF;
Cmd.Buffer[7] = 0xFF;
Cmd.Buffer[8] = 0xFF;
Cmd.Buffer[9] = 0xFF;//6字節(jié)密鑰B
Cmd.Buffer[10] = 0xFF;
Cmd.Buffer[11] = 0xFF;
Cmd.Buffer[12] = 0xFF;
Cmd.Buffer[13] = 0xFF;
Cmd.Buffer[14] = 0xFF;
Cmd.Buffer[15] = 0x00;//密鑰模式
Cmd.Buffer[16] = 0x03;//固定03
Cmd.Buffer[17] = 0x08;//固定08
Cmd.Buffer[18] = 0x05;//固定05
Cmd.Buffer[19] = 0x02;//固定02
Cmd.Buffer[20] = 0x07;//固定07
Command();
}
//設(shè)置波特率
else if(SBUF == 0X2C)
{
Cmd.Buffer[0] = 0x0A;//長(zhǎng)度
Cmd.Buffer[1] = 0x00;//地址
Cmd.Buffer[2] = 0x2C;//命令字
Cmd.Buffer[3] = 0x00;//四字節(jié)波特率(19200)
Cmd.Buffer[4] = 0x00;
Cmd.Buffer[5] = 0x4B;
Cmd.Buffer[6] = 0x00;
Cmd.Buffer[7] = 0x98;//固定98
Cmd.Buffer[8] = 0x24;//固定24
Cmd.Buffer[9] = 0x31;//固定31
Command();
}
//設(shè)置地址
else if(SBUF == 0X2D)
{
Cmd.Buffer[0] = 0x07;//長(zhǎng)度
Cmd.Buffer[1] = 0x00;//地址
Cmd.Buffer[2] = 0x2D;//命令字
Cmd.Buffer[3] = 0x01;//新地址
Cmd.Buffer[4] = 0x37;//固定37
Cmd.Buffer[5] = 0x21;//固定21
Cmd.Buffer[6] = 0x56;//固定56
Command();
}
//設(shè)置工作模式
else if(SBUF == 0X2E)
{
Cmd.Buffer[0] = 0x0D;//長(zhǎng)度
Cmd.Buffer[1] = 0x00;//地址
Cmd.Buffer[2] = 0x2E;//命令字
Cmd.Buffer[3] = 0x00;//模式
Cmd.Buffer[4] = 0x0A;//模式+0A
Cmd.Buffer[5] = 0x01;//塊號(hào)
Cmd.Buffer[6] = 0x00;//四字節(jié)操作值
Cmd.Buffer[7] = 0x00;
Cmd.Buffer[8] = 0x00;
Cmd.Buffer[9] = 0x01;
Cmd.Buffer[10] = 0x23;//固定23
Cmd.Buffer[11] = 0x12;//固定12
Cmd.Buffer[12] = 0x54;//固定54
Command();
}
}
}
}
/*******************************************************************************
* 函數(shù)名 : Command
* 描述 : 執(zhí)行命令,發(fā)送IIC數(shù)據(jù),接收IIC數(shù)據(jù),串口發(fā)出
* 輸入 : 無(wú)
* 輸出 : 無(wú)
* 返回 : 無(wú)
*******************************************************************************/
void Command(void)
{
unsigned char i;
//校驗(yàn)
Cmd.Buffer[Cmd.Buffer[0]] = CheckSum(Cmd.Buffer, Cmd.Buffer[0]);
//開(kāi)始發(fā)送
IIC_Start();
IIC_SendByte(SlaveAddress);
for(i = 0; i < Cmd.Buffer[0] + 1; i++)
{
IIC_SendByte(Cmd.Buffer[i]);
}
IIC_Stop();
ClearBuffer();
//開(kāi)始接收
IIC_Start();
IIC_SendByte(SlaveAddress|0x01);
do
{
//模塊正忙時(shí)為返回7F
Cmd.Buffer[0] = IIC_RecvByte();
IIC_SendACK(0);
}while(Cmd.Buffer[0] == 0x7F);
for(i = 0; i < Cmd.Buffer[0]-1; i++)
{
Cmd.Buffer[i+1] = IIC_RecvByte();
IIC_SendACK(0);
}
Cmd.Buffer[i+1] = IIC_RecvByte();
IIC_SendACK(1);
IIC_Stop();
//開(kāi)始從串口發(fā)送
for(i = 0; i < Cmd.Buffer[0] + 1; i++)
{
SBUF = Cmd.Buffer[i];TI = 0; while(TI == 0);
}
}
/*******************************************************************************
* 函數(shù)名 : ClearBuffer
* 描述 : 清除緩存
* 輸入 : 無(wú)
* 輸出 : 無(wú)
* 返回 : 無(wú)
*******************************************************************************/
void ClearBuffer(void)
{
unsigned char i;
for(i = 0; i < 32; i++)
{
Cmd.Buffer[i] = 0;
}
}
/*******************************************************************************
* 函數(shù)名 : CheckSum
* 描述 : 校驗(yàn)函數(shù)
* 輸入 : dat: 校驗(yàn)的數(shù)據(jù)數(shù)組
num: 校驗(yàn)的個(gè)數(shù)
* 輸出 : 無(wú)
* 返回 : 校驗(yàn)碼
*******************************************************************************/
unsigned char CheckSum(unsigned char *dat, unsigned char num)
{
unsigned char bTemp = 0, i;
for(i = 0; i < num; i ++){bTemp ^= dat[i];}
return bTemp;
}
/*******************************************************************************
* 函數(shù)名 : IIC_SendByte
* 描述 : IIC發(fā)送一字節(jié)數(shù)據(jù)
* 輸入 : dat: 字節(jié)數(shù)據(jù)
* 輸出 : 無(wú)
* 返回 : 無(wú)
*******************************************************************************/
void IIC_SendByte(unsigned char dat)
{
unsigned char i;
for (i = 0; i < 8; i++) //8位計(jì)數(shù)器
{
dat <<= 1; //移出數(shù)據(jù)的最高位
SDA = CY; //送數(shù)據(jù)口
SCL = 1; //拉高時(shí)鐘線
Delay5us(); //延時(shí)
SCL = 0; //拉低時(shí)鐘線
Delay5us(); //延時(shí)
}
IIC_RecvACK();
}
/*******************************************************************************
* 函數(shù)名 : IIC_RecvByte
* 描述 : IIC接收一字節(jié)數(shù)據(jù)
* 輸入 : 無(wú)
* 輸出 : 無(wú)
* 返回 : 一字節(jié)數(shù)據(jù)
*******************************************************************************/
unsigned char IIC_RecvByte()
{
unsigned char i;
unsigned char dat = 0;
SDA = 1; //使能內(nèi)部上拉,準(zhǔn)備讀取數(shù)據(jù),
for (i=0; i<8; i++) //8位計(jì)數(shù)器
{
dat <<= 1;
SCL = 1; //拉高時(shí)鐘線
Delay5us(); //延時(shí)
dat |= SDA; //讀數(shù)據(jù)
SCL = 0; //拉低時(shí)鐘線
Delay5us(); //延時(shí)
}
return dat;
}
/*******************************************************************************
* 函數(shù)名 : IIC_SendACK
* 描述 : IIC發(fā)送應(yīng)答
* 輸入 : ack: 應(yīng)答位
* 輸出 : 無(wú)
* 返回 : 無(wú)
*******************************************************************************/
void IIC_SendACK(bit ack)
{
SDA = ack; //寫(xiě)應(yīng)答信號(hào)
SCL = 1; //拉高時(shí)鐘線
Delay5us(); //延時(shí)
SCL = 0; //拉低時(shí)鐘線
Delay5us(); //延時(shí)
}
/*******************************************************************************
* 函數(shù)名 : IIC_RecvACK
* 描述 : IIC接收應(yīng)答
* 輸入 : 無(wú)
* 輸出 : 無(wú)
* 返回 : 應(yīng)答位
*******************************************************************************/
bit IIC_RecvACK()
{
SCL = 1; //拉高時(shí)鐘線
Delay5us(); //延時(shí)
CY = SDA; //讀應(yīng)答信號(hào)
SCL = 0; //拉低時(shí)鐘線
Delay5us(); //延時(shí)
return CY;
}
/*******************************************************************************
* 函數(shù)名 : IIC_Start
* 描述 : IIC起始信號(hào)
* 輸入 : 無(wú)
* 輸出 : 無(wú)
* 返回 : 無(wú)
*******************************************************************************/
void IIC_Start()
{
SDA = 1; //拉高數(shù)據(jù)線
SCL = 1; //拉高時(shí)鐘線
Delay5us(); //延時(shí)
SDA = 0; //產(chǎn)生下降沿
Delay5us(); //延時(shí)
SCL = 0; //拉低時(shí)鐘線
}
/*******************************************************************************
* 函數(shù)名 : IIC_Stop
* 描述 : IIC停止信號(hào)
* 輸入 : 無(wú)
* 輸出 : 無(wú)
* 返回 : 無(wú)
*******************************************************************************/
void IIC_Stop()
{
SDA = 0; //拉低數(shù)據(jù)線
SCL = 1; //拉高時(shí)鐘線
Delay5us(); //延時(shí)
SDA = 1; //產(chǎn)生上升沿
Delay5us(); //延時(shí)
}
/*******************************************************************************
* 函數(shù)名 : Delay5us
* 描述 : 延時(shí)5微秒(STC89C52RC@11.0592M)
不同的工作環(huán)境,需要調(diào)整此函數(shù)
當(dāng)改用1T的MCU時(shí),請(qǐng)調(diào)整此延時(shí)函數(shù)
* 輸入 : 無(wú)
* 輸出 : 無(wú)
* 返回 : 無(wú)
*******************************************************************************/
void Delay5us()
{
_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();
}
復(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
|
亚洲一区二区久久久
|