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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

51數控

[復制鏈接]
跳轉到指定樓層
樓主
ID:115908 發表于 2016-4-22 13:15 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
/*#include"reg51.h"
#define uchar unsigned char
#define uint unsigned int
sbit PWM=P1^0;
sbit DEC=P1^1;
sbit INC=P1^2;
sbit seg=P1^3;
sbit cp=P1^4;
sbit DAT=P1^5;
uint high;
bit stop;

uchar tab[16] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};

void delayms(uchar n)
{   uchar i,j,k;
        for(i=0;i<n;i++)
          for(j=0;j<100;j++)
            for(k=0;k<5;k++);
}

void delay(uint N)
{        while(--N);
}

void writebyte_164(uchar Dat)
{        uchar temp,i;
        temp=Dat;
        for(i=0;i<8;i++)
        { cp=0;
          if(temp&0x80) DAT=1;
          else DAT=0;
          cp=1;
          temp<<=1;
        }
}

void main()
{   PWM=0;
        seg=0;
        EX0=1;
        IT0=1;
        EA=1;
        writebyte_164(tab[0]);
        writebyte_164(tab[0]);
        writebyte_164(tab[0]);
        seg=1;
        while(!stop);
        while(1)
        { PWM=1;
          delay(high);
          PWM=0;
          delay(300-high);
        }
}

void int0()interrupt 0
{        PWM=0;
        if(!stop) stop=1;
        if(!DEC) high-=10;
        if(!INC) high+=10;
        seg=0;
        writebyte_164(tab[high/2%10]);
        writebyte_164(tab[high/2%100/10]|0x80);
        writebyte_164(tab[high/2/100]);
        seg=1;
        delayms(255);
}        */
#include"reg51.h"
#include"intrins.h"     //_nop_();延時函數用
#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long
sbit PWM=P1^0;
sbit DEC=P1^1;
sbit INC=P1^2;
sbit seg=P1^3;
sbit cp=P1^4;
sbit DAT=P1^5;

sbit sda=P2^0;          //數據線
sbit scl=P2^1;          //時鐘線

uint high;
bit flag;

uchar tab[16] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};


void delayms(uchar n)
{   uchar i,j,k;
        for(i=0;i<n;i++)
          for(j=0;j<100;j++)
            for(k=0;k<5;k++);
}

void delay(uint N)
{        while(--N);
}

//**************************************************************************************************
//啟動(SCL為高,SDA由高變為低是一個開始條件)
//**************************************************************************************************
void start()  
{       
        sda=1;    //數據線置高,
        _nop_();  //延時
        scl=1;    //時鐘線置高
        _nop_();  //延時
        sda=0;    //數據線置低,由高變低
        _nop_();  //延時
        scl=0;    //時鐘線置低,準備發送或接收數據,總線進入忙狀態(I2C總線在空閑狀態時,SDA與SCL均被置高)
        _nop_();  //延時
}
//**************************************************************************************************
//停止(SCL為高,SDA由低變為高是一個結束條件)
//**************************************************************************************************
void stop()   
{
        sda=0;                   //數據線置低
        _nop_();                 //延時
        scl=1;                   //時鐘線置高
        _nop_();                 //延時
        sda=1;                   //數據線置高,由低變高
        _nop_();                 //延時
}
//**************************************************************************************************
//檢測應答(所有的地址和數據字都是以8bit,在第9個時鐘周期,從器件發出"0"信號來作為收到一個字的應答信號)
//**************************************************************************************************
void checkACK()                   //主器件檢測從器件是否返回應答
{
        scl=1;                        //時鐘線置高
        _nop_();                      //延時
        while(sda==1);                //等待第9個時鐘周期器件發出的響應信號"0"
        scl=0;                        //時鐘線置低
        _nop_();                      //延時
}
//**************************************************************************************************
//發送應答(發送方為主器件,接收方為從器件,控制器作為從器件接收完1數據時,發送應答信號
//**************************************************************************************************
void sendACK(bit ACK)                  
{
    if(ACK)sda=1;            //如果i位為1則發送1,即發送"非應答信號"
      else sda=0;            //如果i位為0則發送0,即發送"應答信號"       
    scl=1;                   //時鐘線置高,給一個脈沖
        _nop_();                 //延時
        scl=0;                   //時鐘線置低
        _nop_();                 //延時
}
//**************************************************************************************************
//寫一字節
//**************************************************************************************************
void send_byte(uchar date)       //寫一個8位字
{
        uchar i,temp;                //定義局部變量
        temp=date;                   //待發8位數據賦予temp
        for(i=0;i<8;i++)             //循環8次,每次寫入1位,從最高位開始發送
        {
        if(temp&0x80)sda=1;      //如果temp最高位為1則發送1
          else sda=0;            //如果temp最高位為0則發送0
            _nop_();                 //延時
                scl=1;                   //給一個脈沖,發送sda當前這位數據
                _nop_();                 //延時,需大于4us(參考數據手冊時序圖)
                _nop_();              
                _nop_();                 
                _nop_();                 
                _nop_();               
                scl=0;                   //時鐘線置低,準備下一脈沖
            _nop_();                 //延時,需大于4.7us(參考數據手冊時序圖)
                _nop_();              
                _nop_();                 
                _nop_();                 
                _nop_();  
                temp=temp<<1;            //左移1位,準備好下1位待發送的數據
        }
        checkACK();                  //查詢是否返回應答信號
}
//**************************************************************************************************
//讀一字節
//**************************************************************************************************
uchar receive_byte()         //讀一個8位字
{
        uchar i,temp;            //定義局部變量
        sda=1;                   //設置數據線為輸入
        _nop_();                 //延時
        for(i=0;i<8;i++)         //循環8次,每次讀取1位,從最高位開始接收
        {
                scl=1;               //給一脈沖,準備發送1位數據            
                _nop_();             //延時,需大于4us(參考數據手冊時序圖)
                _nop_();              
                _nop_();                 
                _nop_();                 
                _nop_();
                temp=(temp<<1)|sda;  //讀取1位數據,放在temp最低位
                scl=0;               //準備給下1個脈沖
            _nop_();             //延時,需大于4.7us(參考數據手冊時序圖)
                _nop_();              
                _nop_();                 
                _nop_();                 
                _nop_();      
        }
        return temp;             //返回讀取的8位數據
}
//**************************************************************************************************
//向某I2C器件的某字地址寫一字節數據
//**************************************************************************************************
void write_word(uchar device_add,uchar word_add,uchar date)  //寫進去一個存儲數據
{
        start();                  //啟動
        send_byte(device_add);    //選擇從器件地址,RW位為0,即選擇寫命令
        send_byte(word_add);      //寫字地址
        send_byte(date);          //寫數據
        stop();                   //停止        
}
//**************************************************************************************************
//向某I2C器件的某字地址讀一字節數據
//**************************************************************************************************
uchar read_word(uchar device_add,uchar word_add)   //讀出一個存儲的數據
{
        uchar date;
        start();                 //啟動
        send_byte(device_add);   //選擇從器件地址,RW位為0,即選擇寫命令
        send_byte(word_add);     //寫字地址
        start();                 //啟動
        send_byte(device_add+1); //選擇從器件地址,RW位為1,即選擇讀命令
        date=receive_byte();     //讀數據
    sendACK(1);              //發送非應答信號
        stop();                  //停止
        return date;             //返回讀取結果數據
}

void writebyte_164(uchar Dat)
{        uchar temp,i;
        temp=Dat;
        for(i=0;i<8;i++)
        { cp=0;
          if(temp&0x80) DAT=1;
          else DAT=0;
          cp=1;
          temp<<=1;
        }
}

void main()
{   PWM=0;
        seg=0;
        EX0=1;
        IT0=1;
        EA=1;
/*        write_word(0xa0,0,0);
        delayms(5); */
        high=(uint)read_word(0xa0,0)*2;
        writebyte_164(tab[high/2%10]);
        writebyte_164(tab[high/2%100/10]|0x80);
        writebyte_164(tab[high/2/100]);
        seg=1;
        if(high==0) while(!flag);
        while(1)
        { PWM=1;
          delay(high);
          PWM=0;
          delay(300-high);
        }
}

void int0()interrupt 0
{        PWM=0;
        if(!flag) flag=1;
        if(!DEC) high-=10;
        if(!INC) high+=10;
        if(high>=300) high=290;
        if(high<=0)        high=10;
        write_word(0xa0,0,(high/2));  
        seg=0;
        writebyte_164(tab[high/2%10]);
        writebyte_164(tab[high/2%100/10]|0x80);
        writebyte_164(tab[high/2/100]);
        seg=1;
        delayms(255);
}

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

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 久久一区二区精品 | 日韩高清在线观看 | 久久久久久免费毛片精品 | 亚洲九色 | 在线观看国产91 | 美女黄频| 婷婷不卡 | 少妇黄色 | 影音先锋男 | 欧美一级网站 | 亚洲一区二区三区四区五区午夜 | 91亚洲国产 | 成人不卡视频 | a免费视频 | 日本激情视频中文字幕 | 欧美日韩综合一区 | 高清国产一区二区 | 亚洲一区二区三区免费在线观看 | 国产成人在线播放 | 成人欧美一区二区三区黑人孕妇 | 91精品久久久久久久久中文字幕 | 亚洲成av人影片在线观看 | 久久久夜夜夜 | 中文字幕乱码一区二区三区 | 日韩高清中文字幕 | 久久久精品 | 黑人巨大精品欧美一区二区免费 | 久久91精品| 色综合99 | 亚洲欧洲一区二区 | 国产真实乱对白精彩久久小说 | 久热国产精品视频 | 99re视频这里只有精品 | 日日草天天干 | 91精品中文字幕一区二区三区 | 亚洲精品久久久久久一区二区 | 国产精品乱码一二三区的特点 | 中文字幕高清 | 国产乱码精品一品二品 | 日日夜夜免费精品视频 | 亚洲欧美成人影院 |