找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1386|回復(fù): 0
打印 上一主題 下一主題
收起左側(cè)

求助!單片機(jī)24C02存儲(chǔ)按鍵數(shù)值,怎么不成功呢?

[復(fù)制鏈接]
回帖獎(jiǎng)勵(lì) 1 黑幣 回復(fù)本帖可獲得 1 黑幣獎(jiǎng)勵(lì)! 每人限 1 次
跳轉(zhuǎn)到指定樓層
樓主
ID:409166 發(fā)表于 2021-1-7 10:14 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
各位老大,我想做一個(gè)按鍵計(jì)數(shù)存儲(chǔ)在2402里面再通過串口發(fā)生,也可以通過1602顯示,搞了好多天,實(shí)在搞不了,請求大神們看看我的程序好嗎?
目前已完成的功能有:
1、按鍵計(jì)數(shù)可以通過1602顯示出來。
2、按鍵計(jì)數(shù)也可以通過串口發(fā)送。
請問怎么就是不能存儲(chǔ)到24C02里面呢?2402存儲(chǔ)的程序我是參照宋雪松老師的課程改寫的,是不是哪里不對呀?
有條件的朋友可以幫忙調(diào)試下,硬件接口如下:
#define LCD1602_DB  P0
sbit LCD1602_RS = P2^7;
sbit LCD1602_RW = P2^6;
sbit LCD1602_E  = P2^5;
sbit key1=P3^2;
sbit LED=P3^3;


sbit I2C_SCL = P3^7;
sbit I2C_SDA = P3^6;


再次多謝大家了!

*****************************************/
#include <reg52.h>
#include "uart.h"
#include "lcd1602.h"
#include "I2C.h"
#include <intrins.h>

#define I2CDelay()  {_nop_();_nop_();_nop_();_nop_();}
unsigned char date;
#define uchar unsigned char
#define uint unsigned int

sbit key1=P3^2;
sbit LED=P3^3;
unsigned char count;
unsigned char dat;
   unsigned int i;
         unsigned char buf[5];
    unsigned char str[10];

unsigned char uart_buf;        //接收數(shù)據(jù)寄存器
unsigned char distate[12];//計(jì)數(shù)緩沖區(qū)數(shù)組         .




/* 函數(shù)申明 -----------------------------------------------*/
void delay(uint z);
//void Initial_com(void);

//***********************************************************

/*
********************************************************************************
** 函數(shù)名稱 : delay(uint z)
** 函數(shù)功能 : 延時(shí)函數(shù)
********************************************************************************
*/
void delay(uint z)
{                                                                                                                                                                                          
    uint i,j;
    for(i=z;i>0;i--)
        for(j=110;j>0;j--);
}


/***************************************************
*                                                                外部中斷0初始化子函數(shù)
*                                        下降沿觸發(fā),開啟INT0中斷,開總中斷
****************************************************/
void int0_init(void)
{
        IT0 = 1;                //下降沿觸發(fā)
        EX0 = 1;                //開啟INT0中斷
        EA = 1;                        //開啟總中斷
}

/* 將按鍵計(jì)數(shù)賦值給數(shù)組,便于液晶顯示---------------- */
void display()
{
          buf[1] = count/1000+0x30;
        buf[2] = count%1000/100+0x30;  //0x30就是把十進(jìn)制換成十六進(jìn)制
        buf[3] = count%1000%100/10+0x30;
        buf[4] = count%1000%100%10+'0';        // '0'=0x30
}

/* 讀取EEPROM中的一個(gè)字節(jié),addr-字節(jié)地址 */
unsigned char E2ReadByte(unsigned char addr)
{
    unsigned char dat;

    I2CStart();
    I2CWrite(0x50<<1); //尋址器件,后續(xù)為寫操作
    I2CWrite(addr);    //寫入存儲(chǔ)地址
    I2CStart();        //發(fā)送重復(fù)啟動(dòng)信號
    I2CWrite((0x50<<1)|0x01); //尋址器件,后續(xù)為讀操作
    dat = I2CReadNAK();       //讀取一個(gè)字節(jié)數(shù)據(jù)
    I2CStop();


    return dat;
}
/* 向EEPROM中寫入一個(gè)字節(jié),addr-字節(jié)地址 */
void E2WriteByte(unsigned char addr, unsigned char dat)
{
    I2CStart();
    I2CWrite(0x50<<1); //尋址器件,后續(xù)為寫操作
    I2CWrite(addr);    //寫入存儲(chǔ)地址
    I2CWrite(dat);     //寫入一個(gè)字節(jié)數(shù)據(jù)
    I2CStop();

}

/* E2讀取函數(shù),buf-數(shù)據(jù)接收指針,addr-E2中的起始地址,len-讀取長度 */
void E2Read(unsigned char *buf, unsigned char addr, unsigned char len)
{
    do {                       //用尋址操作查詢當(dāng)前是否可進(jìn)行讀寫操作
        I2CStart();
        if (I2CWrite(0x50<<1)) //應(yīng)答則跳出循環(huán),非應(yīng)答則進(jìn)行下一次查詢
        {
            break;
        }
        I2CStop();
    } while(1);
    I2CWrite(addr);            //寫入起始地址
    I2CStart();                //發(fā)送重復(fù)啟動(dòng)信號
    I2CWrite((0x50<<1)|0x01);  //尋址器件,后續(xù)為讀操作
    while (len > 1)            //連續(xù)讀取len-1個(gè)字節(jié)
    {
        *buf++ = I2CReadACK(); //最后字節(jié)之前為讀取操作+應(yīng)答
        len--;
    }
    *buf = I2CReadNAK();       //最后一個(gè)字節(jié)為讀取操作+非應(yīng)答
    I2CStop();
}
/* E2寫入函數(shù),buf-源數(shù)據(jù)指針,addr-E2中的起始地址,len-寫入長度 */
void E2Write(unsigned char *buf, unsigned char addr, unsigned char len)
{
    while (len--)
    {
        do {                       //用尋址操作查詢當(dāng)前是否可進(jìn)行讀寫操作
            I2CStart();
            if (I2CWrite(0x50<<1)) //應(yīng)答則跳出循環(huán),非應(yīng)答則進(jìn)行下一次查詢
            {
                break;
            }
            I2CStop();
        } while(1);
        I2CWrite(addr++);  //寫入起始地址
        I2CWrite(*buf++);  //寫入一個(gè)字節(jié)數(shù)據(jù)
        I2CStop();         //結(jié)束寫操作,以等待寫入完成
    }
}



//*************************
//**********主函數(shù)*********
//*************************
main()
{         
           
         UART_INIT(); // 串口初始化
         int0_init() ; // 外部中斷初始化
         InitLcd1602();
        
         while(1)
         {         
                  E2Read(buf, 0x22, sizeof(buf));   //從E2中讀取一段數(shù)據(jù)
            display();                                                  // 將按鍵計(jì)數(shù)賦值給數(shù)組,便于液晶顯示
        LcdShowStr(0, 0, "ji shu :");     //顯示在液晶上
            LcdShowStr(1,1,&buf[1]);                   //buf數(shù)量里面對應(yīng)count,是外部中斷得到的按計(jì)數(shù)
                E2Write(buf, 0x22, sizeof(buf));  //再寫回到E2中

        // while(1);
         }
}

   /***************************************************
*                                                                中斷響應(yīng)子函數(shù)
*                                        響應(yīng)外部中斷0,按鍵低電平一次就加一,中斷標(biāo)志位自動(dòng)清零
****************************************************/
void int0_process() interrupt 0
{


                            dat+=1;          //進(jìn)入一次中斷 就加一次
                           count = dat;
                                while(key1 == 0);
                                delay(200);
                                IE0 = 0;     //        外部中斷標(biāo)志位

                        //        uart_send_byte(count)        ;        // 發(fā)送按鍵次數(shù)到串口
                        //        delay(200);
}        


/***************************************************
*                                                                中斷服務(wù)子函數(shù)
*                                   清除RI,同時(shí)判斷接到的數(shù)據(jù)
****************************************************/
void uart(void) interrupt 4
{
//        unsigned char uart_buf;        //接收數(shù)據(jù)寄存器
        if(RI)                                                            //是否收到數(shù)據(jù)
         {
                RI=0;                                                           //清中斷請求
                uart_buf = SBUF;
                if(uart_buf == 0xaa)        //判斷
           {
            uart_send_byte(count)        ;        // 發(fā)送按鍵次數(shù)到串口
                delay(200);
           }
                if(uart_buf == 0x11)        //判斷
                 {
                  //uart_send_byte(count)        ;        // 發(fā)送按鍵次數(shù)到串口  
                  LED =0;                                                 //         (在這里和串口中斷都可以發(fā)送數(shù)據(jù)的,區(qū)別:是否連續(xù))
                  delay(200);
                 }
           if(uart_buf == 0x22)        //判斷
            {
                 //uart_send_byte(count)        ;        // 發(fā)送按鍵次數(shù)到串口
                 LED =1;
                 delay(200);
                 }
        
           
         }
}
               



24C02存儲(chǔ)求助.rar

131.22 KB, 下載次數(shù): 2

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

使用道具 舉報(bào)

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

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表