|
是設(shè)計(jì)一個(gè)紅外計(jì)數(shù)器的,就差這個(gè)計(jì)數(shù)器計(jì)數(shù)的保存 存到AT24C02里面好像就最多就255,一到256就清零了
初學(xué)者有很多不太懂,at24c02 程序是直接搬書里的 我覺得關(guān)鍵就在我寫的那個(gè)中斷1那里 有大神可以幫看看程序嗎
單片機(jī)源程序如下:
- #include <reg52.h> //51頭文件
- # include <intrins.h>
- #define uchar unsigned char//宏定義
- #define uint unsigned int //宏定義
- #define AT24C02_ADDR 0xa0 //AT24C02地址
- sbit we = P2^7; //位定義數(shù)碼管位選鎖存器接口
- sbit du = P2^6; //位定義數(shù)碼管段選鎖存器接口
- sbit SDA = P2^0;
- sbit SCL = P2^1;
- sbit key = P2^5;//清零鍵
- sbit LED = P1^2;//指示燈,若燈亮說明IIC數(shù)據(jù)寫入成功
- long uint n;
- void delay_5us()
- {
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- }
- /*1Ms延時(shí)*/
- void delay(uint z)
- {
- uint x,y;
- for(x = z; x > 0; x--)
- for(y = 114; y > 0 ; y--);
- }
- /*I2C初始化*/
- void I2C_init()
- {
- SDA = 1;
- _nop_();
- SCL = 1;
- _nop_();
- }
- /*I2C起始信號(hào)*/
- void I2C_Start()
- {
- SCL = 1;
- _nop_();
- SDA = 1;
- delay_5us();
- SDA = 0;
- delay_5us();
- }
- /*I2C終止信號(hào)*/
- void I2C_Stop()
- {
- SDA = 0;
- _nop_();
- SCL = 1;
- delay_5us();
- SDA = 1;
- delay_5us();
- }
- /*主機(jī)發(fā)送應(yīng)答*/
- void Master_ACK(bit i)
- {
- SCL = 0; // 拉低時(shí)鐘總線允許SDA數(shù)據(jù)總線上的數(shù)據(jù)變化
- _nop_(); // 讓總線穩(wěn)定
- if (i) //如果i = 1 那么拉低數(shù)據(jù)總線 表示主機(jī)應(yīng)答
- {
- SDA = 0;
- }
- else
- {
- SDA = 1; //發(fā)送非應(yīng)答
- }
- _nop_();//讓總線穩(wěn)定
- SCL = 1;//拉高時(shí)鐘總線 讓從機(jī)從SDA線上讀走 主機(jī)的應(yīng)答信號(hào)
- delay_5us();
- SCL = 0;//拉低時(shí)鐘總線, 占用總線繼續(xù)通信
- _nop_();
- SDA = 1;//釋放SDA數(shù)據(jù)總線。
- _nop_();
- }
- /*檢測(cè)從機(jī)應(yīng)答*/
- bit Test_ACK()
- {
- SCL = 1;
- delay_5us();
- if (SDA)
- {
- SCL = 0;
- _nop_();
- I2C_Stop();
- return(0);
- }
- else
- {
- SCL = 0;
- _nop_();
- return(1);
- }
- }
- /*發(fā)送一個(gè)字節(jié)*/
- void I2C_send_byte(uchar byte)
- {
- uchar i;
- for(i = 0 ; i < 8 ; i++)
- {
- SCL = 0;
- _nop_();
- if (byte & 0x80)
- {
- SDA = 1;
- _nop_();
- }
- else
- {
- SDA = 0;
- _nop_();
- }
- SCL = 1;
- _nop_();
- byte <<= 1; // 0101 0100B
- }
- SCL = 0;
- _nop_();
- SDA = 1;
- _nop_();
- }
- /*I2C 讀一字節(jié)*/
- uchar I2C_read_byte()
- {
- uchar dat,i;
- 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);
- }
- /*I2C發(fā)送數(shù)據(jù)*/
- bit I2C_TransmitData(uchar ADDR, DAT)
- {
- I2C_Start();
- I2C_send_byte(AT24C02_ADDR+0);
- if (!Test_ACK())
- {
- return(0);
- }
- I2C_send_byte(ADDR);
- if (!Test_ACK())
- {
- return(0);
- }
- I2C_send_byte(DAT);
- if (!Test_ACK())
- {
- return(0);
- }
- I2C_Stop();
- return(1);
- }
- /*I2C接收數(shù)據(jù)*/
- uchar I2C_ReceiveData(uchar ADDR)
- {
- uchar DAT;
- I2C_Start();
- I2C_send_byte(AT24C02_ADDR+0);
- if (!Test_ACK()) //檢測(cè)從機(jī)應(yīng)答
- {
- return(0);
- }
- I2C_send_byte(ADDR); //發(fā)送需要讀取的數(shù)據(jù)所在的地址
- Master_ACK(0);
- I2C_Start();
- I2C_send_byte(AT24C02_ADDR+1);
- if (!Test_ACK())
- {
- return(0);
- }
- DAT = I2C_read_byte();
- Master_ACK(0); //主機(jī)發(fā)應(yīng)答
- I2C_Stop();
- return(DAT);
- }
- //數(shù)碼管段選表
- uchar code leddata[]={
- 0x3F, //"0"
- 0x06, //"1"
- 0x5B, //"2"
- 0x4F, //"3"
- 0x66, //"4"
- 0x6D, //"5"
- 0x7D, //"6"
- 0x07, //"7"
- 0x7F, //"8"
- 0x6F, //"9"
- };
- uchar code WS[]={
- 0x7f,
- 0xbf,
- 0xdf,
- 0xef,
- 0xf7,
- 0xfb,
- 0xfd,
- 0xfe //1111 1110
- };
- void T0_int() interrupt 1
- {
- n++;
- TH0 = 65535/256; //重裝初值
- TL0 = 65535%256; //從15536開始計(jì)數(shù)
- if(!I2C_TransmitData(6,n%1000)); //往AT24C02第255個(gè)單元中寫入數(shù)據(jù),1000 0000的2進(jìn)制為3個(gè)八位,16進(jìn)制為0x98 96 80,1000 0000%256=80;低八位
- delay(5);
- if(!I2C_TransmitData(5,n/1000%1000)); //往AT24C02第255個(gè)單元中寫入數(shù)據(jù),1000 0000的2進(jìn)制為3個(gè)八位,16進(jìn)制為0x98 96 80,1000 0000%256=80;低八位
- delay(5);
- if(!I2C_TransmitData(4,n/1000/1000)); //往AT24C02第255個(gè)單元中寫入數(shù)據(jù),1000 0000的2進(jìn)制為3個(gè)八位,16進(jìn)制為0x98 96 80,1000 0000%256=80;高八位
- delay(5);
- if(n>10000000) //計(jì)數(shù)次數(shù)達(dá)到1000W
- {
- P2 = WS[13]; //數(shù)碼管顯示E代表計(jì)數(shù)已達(dá)上限
- P0 = leddata[1];
- }
- }
- void INT0_int() interrupt 2
- {
- if(!I2C_TransmitData(6,0)); //往AT24C02第255個(gè)單元中寫入數(shù)據(jù),1000 0000的2進(jìn)制為3個(gè)八位,16進(jìn)制為0x98 96 80,1000 0000%256=80;低八位
- delay(5);
- if(!I2C_TransmitData(5,0)); //往AT24C02第255個(gè)單元中寫入數(shù)據(jù),1000 0000的2進(jìn)制為3個(gè)八位,16進(jìn)制為0x98 96 80,1000 0000%256=80;低八位
- delay(5);
- if(!I2C_TransmitData(4,0)); //往AT24C02第255個(gè)單元中寫入數(shù)據(jù),1000 0000的2進(jìn)制為3個(gè)八位,16進(jìn)制為0x98 96 80,1000 0000%256=80;高八位
- delay(5);
- }
- void main()
- {
- uchar a,b,c,d,e,f,g,h,i,j,k;
- TH0 = 65535/256;
- TL0 = 65535%256; //從15536開始計(jì)數(shù)
- TMOD = 0x05 ;//設(shè)置T0為計(jì)數(shù)器模式,工作方式1,16位計(jì)數(shù)器
- TR0 = 1; //啟動(dòng)T0
- EA = 1;
- EX1 = 1;
- IT1 = 1;
- ET0 = 1;//允許T0溢出中斷
- I2C_init();//I2C初始化
- while(1)
- {
- i = I2C_ReceiveData(4);//從AT24C02單元中讀取數(shù)據(jù),高八位
- j = I2C_ReceiveData(5);//從AT24C02單元中讀取數(shù)據(jù),中八位
- k = I2C_ReceiveData(6);//從AT24C02單元中讀取數(shù)據(jù),低八位
- n = i*10000+j*100+k;
- a = n%10;
- b = n/10%10;
- c = n/100%10;
- d = n/1000%10;
- e = n/10000%10;
- f = n/100000%10;
- g = n/1000000%10;
- h = n/10000000;
- P0 = WS[0];
- we = 1;//打開位選
- we = 0; //關(guān)閉位選
- P0 = leddata[a];
- du = 1; //打開段選
- du = 0; //關(guān)閉段選
- delay(2);//延時(shí)
-
- we = 1; //打開位選
- P0 = WS[1];//1111 1101 只選通第二位數(shù)碼管
- we = 0; //關(guān)閉位選
-
- P0 = leddata[b]; //顯示2
- du = 1;//打開段選
- du = 0; //關(guān)閉段選
- delay(2);//延時(shí)
-
- P0 = WS[2];// 1111 1011只選通第三位數(shù)碼管
- we = 1; //打開位選
- we = 0; //關(guān)閉位選
-
- P0 = leddata[c]; //顯示3
- du = 1;//打開段選
- du = 0; //關(guān)閉段選
- delay(2);//延時(shí)
-
- P0 = WS[3];//1111 0111 只選通第四位數(shù)碼管
- we = 1; //打開位選
- we = 0; //關(guān)閉位選
-
- P0 = leddata[d]; //顯示4
- du = 1;//打開段選
- du = 0; //關(guān)閉段選
- delay(2);//延時(shí)
-
- P0 = WS[4];//1110 1111 只選通第五位數(shù)碼管
- we = 1; //打開位選
- we = 0; //關(guān)閉位選
-
- P0 = leddata[e];
- du = 1;//打開段選
- du = 0; //關(guān)閉段選
- delay(2);//延時(shí)
-
- P0 = WS[5];//1101 1111 只選通第六位數(shù)碼管
- we = 1; //打開位選
- we = 0; //關(guān)閉位選
-
- P0 = leddata[f]; //顯示6
- du = 1;//打開段選
- du = 0; //關(guān)閉段選
- delay(2);//延時(shí)
-
- we = 1; //打開位選
- P0 = WS[6];//1011 1111 只選通第七位數(shù)碼管
- we = 0; //關(guān)閉位選
-
- P0 = leddata[g];
- du = 1;//打開段選
- du = 0; //關(guān)閉段選
- delay(2);//延時(shí)
-
- P0 = WS[7];//0111 1111 只選通第八位數(shù)碼管
- we = 1; //打開位選
- we = 0; //關(guān)閉位選
-
- P0 = leddata[h];
- du = 1;//打開段選
- du = 0; //關(guān)閉段選
- delay(2);//延時(shí)
- }
- }
復(fù)制代碼
|
|