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

專注電子技術學習與研究
當前位置:單片機教程網 >> MCU設計實例 >> 瀏覽文章

AT89s51-AT24c02記憶秒表計時實驗

作者:佚名   來源:本站原創   點擊數:  更新時間:2011年07月06日   【字體:

 夜深了,我要的就是這種困意。白天睡覺,晚上學習。突然茫然了一下,彭宗敏說他最后會下定決心準備高考是為了計算機。

        我當初為了什么,也許是有答案的,不經意的發現,早在高二時候,我就確定我以后讀電子信息類的。路既然沒錯,就不要有任何后悔的走下去!
 


 

/**********************************************
 《郭天祥新概念51單片機》P188,有改動。
    利用定時器產生0-99計時秒表,每過1秒,將計數的
的數值寫入AT24c02,關閉電源再打開,單片機將原來
寫入的值讀出來,接著此數繼續按秒變化,并顯示在
數碼管上
**********************************************/
/**********************************************
數碼管顯示:
  數據P0 段選P2^6  位選 P2^7 
AT24C02:
  地址設置為1010111x  x為0表示寫  x為1表示讀
  SDA==P2^0  SCL==P2^1  WP接GND(表示允許讀/寫)
**********************************************/

#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
bit  write=0;    //寫24C02的標志;
sbit sda=P2^0;                         
sbit scl=P2^1;
sbit dula=P2^6;
sbit wela=P2^7;
uchar sec,tcnt; 
uchar code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
/*******************************************
                延時函數
*******************************************/
void delay()
{ ;; }

void delay1ms(uint z)
{
   uint x,y;
   for(x=z;x>0;x--)
    for(y=120;y>0;y--);
}

/*******************************************
                開始信號
*******************************************/
void start()  
{ 
 sda=1;
 delay();
 scl=1;
 delay();
 sda=0;
 delay();
}

/*******************************************
                停止信號
*******************************************/
void stop()   
{
 sda=0;
 delay();
 scl=1;
 delay();
 sda=1;
 delay();
}

/*******************************************
                應答信號
*******************************************/
void respons()  
{
 uchar i;
 scl=1;
 delay();
 while((sda==1)&&(i<250)) i++;
 scl=0;
 delay();
}
/*******************************************
              總線初始化
*******************************************/
void init()
{
 sda=1;
 delay();
 scl=1;
 delay();
}

/*******************************************
                寫入一個字節
*******************************************/
void write_byte(uchar date)
{
 uchar i,temp;
 temp=date;
 for(i=0;i<8;i++)
 {
  temp=temp<<1;
  scl=0;
     delay();
  sda=CY;
  delay();
  scl=1;
  delay();
 }
 scl=0;
 delay();
 sda=1;
 delay();
}

/*******************************************
               讀出一個字節
*******************************************/
uchar read_byte()
{
 uchar i,k;
 scl=0;
 delay();
 sda=1;
 delay();
 for(i=0;i<8;i++)
 {
  scl=1;
  delay(); 
  k=(k<<1)|sda;
  scl=0;
  delay(); 
 }
 return k;
}

/*******************************************
             指定地址寫入數據
*******************************************/
void write_add(uchar address,uchar date)
{
 start();
 write_byte(0xae);
 respons();
 write_byte(address);
 respons();
 write_byte(date);
 respons();
 stop();
}

/*******************************************
             指定地址讀出數據
*******************************************/
uchar read_add(uchar address)
{
 uchar date;
 start();
 write_byte(0xae);
 respons();
 write_byte(address);
 respons();
 start();
 write_byte(0xaf);
 respons();
 date=read_byte();
 stop();
 return date;
}

/*******************************************
                顯示程序
*******************************************/
void display(uchar bai_c,uchar sh_c) 
{
   dula=0;
   P0=table[bai_c];  //顯示第一位
   dula=1;
   dula=0;

   wela=0;
   P0=0xfe;
   wela=1;
   wela=0;

   delay1ms(5);


   dula=0;
   P0=table[sh_c];  //顯示第二位
   dula=1;
   dula=0;

   wela=0;
   P0=0xfd;
   wela=1;
   wela=0;

   delay1ms(5);
}

/*******************************************
                 MAIN
*******************************************/
void main()
{
 init();
 sec=read_add(2);    //讀出保存的數據賦于sec
 if(sec>100)        //防止首次讀取出錯誤數據
  sec=0;
 TMOD=0x01;     //定時器工作在方式1
 ET0=1; 
 EA=1;
 TH0=(65536-50000)/256; //對TH0 TL0賦值
 TL0=(65536-50000)%256; //使定時器0.05秒中斷一次
 TR0=1;                 //開始計時
 while(1)
 {
  display(sec/10,sec%10);
  if(write==1)         //判斷計時器是否計時一秒
  {
   write=0;              //清零
   write_add(2,sec);     //在24c02的地址2中寫入數據sec
  }
 } 
}

/*******************************************
        Interrupt service routine
*******************************************/
void t0() interrupt 1 //定時中斷服務函數
{
 TH0=(65536-50000)/256; //對TH0 TL0賦值
 TL0=(65536-50000)%256; //重裝計數初值
 tcnt++;             //每過50ms tcnt加一
 if(tcnt==20)        //計滿20次(1秒)時
 {
     tcnt=0;         //重新再計
     sec++;
     write=1;        //1秒寫一次24C02
     if(sec==100)//定時100秒,再從零開始計時
      sec=0;
 }
}

關閉窗口

相關文章

主站蜘蛛池模板: 手机av在线 | 久久免费精品 | 999久久久免费精品国产 | 91网站在线播放 | 九九久久久 | 色综合色综合色综合 | 91麻豆久久久| 亚洲色视频 | 国产精品1| 久久久日韩精品一区二区三区 | 国产电影精品久久 | 精品福利一区二区三区 | 久久久999成人 | 欧美 日韩 国产 成人 在线 | 久久久久国产精品 | 玖玖免费 | 男人天堂网址 | 欧美一区二区激情三区 | 综合久久av | 亚洲欧美激情国产综合久久久 | 亚洲欧美一区二区三区在线 | 又爽又黄axxx片免费观看 | 99久久精品免费视频 | 欧美国产日韩一区二区三区 | 欧美一区二 | 日韩一区二区三区在线视频 | 精品国产精品国产偷麻豆 | 在线国产小视频 | 日韩成人在线免费视频 | 日日夜夜草| 精品国产欧美 | 亚洲成人一区 | av在线一区二区三区 | 99久久影院 | 最新av在线播放 | 天天操天天摸天天爽 | 日韩午夜在线观看 | 亚洲精品4 | 欧美国产91 | 日本欧美国产在线观看 | 国产精品自在线 |