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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2207|回復: 6
收起左側

求人解讀一下這段單片機代碼什么意思?如何看懂單片機程序

[復制鏈接]
ID:1026518 發表于 2022-5-14 17:24 | 顯示全部樓層 |閱讀模式
500黑幣
這是論壇上一個大佬發出來的,我想學習單片機,但不知道這段代碼講的是什么意思,有沒有大佬能看懂并且給我簡單的講解一下,謝謝大家

單片機源程序如下:
/******************************************************************************
* 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);                  //里程數 寫入存儲器
        }
}

最佳答案

查看完整內容

這個是基于單片機的數碼管顯示速度里程表,有超速報警,測速主要是靠車輪轉圈數和周長來計算,存儲器保存行駛的里程 據
回復

使用道具 舉報

ID:96682 發表于 2022-5-14 17:24 來自手機 | 顯示全部樓層
這個是基于單片機的數碼管顯示速度里程表,有超速報警,測速主要是靠車輪轉圈數和周長來計算,存儲器保存行駛的里程 據
回復

使用道具 舉報

ID:1026496 發表于 2022-5-15 10:01 | 顯示全部樓層
一個歷程記錄器,有點像電動車的速度里程計。1秒更新一次。帶有存儲功能。
回復

使用道具 舉報

ID:1026518 發表于 2022-5-15 11:29 | 顯示全部樓層
大佬們,里面的sda,scl是什么意思,能幫忙答疑一下嗎,實在看不懂
回復

使用道具 舉報

ID:438843 發表于 2022-5-15 11:57 | 顯示全部樓層
黑13142 發表于 2022-5-15 11:29
大佬們,里面的sda,scl是什么意思,能幫忙答疑一下嗎,實在看不懂

是兩線傳數據用的,一根是雙向傳輸數據,一根是時鐘線。
回復

使用道具 舉報

ID:196791 發表于 2022-5-15 12:06 來自手機 | 顯示全部樓層
SDA串行數據端口,scl串行時鐘,看看24C02數據手冊啊
回復

使用道具 舉報

ID:401564 發表于 2022-5-15 12:32 | 顯示全部樓層
如果是連SDA和SCL都要解釋的話,就說明你在IIC這方面的基礎基本為0,需要去學習一下IIC相關的知識
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 激情a| 激情毛片 | 午夜婷婷激情 | 亚洲精品一区二区三区四区高清 | 精品国产欧美一区二区 | 九色视频网站 | 久久久网 | 久久久av| 国产激情精品 | 在线国产一区二区三区 | 夜夜草av| 久久精品一区 | 精品久久九 | 国产高清在线 | 日本三级网站在线 | 国产精品精品久久久 | 成人网av| 波多野结衣先锋影音 | 国产精品视频一区二区三 | 日韩精品免费在线 | 成人在线免费看 | 日韩一区二区三区精品 | 日本一本在线 | 国产精品免费一区二区三区 | 干干干操操操 | 中文视频在线 | 日本精品一区二区三区在线观看视频 | 国产日韩欧美一区 | 天堂一区二区三区 | 日韩在线观看一区 | 久久久久久国产 | 国产欧美在线播放 | 麻豆久久久9性大片 | 亚洲精品免费观看 | 日韩电影一区 | 亚洲激情一区二区三区 | 欧美午夜一区二区三区免费大片 | 四虎影院新地址 | 99tv| 精品久久久久久18免费网站 | 久久中文字幕一区 |