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

標題: 求人解讀一下這段單片機代碼什么意思?如何看懂單片機程序 [打印本頁]

作者: 黑13142    時間: 2022-5-14 17:24
標題: 求人解讀一下這段單片機代碼什么意思?如何看懂單片機程序
這是論壇上一個大佬發出來的,我想學習單片機,但不知道這段代碼講的是什么意思,有沒有大佬能看懂并且給我簡單的講解一下,謝謝大家

單片機源程序如下:
/******************************************************************************
* Function:      24c02驅動
* Description:      256個尋址單元 00~ff 32頁每頁8b
* Parameter:
*
*
* Return:                                                             *
******************************************************************************/
/***************************************************
    記錄
5.5
1.二進制書寫格式010101010    前面加個0即可
*******************************************************/
#include<reg51.h>
#include"intrins.h"
typedef unsigned char uint8;
typedef char int8;
typedef unsigned int uint16;
typedef unsigned char  uchar;
sbit function=P3^5;             //按鍵信號輸入口
sbit buzzer=P3^3;               //蜂鳴器信號口
sbit dula=P2^6;                    //數碼管段選信號
sbit wela=P2^7;                    //數碼管位選信號
sbit  sda=P2^0 ;                //24c02數據信號
sbit  scl=P2^1 ;                //24c02時鐘信號
uint8 code table[]={            //數字代碼
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
float speed,mileage;                       //測得的速度 及 里程
uint8  count;                               //定時器0 中斷計數
uint8  frontcount;                           //外部中斷0  計數
/*****************************************
* Function:  微秒級延時函數
****************************************/
void us_delay( uint16 count )
{
    while( --count )
    {
        _nop_();
    }
}
/**************************************
* Function: 毫秒延時函數
***************************************/
void ms_delay(uint8 t)
{
  uint8 x,y;
  for(x=t;x>0;x--)
   for(y=110;y>0;y--);
}
/**************************************
* Function: 蜂鳴器函數
***************************************/
void beep()
{
  buzzer=0;
  ms_delay(100);
  buzzer=1;
}
/******************************************************************************
* Function:     數碼管顯示函數
* Description:  共三位數碼管,顯示速度及里程                                                                                                                           *
******************************************************************************/
void display(uint8 shu)
{
        uint8 bai,shi,ge;
        bai=shu/100;
        shi=shu%100/10;
        ge=shu%10;
        dula=1;
        P0=table[bai];         //送段選數據
        dula=0;
        P0=0xff;
        wela=1;
        P0=0x7e;             //送位選數據
        wela=0;
        ms_delay(1);
        dula=1;
        P0=table[shi];
        dula=0;
        P0=0xff;
        wela=1;
        P0=0x7d;
        wela=0;
        ms_delay(1);
        dula=1;
        P0=table[ge];
        dula=0;
        P0=0xff;
        wela=1;
        P0=0x7b;//原來是0xfb 第八位是高  現在要保證實驗班上片選信號始終為低
        wela=0;
        ms_delay(1);
}
/************************************
* Function:  24c02初始化
*************************************/
void store_init()
{
      sda=1;
      us_delay(2);
      scl=1;
      us_delay(2);

}
/************************************
* Function:  啟動信號
* Description: scl在高電平期間 sda地跳變
*************************************/
void store_start()
{
     sda=1;
     us_delay(2);
     scl=1;
     us_delay(2);
     sda=0;
     us_delay(2);
}
/************************************
* Function: 停止信號
* Description: scl在高電平期間 sda高跳變
*************************************/
void store_stop()
{
     sda=0;
     us_delay(2);
     scl=1;
     us_delay(2);
     sda=1;
     us_delay(2);
}
/************************************
* Function: 應答信號
*************************************/
void store_respons()
{
      uchar i;
      scl=1;
      us_delay(2);
      while((sda==1)&&(i<250))
       i++;
      scl=0;
      us_delay(2) ;
}
/************************************
* Function: 寫一個字節
*************************************/
void  store_write_byte(uchar date)
{
     uchar i ;
     for(i=0;i<8;i++)
     {
         scl=0;
         us_delay(2);
         sda=date&0x80;
         us_delay(2);
         scl=1;
         us_delay(2);
         date<<=1;
     }
     scl=0;                         // 在scl=1 時間段 取sda的值
     us_delay(2);
     sda=1;
     us_delay(2);
}
/************************************
* Function: 讀一個字節
************************************/
uchar store_read_byte()
{
      uchar date ,i;
      for(i=0;i<8;i++)
      {
        scl=1;
        us_delay(2) ;
        date=(date<<1)|sda;
        scl=0;
        us_delay(2) ;
      }
      return date ;
}
/************************************
* Function: 寫入指定位置  一個字節的數據
*************************************/
void store_write_add(uchar address,uchar date)
{
         store_start();
         store_write_byte(0xa0);         //最后一位0代表 方向  寫
         store_respons();
         store_write_byte(address);      //寫入的地址
         store_respons();
         store_write_byte(date);         //寫入的數據
         store_respons();
         store_stop();
}
/************************************
* Function: 讀出指定位置     一個字節的數據
*************************************/
uchar store_read_add(uchar address)
{
         uchar date;
         store_start();
         store_write_byte(0xa0);            //最后一位0代表 方向  寫
         store_respons();
         store_write_byte(address);           //寫入的地址
         store_respons();
         store_start();
         store_write_byte(0xa1);            //最后一位1代表 方向 讀
         store_respons();
         date=store_read_byte();           //讀 剛才寫入的地址內 數據
         store_stop();
         return date;
}
/************************************
* Function:    按鍵信號檢測程序
* Description: 1、按一次跳轉到里程數    2、長按清除里程數
*************************************/
void keyscan()
{
   if(function==0)
   {
        ms_delay(10);
        if(function==0)                  //短按檢測
        {
              while(!function);
              ms_delay(8);
              beep();
              mileage=store_read_add(0x00);
              display(mileage);         //顯示里程
              if(function==0)         //長按檢測
              {
                   ms_delay(50);
                   if(function==0)
                   {
                       while(!function);
                       ms_delay(8);
                       beep();
                       store_write_add(0x00,0);       //清除 AT24c02上的數據
                   }
              }
        }
   }
}
/************************************
* Function:    報警檢測程序
* Description: 當速度大于 120KM/h時  蜂鳴器響
*************************************/
void alarm()
{
    if(speed>120)
    {
       beep();
    }
}
/************************************
* Function:  初始化函數
*************************************/
void init()
{
    wela=0;
    dula=0;
    TMOD=0x01;
    TH0=(65536-50000)/256;             //    50ms計數一次
    TL0=(65536-50000)%256;
    EA=1;
    ET0=1;
    TR0=1;
     EX0=1;         //外部中斷0
    IT0=1;         //開啟外部中斷
    store_init();    //AT24c02初始化
}
void main()
{
     init();
     while(1)
     {
        display(speed);
        keyscan();
        alarm();
     }
}
/************************************
* Function:  外部中斷0  函數
*************************************/
void w0() interrupt 0
{
   frontcount++;
}
/************************************
* Function:  定時器0 中斷函數
*************************************/
void time0() interrupt 1
{
    TH0=(65536-50000)/256;
    TL0=(65536-50000)%256;
    count++;
     if(count==20)         //1秒鐘采集一次
        {
          count=0;
            speed= frontcount*2*3.14*0.3*3.6;                //速度計算 KM/h
            frontcount=0;
            mileage=mileage+frontcount*2*3.14*0.3*0.001;     //里程數 累加
            store_write_add(0x00,mileage);                  //里程數 寫入存儲器
        }
}

作者: wc86110    時間: 2022-5-14 17:24
這個是基于單片機的數碼管顯示速度里程表,有超速報警,測速主要是靠車輪轉圈數和周長來計算,存儲器保存行駛的里程 據
作者: yaoyao2022    時間: 2022-5-15 10:01
一個歷程記錄器,有點像電動車的速度里程計。1秒更新一次。帶有存儲功能。
作者: 黑13142    時間: 2022-5-15 11:29
大佬們,里面的sda,scl是什么意思,能幫忙答疑一下嗎,實在看不懂
作者: 296058967    時間: 2022-5-15 11:57
黑13142 發表于 2022-5-15 11:29
大佬們,里面的sda,scl是什么意思,能幫忙答疑一下嗎,實在看不懂

是兩線傳數據用的,一根是雙向傳輸數據,一根是時鐘線。
作者: zy0818    時間: 2022-5-15 12:06
SDA串行數據端口,scl串行時鐘,看看24C02數據手冊啊
作者: Y_G_G    時間: 2022-5-15 12:32
如果是連SDA和SCL都要解釋的話,就說明你在IIC這方面的基礎基本為0,需要去學習一下IIC相關的知識




歡迎光臨 (http://www.zg4o1577.cn/bbs/) Powered by Discuz! X3.1
主站蜘蛛池模板: www.狠狠干 | 日韩欧美一区二区三区免费观看 | 免费精品一区 | 久久新| 午夜资源| 欧美精品一 | 成人精品视频在线观看 | 91精品久久久 | 久久久久久久久久久久亚洲 | 人人澡人人射 | 欧美一区二区三区四区五区无卡码 | 久久99精品久久久久久国产越南 | 日韩视频在线免费观看 | 日韩午夜一区二区三区 | 91xx在线观看 | 国产成人av免费看 | 久草精品视频 | a亚洲精品 | 亚洲在线 | 国产丝袜人妖cd露出 | 亚洲精品久久久蜜桃 | 国产精品免费av | 日本午夜视频 | 久久国产精品-久久精品 | 成人免费在线观看 | 精品国产一区二区三区久久 | 欧美成人影院 | 成人妇女免费播放久久久 | 欧美一卡二卡在线观看 | 黄色免费在线观看 | 欧美黑人一区二区三区 | 日本精品国产 | 亚洲二区在线 | 国产成人精品久久 | 99久久日韩精品免费热麻豆美女 | 九色www| 福利视频网 | 欧美成人高清视频 | 久久精品亚洲精品国产欧美 | 日本不卡一区二区三区 | 青草青草久热精品视频在线观看 |