標(biāo)題:
數(shù)碼管顯示寫入AT24C02的一個(gè)字節(jié)數(shù)據(jù)。
[打印本頁]
作者:
zjc666321
時(shí)間:
2018-7-3 19:18
標(biāo)題:
數(shù)碼管顯示寫入AT24C02的一個(gè)字節(jié)數(shù)據(jù)。
采用STC89C52芯片,12MHZ晶振。
歡迎大家交流,并提出意見。
程序:
#include<reg52.h>
#include<intrins.h>
#define uint unsigned int
#define uchar unsigned char
sbit we=P2^7; //數(shù)碼管位選
sbit du=P2^6; //數(shù)碼管段選
sbit scl=P2^1; //scl
sbit sda=P2^0; //sda
uchar n; //定義讀取AT24C02里面的數(shù)據(jù)
/*共陰極數(shù)碼管段選信號(hào)和位選信號(hào)*/
uchar code table[ ]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //數(shù)字0-9段選碼
uchar code smgwe[ ]={0xfe,0xfd,0xfb}; //位選碼
/*毫秒級(jí)延時(shí)函數(shù)*/
void delay(uint z)
{
uint x,y;
for(x=100;x>0;x--)
for(y=z;y>0;y--);
}
/*數(shù)碼管顯示*/
void display(uchar n)
{
while(1)
{
P0 = 0xff; // 清除斷碼
we = 1;//打開位選
P0 =smgwe[0] ;//1111 1110 只選通第一位數(shù)碼管
we = 0; //關(guān)閉位選
du = 1; //打開段選
P0 = table[n/100]; //顯示百位
du = 0; //關(guān)閉段選
delay(5);//延時(shí)5毫秒
P0 = 0xff; // 清除斷碼
we = 1; //打開位選
P0 =smgwe[1] ;//1111 1101 只選通第二位數(shù)碼管
we = 0; //關(guān)閉位選
du = 1;//打開段選
P0 = table[(n/10)%10]; //顯示十位
du = 0; //關(guān)閉段選
delay(5);//延時(shí)5毫秒
P0 = 0xff; // 清除斷碼
we = 1; //打開位選
P0 = smgwe[2];//1111 1011 只選通第二位數(shù)碼管
we = 0; //關(guān)閉位選
du = 1;//打開段選
P0 = table[n%10]; //顯示個(gè)位
du = 0; //關(guān)閉段選
delay(5);//延時(shí)5毫秒
}
}
/*5微秒延時(shí)函數(shù)*/
void delay5us()
{
_nop_();
}
/*IIC開始信號(hào)*/
void I2cstart()
{
scl=1;
_nop_(); //延時(shí)一個(gè)機(jī)器周期穩(wěn)定一下
sda=1;
delay5us();
sda=0;
delay5us();
}
/*IIC停止信號(hào)*/
void I2cstop()
{
sda=0;
_nop_();
scl=1;
delay5us();
sda=1;
delay5us();
}
/*檢測(cè)從機(jī)應(yīng)答*/
bit readback()
{
//scl=0;
scl=1;
delay5us();
if(sda)//非應(yīng)答
{
scl=0;//拉低時(shí)鐘總線
_nop_();
//sda=0;
return(0); //非應(yīng)答,返回0
}
else //應(yīng)答
{
scl=0;//拉低時(shí)鐘總線,以便后面數(shù)據(jù)傳輸,SCl為低,允許SDA數(shù)據(jù)變化
_nop_();
return(1);//應(yīng)答,返回1
}
}
/*主機(jī)發(fā)送應(yīng)答和非應(yīng)答*/
void sendback(bit i)
{
scl=0; //拉低時(shí)鐘總線允許SDA數(shù)據(jù)總線上的數(shù)據(jù)變化
_nop_();// 讓總線穩(wěn)定
if(i)
sda=0;
else
sda=1;
_nop_(); //讓sda穩(wěn)定一下
scl=1; //拉高時(shí)鐘總線,讓從機(jī)從SDA上讀取數(shù)據(jù)
delay5us();
scl=0; //拉低時(shí)鐘總線, 占用總線繼續(xù)通信,因?yàn)閟cl為低,sda才可以變化,才可以發(fā)送數(shù)據(jù)
//如果scl為高,sda就不能變化,一變化就成了開始和停止信號(hào)了
_nop_(); //穩(wěn)定延時(shí)一下
sda=1; //釋放sda數(shù)據(jù)總線
_nop_(); //穩(wěn)定延時(shí)一下
}
/*發(fā)送一個(gè)字節(jié)*/
void I2csendbite(uchar m)
{
uchar i;
for(i=0;i<8;i++)
{
scl=0;
_nop_();
if(m&0x80)//如果最高為為1
{
sda=1; //sda置1,即發(fā)送數(shù)據(jù)1
_nop_();
}
else
{
sda=0; //sda為0,發(fā)送數(shù)據(jù)0
_nop_();
}
scl=1;//scl置1,從機(jī)可以讀取總線sda上的數(shù)據(jù)
_nop_();
m=m<<1; //左移一位,于是傳輸一字節(jié)數(shù)據(jù)中的下一位數(shù)據(jù)
}
scl=0; //拉低時(shí)鐘總線, 使總線繼續(xù)通信
_nop_();
sda=1; //釋放SDA數(shù)據(jù)總線。
_nop_();
}
/*I2C 讀一字節(jié)*/
uchar I2creadbite()
{
uchar i,DAT;
// bit a;
scl = 0;
_nop_();
sda= 1;
_nop_();
for(i=0;i<8;i++)
{
scl = 1;
_nop_();
if (sda)
{
DAT |= 0x01; //
}
else
{
DAT &= 0xfe; //1111 1110
}
_nop_();
scl = 0 ;
_nop_();
if(i < 7)
{
DAT = DAT << 1;
}
}
return(DAT);
}
bit I2c24c02write(uchar ADDR, DAT)
{
I2cstart();
I2csendbite(0xa0+0); //器件地址+0,表示寫
if( !readback( ))
{
return(0);
}
I2csendbite(ADDR); //從哪個(gè)地址寫入數(shù)據(jù)
if( !readback( ))
{
return(0);
}
I2csendbite(DAT);
if( !readback( ))
{
return(0);
}
I2cstop();
return(1);
}
uchar I2c24c02read(uchar ADDR)
{
uchar DAT;
I2cstart();
I2csendbite(0xa0+0);//I2c發(fā)送一個(gè)字節(jié)
if( !readback( ))
{
return(0);
}
I2csendbite(ADDR); //從哪個(gè)存儲(chǔ)單元讀取數(shù)據(jù),例如AT24C02的話,有256個(gè)字節(jié)存儲(chǔ)單元(256*8=2048位。)ADDR可以是0-255之間的數(shù)。
//如果是PCF8591的話,ADDR就是控制字,控制字假如為0000 0010.則讀取通道2上的模擬量轉(zhuǎn)化為的數(shù)字量。
sendback(0);
I2cstart();
I2csendbite(0xa0+1);
if( !readback( ))
{
return(0);
}
DAT=I2creadbite();
sendback(0);//發(fā)送一個(gè)非應(yīng)答
I2cstop();
return(DAT);
}
void main()
{
I2cstart();
I2c24c02write(3, 122);
delay(100);//等從機(jī)處理好
n=I2c24c02read(3);
display(n);
}
屏幕截圖(9).png
(274.79 KB, 下載次數(shù): 88)
下載附件
2018-7-3 19:15 上傳
Proteus仿真圖
作者:
admin
時(shí)間:
2018-7-3 19:51
好資料,51黑有你更精彩!!!支持原創(chuàng)
作者:
sunnywe
時(shí)間:
2020-5-9 10:57
很棒對(duì)于初學(xué)者來著給了很多幫助,謝謝
作者:
大山兒子20@
時(shí)間:
2023-11-16 17:10
好資料,如果能提供下載鏈接就更好了……
作者:
haide1998
時(shí)間:
2024-5-6 21:34
路過學(xué)習(xí),謝謝分享!
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1