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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

51單片機源程序C語言,有詳細注釋

[復制鏈接]
跳轉到指定樓層
樓主
ID:22230 發表于 2010-3-15 10:49 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式

#include<reg51.h>
#include<absacc.h>
#define PD XBYTE[0xb003]   //8255控制口
#define PC XBYTE[0xb002]   //8255擴展C口
#define PB XBYTE[0xb001]   //8255擴展B口
#define PA XBYTE[0Xb000]   //8255擴展A口

#define  LCDD XBYTE[0xe000]   //LCD控制口
#define LCDRS XBYTE[0xe003]   //LCD讀口
#define LCDRW XBYTE[0xe001]   //LCD寫口

#define ADCIN XBYTE[0xd000]   //ADC0809地址

sbit SCL=P1^6;    //i2c總線SCL線
sbit SDA=P1^7;    //i2c總線SDA線
sbit P1_5=P1^5;    //上,下限報警
sbit SpeakerP12=P1^2;  //蜂鳴器

unsigned char zfc[]="0000000/00:00:00";    //年,月,日,星期,時,分,秒
unsigned char zfctemp[7];       //日期和時間緩沖區
unsigned char smgd[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};  //數碼管段嗎
unsigned char smgb[]={0x00,0x01,0x02,0x03,0x04,0x05};       //數碼管位碼
unsigned char sc,sb,sa;  //數碼管個位c,十位b,百位a      
unsigned char x=0;
unsigned char y=0;
unsigned char m,n;    //m保存上限值,n保存下限值
unsigned char stopread1307=1;


void delay(unsigned int ms){   //可變延時
 while(ms--);
 }

void i2cinit(void){     //IIC總線初始化
 SCL=1;
 delay(10);
 SDA=1;
 delay(10);
 SCL=0;
 delay(10);
 SDA=0;
 delay(10);
 }
void i2cstart(void){   //開始信號
 SDA=1;
 delay(10);
 SCL=1;
 delay(10);
 SDA=0;
 delay(10);
 SCL=0;
 }
void i2cstop(void){     //停止信號
 SCL=0;
 SDA=0;
 delay(10);
 SCL=1;
 delay(10);
 SDA=1;
}

void i2cack(){   //IIC應答信號
 SDA=0;
 SCL=1;
 delay(10);
 SCL=0;
 SDA=1;
}

bit testack(void){     //應答檢測
unsigned char errorbit=0;
 SDA=1;
 SCL=1;
 delay(10);
 errorbit=SDA;
 SCL=0;
 return(errorbit);
}

void i2csend(unsigned char i_data){     //IIC發送
unsigned char t;
for (t=0;t<8;t++){
 SDA=(bit)(i_data&0x80);      //強制類型轉換
 SCL=1;
 delay(10);
 SCL=0;
 i_data=i_data<<1;
 }
}

unsigned char i2cread(void){    //讀一個字節
unsigned char t;
unsigned char i_data=0;
for(t=0;t<=7;t++){
 SCL=1;
 i_data=i_data*2; 
 i_data=i_data|((unsigned char)(SDA));   //強制類型轉換
 SCL=0;
 }
 return i_data;
}

writei2c(unsigned char writedeviceadderss,unsigned char romadderss,
        unsigned char i_data){    // 一個字節寫入i2c
 stopread1307=0;
 i2cstart();
 i2csend(writedeviceadderss); //如果writedeviceadderss=0xa0是24C02地址,0xd0是1307的地址
 if (testack()==1) return 0;
 i2csend(romadderss);   //romadderss是 數據 的存放地址
 if (testack()==1) return 0;
 i2csend(i_data);    //i_data是要寫的數據
 if (testack()==1) return 0;
 i2cstop();
 delay(10);
}

unsigned char readi2c(unsigned char writedeviceadderss,unsigned char readdeviceadderss,
       unsigned char romadderss){      // 從i2c讀出一個字節
 unsigned char i_data;
  stopread1307=0;
 i2cstart();
 i2csend(writedeviceadderss); //如果writedeviceadderss=0xa0是24C02地址,0xd0是1307的地址
 if (testack()==1)return 0;
 i2csend(romadderss);
 if (testack()==1)return 0;        

 i2cstart();
 i2csend(readdeviceadderss);  //如果readdeviceadderss=0xa1是24C02地址,0xd1是1307的地址
 if (testack()==1)return 0;

 i_data=i2cread();
 i2cack();
 i2cstop();
 return i_data;
 
}

unsigned char readi2cbyte(unsigned char *idataaddress,unsigned char mdata,unsigned char writedeviceadderss,
     unsigned char readdeviceadderss,unsigned char romadderss){  //連續讀多個字節
 i2cstart();
 i2csend(writedeviceadderss); //如果writedeviceadderss=0xa0是24C02地址,0xd0是1307的地址
 if (testack()==1)return 0;
 i2csend(romadderss);
 if (testack()==1)return 0;        

 i2cstart();
 i2csend(readdeviceadderss);  //如果readdeviceadderss=0xa1是24C02地址,0xd1是1307的地址
 if (testack()==1)return 0;

 while(mdata!=0){
  *idataaddress=i2cread();
  i2cack();
  idataaddress++;
  mdata--;
 }
 i2cstop();
 return idataaddress;
}

void up(void){        //加一 且燈ED1閃爍
EX0=0;
stopread1307=0;
PD=0x09;
PD=0x07;
delay(5000);
x++;
PD=0x06;
y=0x06;
stopread1307=1;
}

void down(void){      //減一  且燈ED2閃爍
EX0=0;
stopread1307=0;
PD=0x07;
PD=0x09;
delay(5000);
x--;
PD=0x08;
y=0x08;
stopread1307=1;
}

void ppromup(void){
 writei2c(0xa0,0x0C,x);
}

void ppromdown(void){
  writei2c(0xa0,0x23,x);
}

void pprom(void){
 EX0=0;
 stopread1307=0;
 if (y==0x06) ppromup();    // 如果LED1亮存儲上限值
 if (y==0x08) ppromdown();     // 如果LED2亮存儲下限值
}

unsigned char keyscan(void){
unsigned char key;
 while(1) 
 {
  if (PB!=0xff){
    delay(2924);
    if (PB!=0xff){
     key=PB;
     switch(key){
      case 0xfe : return 0x01 ;break;
      case 0xfd : return 0x02 ;break;
      case 0xfb : return 0x03 ;break;
      case 0xf7 : return 0x04 ;break;
      case 0xef : return 0x05 ;break;
      case 0xdf : return 0x06 ;break;
      case 0xbf : return 0x07 ;break;
      case 0x7f : return 0x08 ;break;
        default : return 0xff;
     }
    }
   }
  return 0xff; 
 }  
}

void Speaker(void) {
 SpeakerP12=0;
 delay(500);
 SpeakerP12=1;
 delay(500);
}

void ADCSTART(void) interrupt 0{
 x=ADCIN;
 ADCIN=0x00;    //通道0
 stopread1307=1; 
}

void LCDINIT(){
 delay(20000); 
 LCDD=0x38;
 delay(50);
 LCDD=0x0c;
 delay(50);
 LCDD=0x01;
 delay(10);
}

void readup(void){       //讀上限
  EX0=0;
 stopread1307=0;
 x=readi2c(0xa0,0xa1,0x0C);
 m=x;
}

void readdown(void){      //讀下限
 EX0=0;
 stopread1307=0;
 x=readi2c(0xa0,0xa1,0x23);
 n=x;
}

void read1307(){
 zfc[15]=(zfctemp[0]&0x0f)+0x30;    //秒個位
 zfc[14]=((zfctemp[0]>>4)&0x0f)+0x30;   //秒十位
 zfc[13]=':';
 zfc[12]=(zfctemp[1]&0x0f)+0x30;    //分個位
 zfc[11]=((zfctemp[1]>>4)&0x0f)+0x30;  //分十位
 zfc[10]=':';
 zfc[9]=(zfctemp[2]&0x0f)+0x30;    //時個位
 zfc[8]=((zfctemp[2]>>4)&0x0f)+0x30;   //時十位
 zfc[7]='/';            //星期
 zfc[6]=(zfctemp[3]&0x0f)+0x30;
 zfc[5]=(zfctemp[4]&0x0f)+0x30;         //日個位
 zfc[4]=((zfctemp[4]>>4)&0x0f)+0x30;       //日十位
 zfc[3]=(zfctemp[5]&0x0f)+0x30;         //月個位
 zfc[2]=((zfctemp[5]>>4)&0x0f)+0x30;       //月十位
 zfc[1]=(zfctemp[6]&0x0f)+0x30;        //年個位
 zfc[0]=((zfctemp[6]>>4)&0x0f)+0x30;       //年十位      
}

void LCDDISP(unsigned char *LCDdata){   //液晶顯示16個字符
unsigned char t;
for (t=0;t<16;t++){
 if(t==0) {LCDD=0x80;delay(10);}
 else if(t==8) {LCDD=0xc0;delay(10);}     
 if(*LCDdata!='\0'){
  LCDRW=*LCDdata;
  delay(100);
  LCDdata++;  
  }
 }
}

void disp(void) interrupt 1{      //數碼管顯示中斷服務子函數
  TH0=0xC4;  //定時器0初值裝載
  TL0=0x00;  //定時器0初值裝載         
  PA=smgd[sa];
  PD=smgb[0];
  delay(200);
  PD=smgb[1];

  PA=smgd[sb];
  PD=smgb[2];
  delay(200);
  PD=smgb[3];

  PA=smgd[sc];
  PD=smgb[4];
  delay(200);
  PD=smgb[5];
}

void c8255init(void){   //8255初始化
  PD=0x82;
 PC=0xff;
 PB=0xff;         
 PA=0Xff;
}

void SETDS1307(){

}

void main(void){ //主函數
  i2cinit();
  c8255init();
    readup();  //上限初始化
    readdown();  //下限初始化
 x=0;
 TMOD=0x01;  //設置定時器0工作在方式1
 TH0=0xC4;  //定時器0初值裝載
 TL0=0x00;  //定時器0初值裝載    
 EA=1;    //開CPU中斷
  ET0=1;   //開定時器0中斷
 TR0=1;   //啟動定時/計數器0
 IT0=1;
 EX0=1;          //設置外部中斷觸發模式 電平觸發
 ADCIN=0x00;  //通道0啟動信號
 LCDINIT();
 writei2c(0xd0,0x00,0x00);  
 while(1){
  sc=x%10;
  sb=x%100/10;
  sa=x/100;
     if (((x>=m)|(x<=n))&(EX0==1)) {P1_5=0;Speaker();} else P1_5=1;
  switch (keyscan()){
   case 0x01:     up();break;  // 加1
   case 0x02:    down();break;  // 減1
   case 0x03:     pprom();break;  // 存儲,如果LED1亮存儲上限值,如果LED2亮存儲下限值
   case 0x04:    EX0=1;break;     // 啟動ADC轉換
   case 0x05:    readup();break;     // 讀取上限值
   case 0x06:   readdown();break;     // 讀取下限值                                                               //
   case 0x07: SETDS1307();break;  // 調整時間
   case 0x08:          x=0;break;        // 清零
  }
  if (stopread1307==1) readi2cbyte(zfctemp,7,0xd0,0xd1,0x00);  //從DS1307里連續讀出8個字節 
  read1307();
  LCDDISP(zfc);  
 }
}

 

詳細資料聯系QQ:81748606

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

使用道具 舉報

沙發
ID:61326 發表于 2014-5-4 10:58 | 只看該作者
謝謝分享
回復

使用道具 舉報

板凳
ID:48266 發表于 2014-5-16 18:07 | 只看該作者
謝謝分享
回復

使用道具 舉報

地板
ID:99919 發表于 2015-12-22 09:12 | 只看該作者
謝謝分享,正準備用DS1307呢
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 婷婷开心激情综合五月天 | 中国一级特黄真人毛片免费观看 | 国产网站在线免费观看 | 久久久久国色av免费观看性色 | 九七午夜剧场福利写真 | 日本视频在线播放 | 天天干天天爱天天 | 免费日本视频 | 成人在线观看免费 | 天天亚洲 | 视频一区二区三区在线观看 | 91久久久久久久久久久 | 日韩精品免费 | 在线成人免费av | 精一区二区 | 成人性生交a做片 | 日本成年免费网站 | 久久久久久久久蜜桃 | 麻豆av在线 | 一区二区在线不卡 | www.日本精品 | 欧美精品在欧美一区二区少妇 | 91久久精品国产免费一区 | 亚洲福利在线观看 | 亚洲精品一区二区在线 | 神马九九| 青青青伊人 | 国产色片在线 | 国产午夜精品一区二区三区在线观看 | 狠狠亚洲 | 99精品视频一区二区三区 | 久久亚洲欧美日韩精品专区 | 欧美视频一区二区三区 | 91精品久久久久久久99 | 999热精品 | 国产一级免费在线观看 | 久久亚洲欧美日韩精品专区 | 国产伦精品一区二区三区照片91 | 亚洲国产一区二区三区在线观看 | 中日字幕大片在线播放 | 黄色亚洲|