資源簡介
BLE藍牙使用例子,可以參考使用,兄弟們反正分數不多,自己用著就好,里面有IIC和串口透傳的例子

代碼片段和文件信息
#include?
#include?“MY51.H“
sbit?sda=P2^0; //總線連接口定義
sbit?scl=P2^1; //總線連接口定義
void?delay250us()? //需要4個機器周期大概4.34us
{
for(?unsigned?char?i=0;i<250;i++?)
{
_nop_();
??} //晶振頻率11.0592M機器周期為1.085微秒
}
void?iic_start()??//啟動信號
{
sda=1;
scl=1;
delayus(); //sda和scl同為高電平保持4.7us以上
_nop_(); //1.085us共5.78us下面sda=0是下降沿不能計算在延時時間中
sda=0;? //下降沿
delayus(); //sda低電平保持4us以上 這里是4.34us滿足要求
}
void?iic_stop() //停止信號
{
sda=0;_nop_(); //準備狀態
scl=1;
delayus(); //該狀態穩定時間要求保持4us以上
sda=1; //scl高電平期間sda來一個上升沿
delayus(); //sda保持4.7us以上4.34加上函數返回時間大于4.7us
//注:此時scl和sda都為1
}
void?iic_sendByte(uchar?byteData)?//mcu發送一個字節
{
uchar?i;
uchar?temp=byteData;
for(i=0;i<8;i++)
{
temp=temp<<1;???//移動后最高位到了PSW寄存器的CY位中
scl=0; ?//準備
_nop_(); ????//穩定一下
sda=CY; ?//將待發送的數據一位位的放到sda上
_nop_();
scl=1;???? ?//每一個高電平期間ic器件都會將數據取走
_nop_();
}
scl=0; //如果寫成scl=1;sda=1就是停止信號不能這么寫
_nop_();
sda=1; //釋放總線數據總線不用時要釋放
_nop_();
}
uchar?iic_readByte()?//讀一個字節
{
uchar?itemp;
scl=0; //準備讀數據
_nop_();
sda=1; //釋放總線
_nop_();
for(i=0;i<8;i++)
{
scl=1; //mcu開始取數據
delayus(); //scl為高電平后ic器件就會將1位數據送到sda上
//總共用時不會大于4.34us的然后就可以讓mcu讀sda了
temp=(temp<<1)|sda;?//讀一位保存到temp中
scl=0;
delayus();
}
return?temp;
}
bool?iic_checkACK() //處理應答信號
{
uchar?errCounts=255;?//定義超時量為255次
scl=1;
_nop_();
while(sda)
{ //在一段時間內檢測到sda=0的話認為是應答信號
if(0==errCounts)
{
scl=0; ??//鉗住總線
_nop_();
return?false;?//沒有應答信號
}
errCounts--;
}
scl=0; ??//鉗住總線為下1次通信做準備?
_nop_();
return?true; ??//成功處理應答信號
}
void?iic_init() //總線初始化
{
scl=1;
sda=1;
delayus();
}
void?iic_sendACK(bool?b_ACK) //發送應答或非應答信號
{
scl=0; //準備
_nop_();
if(b_ACK) //ACK
{
sda=0;
}
else ???//unACK
{
sda=1;
}
_nop_();
scl=1;
delayus();? //大于4us的延時
scl=0;?? ?? //鉗住scl以便繼續接收數據
_nop_();
}
void?IIC_writeByte(uchar?addressuchar?dataByte)//向24c02寫一字節數據
{
iic_start();
iic_sendByte(0xa0);//mcu寫控制字前4位固定1010后三位地址0末位0是寫
iic_checkACK(); ???//mcu處理應答信號
iic_sendByte(address);??//準備在指定地址處寫入
iic_checkACK();
iic_sendByte(dataByte);?//寫數據
iic_checkACK();
iic_stop();
delayms(2);
//按字節寫入時24c02在接收到停止信號后將數據擦寫到內部這需要時間
//并且在這段時間內不會響應總線上的任何請求故讓mcu有2毫秒以上的等待
}
void?IIC_writeData(uchar?addressuchar?numBytesuchar*?buf)//寫入任意長度數據
{
while(numBytes--)
{
IIC_writeByte(address++*buf++);
}
}
void?IIC_readData(uchar?beginAddruchar?dataSizeuchar*?buf)//讀取任意長度字節
{
iic_start(); //起始信號
iic_sendByte(0xa0); //控制字寫
iic_checkACK(); //處理應答信號
iic_sendByte(beginAddr); //發送地址
iic_checkACK(); //處理應答信號
iic_start(); ??? //發送起始信號
iic_sendByte(0xa1); //控制字讀
iic_checkACK(); //處理應答信號
while(dataSize--) //讀取dataSize個字節
{
*buf++=iic_readByte(); //讀取一個個字節并保存到緩沖區buf中
iic_sendACK(dataSize);??//發送應答當dataSize為
?屬性????????????大小?????日期????時間???名稱
-----------?---------??----------?-----??----
?????目錄???????????0??2018-03-15?08:55??IIC例子\
?????文件????????4775??2017-10-16?22:27??IIC例子\JDY-16?IIC使用例子.c
?????目錄???????????0??2018-03-15?08:55??串口例子\
?????文件????????2772??2017-11-19?22:05??串口例子\JDY-16?串口例子.c
- 上一篇:數控加工切削用量計算器V2.0
- 下一篇:使用命令行升級texlive宏包.pdf
評論
共有 條評論