久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2031|回復: 0
打印 上一主題 下一主題
收起左側

STC單片機74HC164數碼管顯示數字加減儲存EEPROM實驗

[復制鏈接]
跳轉到指定樓層
樓主
ID:140644 發表于 2021-1-26 07:00 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
2018年做無線通訊下位機測試的例程
保證好用,新手可以參考

/*無線通訊從機板74HC164串口輸出測試***/
/*2018 8 20  21:00 PAST CODE674  1-99*/
/***按鍵設置從機地址EEPROM 存儲    ***/
              #include     <REG52.H>
              #include     <intrins.H>
              #define      uint unsigned int  
              #define      uchar unsigned char
              uchar        code tab[10]={0X03,0X9F,0X25,0X0D,0X99,0X49,0X41,0X1F,0X01,0X09};
              #define      CMD_IDLE    0         //空閑模式
              #define      CMD_READ    1         //IAP字節讀命令
              #define      CMD_PROGRAM 2         //IAP字節編程命令
              #define      CMD_ERASE   3         //IAP扇區擦除命令
              #define      ENABLE_IAP  0x82      //if SYSCLK<20MHz
              #define      IAP_ADDRESS 0x0000    //EEPROM首地址
              typedef      unsigned char BYTE;
              typedef      unsigned int WORD;
              uchar        kcounter,kstatus;     //按鍵計數標志 按鍵狀態標志
              uchar        v;                    /*從機號*/
              int          count;
              int          time=0;
              sbit         OUT1=P1^3;            /****輸出***/
              sbit         CLK=P1^1;
              sbit         SDA=P1^0;
              sbit         KEY_ADD=P3^6;
              sbit         KEY_DEC=P3^7;
              sbit         KEY_SET=P1^4;
              sbit         KEY_ENTER=P3^3;
              void         delay(uint k);        /****延時****/
              void         timer0() interrupt 1
              {
               TH0=0X53;
               TL0=0X32;
               time++;
               if(time==2)
               {
                count++;
                time=0;
               }
              }  
/*------------------------------------------*/
              void delay(uint t)
              {
              uint i,j;
              for(i=0;i<t;i++)
              for(j=0;j<10;j++);
              }
/*---------------延時子程序----------------*/
              void delay1 (uint ms)
              {
              uint i,j;
              for(i=0;i<ms;i++)
              for(j=0;j<1000;j++)
              ;
              }   
/*----關閉IAP----------------------------*/
              void IapIdle()
              {
              IAP_CONTR=0;                       //關閉IAP功能
              IAP_CMD=0;                         //清除命令寄存器
              IAP_TRIG=0;                        //清除觸發寄存器
              IAP_ADDRH=0X80;                    //將地址設置到非IAP區域
              IAP_ADDRL=0;
              }
/*-從ISP/IAP/EEPROM區域讀取一字節-*/
              BYTE IapReadByte(WORD addr)
              {
              BYTE dat;                          //數據緩沖區
              IAP_CONTR=ENABLE_IAP;              //使能IAP
              IAP_CMD=CMD_READ;                  //設置IAP命令
              IAP_ADDRL=addr;                    //設置IAP低地址
              IAP_ADDRH=addr>>8;                 //設置IAP高地址
              IAP_TRIG=0x5a;                     //寫觸發命令(0x5a)
              IAP_TRIG=0xa5;                     //寫觸發命令(0xa5)
              _nop_();                           //等待ISP/IAP/EEPROM操作完成
              dat=IAP_DATA;                      //讀ISP/IAP/EEPROM數據
              IapIdle();                         //關閉IAP功能
              return dat;                        //返回
              }
/*-寫一字節數據到ISP/IAP/EEPROM區域-*/
              void IapProgramByte(WORD addr, BYTE dat)
              {
              IAP_CONTR=ENABLE_IAP;              //使能IAP
              IAP_CMD=CMD_PROGRAM;               //設置IAP命令
              IAP_ADDRL=addr;                    //設置IAP低地址
              IAP_ADDRH=addr>>8;                 //設置IAP高地址
              IAP_DATA=dat;                      //寫ISP/IAP/EEPROM數據
              IAP_TRIG=0x5a;                     //寫觸發命令(0x5a)
              IAP_TRIG=0xa5;                     //寫觸發命令(0xa5)
              _nop_();                           //等待ISP/IAP/EEPROM操作完成
              IapIdle();
              }
/*---扇區擦除---------------*/
              void IapEraseSector(WORD addr)
              {
              IAP_CONTR=ENABLE_IAP;              //使能IAP val=IapReadByte(IAP_ADDRESS+1);
              IAP_CMD=CMD_ERASE;                 //設置IAP命令
              IAP_ADDRL=addr;                    //設置IAP低地址
              IAP_ADDRH=addr>>8;                 //設置IAP高地址
              IAP_TRIG=0x5a;                     //寫觸發命令(0x5a)
              IAP_TRIG=0xa5;                     //寫觸發命令(0xa5)
              _nop_();                           //等待ISP/IAP/EEPROM操作完成
              IapIdle();
              }
/*-----------------------------------------*/
              void red_eeprom(void)
              {
              uchar t_data,b_data;    //
              t_data=IapReadByte(IAP_ADDRESS);   //十位
              b_data=IapReadByte(IAP_ADDRESS+1); //個位
              v=t_data*10+b_data;
              }
/***************************************/              
              void write_eeprom(uchar dat)
              {
              uchar Tdata,Bdata;                 //
              Tdata=dat/10;
              Bdata=dat-Tdata*10;
              IapEraseSector(IAP_ADDRESS);       //扇區擦除      
              IapProgramByte(IAP_ADDRESS,Tdata); /*寫入十位*/
              IapProgramByte(IAP_ADDRESS+1,Bdata);/*寫入小數*/
              }            
/*------------------------------------------*/
              void ind_light_disp(uchar buff)    //點亮哪一位就置1
              {
              uchar j,sbuff;
              bit s;
              sbuff=buff;
               for(j=0;j<8;j++)                  //移動8位
               {
               s=sbuff&0x01;                     //位變量等于緩沖區最低位
                if(s==1)                         //最低位等于1
                {
                CLK=0;                           //此處與下面的CLK = 1結合產生一個上升沿
                SDA=0;
                CLK=1;
                }
                else
                {
                CLK=0;
                SDA=1;
                CLK=1;
                }
                delay(10);
                sbuff=sbuff>>1;                  //右移一次
               }
               delay(10);
              }
/*------------------------------------------*/
              void display(uchar val)
              {   
              uchar ss;                          /*緩沖*/
              ss=(tab[(val%100)/10]);            /*十位*/
              ind_light_disp(ss);
              ss=(tab[val%10]);                  /*個位*/
              ind_light_disp(ss);
              }
/******************************************/
              void key_reset()
              {
              kcounter=0;                        //計數器歸零
              kstatus=0;                         //狀態計數器歸零
              delay1(50);
              }
/******************************************/
              void Key_ValAdd()
              {
              kcounter++;                        //按鍵計數器加一
              kstatus++;                         //按鍵狀態標志加一
              delay1(50);
              }
/******************************************/
              void Key_Clear()
              {
              kcounter++;                        //按鍵計數器加一
              kstatus=0;                         //按鍵狀態標志歸零
              }
/*------------------主循環程序----------------*/      
              void   main( )                     /*主程序開始*/
              {                                  /**加一**/
              SCON=0X00;
              ES=0;
              AUXR=0X80;                         //STC系列的1T 設置
              TMOD=0X01;
              TH0=0X53;
              TL0=0X32;
              EA=1;
              ET0=1;
              TR0=1;
              P1=255;
              red_eeprom();
              display(v);
              while(1)
              {
               key_reset();
               if(!KEY_ADD)                      //脈沖系數加
               {
                for(;kcounter<5;)                //按鍵循環5次
                {
                 if(!KEY_ADD)                    //按鍵低電平
                 {
                 Key_ValAdd();                     //按鍵低電平 計數器加一狀態標志加一
                 }
                 else if(~!KEY_ADD)              //按鍵高電平
                 {
                 Key_Clear();                    //按鍵計數器加一    狀態標志歸零
                 }
                }
               if(kstatus>=3)                    /*按鍵狀態標志大于等于3為有效值*/
               {  
               v++;   
               if(v>99)
               v=0;
               write_eeprom(v);
               display(v);
               delay1(50);
               }
              }
                key_reset();
              if(!KEY_DEC)                       //脈沖系數加
               {
                for(;kcounter<5;)                //按鍵循環5次
                {
                 if(!KEY_DEC)                    //按鍵低電平
                 {
                 Key_ValAdd();                     //按鍵低電平 計數器加一狀態標志加一
                 }
                 else if(~!KEY_DEC)              //按鍵高電平
                 {
                 Key_Clear();                    //按鍵計數器加一    狀態標志歸零
                 }
                }
                if(kstatus>=3)                   /*按鍵狀態標志大于等于3為有效值*/
                {  
                v-=1;   
                if(v<1)
                v=99;
                write_eeprom(v);
                display(v);
                delay1(50);
                }
               }
              }
             }
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏4 分享淘帖 頂 踩
回復

使用道具 舉報

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

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 免费观看黄a一级视频 | 久久一区二区三区四区 | 国产片侵犯亲女视频播放 | 欧美在线激情 | 亚洲成人国产综合 | 国产精品一区久久久 | 成年人免费看的视频 | 一区二区三区四区国产 | 天堂中文在线播放 | 国产精品美女久久久 | 日本免费一区二区三区 | 日韩欧美大片在线观看 | aaaaaaa片毛片免费观看 | 日日夜夜天天综合 | 91精品国产91久久久久游泳池 | 亚洲一区二区av | 日韩在线xx| 激情五月婷婷综合 | 人人干人人玩 | 免费在线观看av网站 | 日本一级淫片免费啪啪3 | 国产一区二区小视频 | 欧美一区二区三区在线观看 | 欧美一级久久 | 精品亚洲一区二区三区 | av高清 | 97伦理电影 | 国产小视频自拍 | 久久大| 免费观看黄a一级视频 | 国产一区久久 | 91视频三区| 中文字幕精品一区 | 五月天天丁香婷婷在线中 | 国产精品国产成人国产三级 | 日本 欧美 国产 | 黄网免费 | 成人激情视频网 | 高清视频一区二区三区 | 日韩aⅴ视频 | 国产女人与拘做视频免费 |