找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1401|回复: 4
收起左侧

求大神看下程序那有问题

[复制链接]
ID:236639 发表于 2017-10-1 00:05 | 显示全部楼层 |阅读模式
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit LCD_RS=P2^6;
sbit LCD_RW=P2^5;
sbit LCD_EN=P2^4;
sbit LCD_PSB=P2^3;
sbit DQ=P3^7;                              //18b20
sbit SDA=P1^4;                              //ds32321            //模拟I2C数据传送位SDA        
sbit SCL=P1^3;                                   //模拟I2C时钟控制位SCL
//
////
////
////
////
sbit K1=P3^2;                       
sbit K2=P3^3;
sbit K3=P3^4;
sbit K4=P3^5;
//定义变量               
uchar numbr[10]="0123456789";                      //字模
uchar dis4[]="   ";                                                            //          第四行显示   自己添加
uchar t[]="  .   ℃" ;                                            //18b20
uint sdata,xiaoshu1,xiaoshu2;                                 //整数、小数1位、小数2位
bit fg=1;                                  //温度正负标志
uchar tempL=0,tempH=0;                                                                // 变量         
uchar year,month,date,hour,min,sec;                                 //    ds3231
uchar a[]="2011年22月33日";
uchar b[]="11时22分33秒";
                                ///函数                                                                                             
void write_cmd(uchar cmd)
{
         LCD_RS=0;
         LCD_RW=0;
         LCD_EN=0;
         P0=cmd;
         delay1ms(5);
         LCD_EN=1;
         delay1ms(5);
         LCD_EN=0;
}

void lcd_pos(uchar X, uchar Y)
{
         uchar pos;
         if(X== 0)
         {
                   X= 0x80;
         }
         elseif(X == 1)
         {
                   X= 0x90;
         }
         elseif(X == 2)
         {
                   X= 0x88;
         }
         elseif(X == 3)
         {
                   X= 0x98;
         }
         pos= X + Y;
         write_cmd(pos);                                                     //显示地址
}


void write_dat(uchar dat)
{
         LCD_RS=1;
         LCD_RW=0;
         LCD_EN=0;
         P0=dat;
         delay1ms(5);
         LCD_EN=1;
         delay1ms(5);
         LCD_EN=0;
}

void lcd_init()
{        uinti;
LCD_PSB=1;                                                                                //并口方式
         write_cmd(0x30);                                                            //基本操作指令
         delay1ms(5);
         write_cmd(0x0c);                                                            //打开显示,光标关闭
         delay1ms(5);
         write_cmd(0x01);                                                            //清除LCD显示类容
         delay1ms(5);
         lcd_pos(3,0);
                                     i=0;
                                     while(dis4[ i]!='\0')
                                               {
                                               delay1ms(1);
                                               write_dat(dis4);
                                               delay1ms(1);
                                               i++;
                                               }
}
void Init_DS18B20(void)                                                                                              //初始化
{
uchar x=0;
DQ=1; //DQ先置高
delay(8); //稍延时
DQ=0; //发送复位脉冲
delay(80); //延时(>480us)
DQ=1; //拉高数据线
delay(5); //等待(15~60us)
x=DQ; //用X的值来判断初始化有没有成功,18B20存在的话X=0,否则X=1
delay(20);
}
//
ReadOneChar(void)  //主机数据线先从高拉至低电平1us以上,再使数据线升为高电平,从而产生读信号
{
unsigned char i=0; //每个读周期最短的持续时间为60us,各个读周期之间必须有1us以上的高电平恢复期
unsigned char dat=0;
for (i=8;i>0;i--) //一个字节有8位
{
DQ=1;
delay(1);
DQ=0;
dat>>=1;
DQ=1;
if(DQ)
dat|=0x80;
delay(4);
}
return(dat);
}
//
void WriteOneChar(unsigned char dat)
{
unsigned char i=0; //数据线从高电平拉至低电平,产生写起始信号。15us之内将所需写的位送到数据线上,
for(i=8;i>0;i--) //在15~60us之间对数据线进行采样,如果是高电平就写1,低写0发生。
  {
  DQ=0; //在开始另一个写周期前必须有1us以上的高电平恢复期。
  DQ=dat&0x01;
  delay(5);
  DQ=1;
  dat>>=1;
  }
delay(4);
}
void ReadTemperature(void)                                                                                      //读温度值(低位放tempL;高位放tempH;)//
         {
          Init_DS18B20(); //初始化
          WriteOneChar(0xcc); //跳过读序列号的操作
          WriteOneChar(0x44); //启动温度转换
          delay(125); //转换需要一点时间,延时
          Init_DS18B20(); //初始化
          WriteOneChar(0xcc); //跳过读序列号的操作
          WriteOneChar(0xbe); //读温度寄存器(头两个值分别为温度的低位和高位)
          tempL=ReadOneChar(); //读出温度的低位LSB
          tempH=ReadOneChar(); //读出温度的高位MSB
                   if(tempH>0x7f)      //最高位为1时温度是负
                   {
                    tempL=~tempL;         //补码转换,取反加一
                    tempH=~tempH+1;      
                    fg=0;     //读取温度为负时fg=0
      }
                   sdata= tempL/16+tempH*16;      //整数部分
                   xiaoshu1= (tempL&0x0f)*10/16; //小数第一位
                   xiaoshu2= (tempL&0x0f)*100/16;//小数第二位
                   t[0]=numbr[sdata/10];
                   t[1]=numbr[sdata];
                   t[3]=numbr[xiaoshu1];
                   t[4]=numbr[xiaoshu2];
         }
#define ADDRTW          0xD0    //器件写地址
#define ADDRTD          0xD1 //器件读地址
#define DS3231_SEC      0x00   //秒
#define DS3231_MIN      0x01   //分
#define DS3231_HOUR     0x02   //时
#define DS3231_DAY      0x03   //星期
#define DS3231_DATE     0x04   //日
#define DS3231_MONTH    0x05   //月
#define DS3231_YEAR     0x06   //年
//闹铃1            
#define DS3231_Al1SEC   0x07   //秒
#define DS3231_AL1MIN   0x08   //分
#define DS3231_AL1HOUR  0x09   //时
#define DS3231_AL1DAY   0x0A   //星期/日
//闹铃2
#define DS3231_AL2MIN   0x0b   //分
#define DS3231_AL2HOUR  0x0c   //时
#define DS3231_AL2DAY   0x0d   //星期/日
#define DS3231_CONTROL  0x0e   //控制寄存器
#define DS3231_STATUS   0x0f   //状态寄存器
bit ack;
uchar BCD2HEX(uchar val)           //BCD转换为Byte           
{        uchari;
   i= val&0x0f;
   val >>= 4;
   val &= 0x0f;
   val *= 10;
    i+= val;
   return i;
}
uchar HEX2BCD(uchar val)//B码转换为BCD码
         {
         uchari,j,k;
           i=val/10;
           j=val;
           k=j+(i<<4);
           return k;
         }
void Start()      
{
   SDA=1;                  //发送起始条件的数据信号
   delay(1);
   SCL=1;
   delay(5);             //起始条件建立时间大于4.7us,延时
     SDA=0;                  //发送起始信号
   delay(5);             // 起始条件锁定时间大于4μs
   SCL=0;                  //钳住I2C总线,准备发送或接收数据
   delay(2);
}
void Stop()
{
   SDA=0;                  //发送结束条件的数据信号
   delay(1);             //发送结束条件的时钟信号
   SCL=1;                  //结束条件建立时间大于4us
    delay(5);
   SDA=1;                  //发送I2C总线结束信号
   delay(4);
}
void SendByte(uchar Dat)
{
uchar BitCnt;
   for(BitCnt=0;BitCnt<8;BitCnt++)         //要传送的数据长度为8位
    {
       if Dat<
           SDA=1;                          //判断发送位
       else
           SDA=0;               
         delay(1);
         SCL=1;                            //置时钟线为高,通知被控器开始接收数据位
         delay(5);                       //保证时钟高电平周期大于4μs   
         SCL=0;
    }
   delay(2);
   SDA=1;                                 //8位发送完后释放数据线,准备接收应答位
   delay(2);  
   SCL=1;
    delay(3);
   if(SDA==1)
       ack=0;   
   else
       ack=1;                             //判断是否接收到应答信号
   SCL=0;
   delay(2);
}
uchar RcvByte()                                                                                  //功能:     用来接收从器件传来的数据,并判断总线错误(不发应答信号),发完后请用应答函数应答从机。
{
uchar retc;
uchar BitCnt;
  retc=0;
  SDA=1;                          //置数据线为输入方式
  for(BitCnt=0;BitCnt<8;BitCnt++)
   {
       delay(1);  
       SCL=0;                      //置时钟线为低,准备接收数据位
       delay(5);                 //时钟低电平周期大于4.7μs
       SCL=1;                      //置时钟线为高使数据线上数据有效
       delay(3);
       retc=retc<<1;
       if(SDA==1)
           retc=retc+1;            //读数据位,接收的数据位放入retc中
       delay(2);
   }
  SCL=0;
  delay(2);
  return(retc);
}
void I2CACK(bit a)                       // 功能:       主控器进行应答信号(可以是应答或非应答信号,由位参数a决定)
{
   if(a==0)
       SDA=0;              //在此发出应答或非应答信号
   else
       SDA=1;
   delay(3);     
   SCL=1;
   delay(5);             //时钟低电平周期大于4μs
   SCL=0;                  //清时钟线,钳住I2C总线以便继续接收
   delay(2);   
}
uchar I2CRead()                                                                                 
{
uchar read_data;
         Start();
   SendByte(ADDRTD);                                             
   if(ack==0)
    {
return(0);
    }
   read_data = RcvByte();
   I2CACK(1);
   Stop();
return read_data;
}
uchar I2CReadAdd(uchar addr)                                                      
         {
             Start();
             SendByte(ADDRTW);                           
             if(ack==0)
             {        
           return(0);
             }
             SendByte(addr);
             if(ack==0)
             {        
           return(0);
             }
             return(I2CRead());
         }
void Readtime()                                                                                            
         {
          uchar temp;
          temp=I2CReadAdd(DS3231_SEC);//秒
          sec=BCD2HEX(temp);
          temp=I2CReadAdd(DS3231_MIN);//分
          min=BCD2HEX(temp);
          temp=I2CReadAdd(DS3231_HOUR);  //时                  
          hour=BCD2HEX(temp);
          temp=I2CReadAdd(DS3231_DATE);  //日
          date=BCD2HEX(temp);
          temp=I2CReadAdd(DS3231_MONTH); //月
          month=BCD2HEX(temp);
          temp=I2CReadAdd(DS3231_YEAR);  //年
          year=BCD2HEX(temp);
          }
void InitDS3231()                                                                                                            //ds3231初始化
         {SCL=1;
          delay(5);
          SDA=1;
          delay(5);
         }
void TimeDisplay(uchar Dhour,ucharDmin,uchar Dsec)                                     //时分秒数组赋值
         {        b[0]=numbr[Dhour / 10];        // 时十位
             b[1]=numbr[Dhour % 10];        // 时个位
             b[4]=numbr[Dmin / 10];         // 分十位
             b[5]=numbr[Dmin % 10];         // 分个位
             b[8]=numbr[Dsec / 10];         // 秒十位
             b[9]=numbr[Dsec % 10];         // 秒个位
         }
void DateDisplay(uchar Dyear,ucharDmonth,uchar Dday)                       //年月天数组赋值   
         {        a[2]=numbr[Dyear / 10];        // 年十位
             a[3]=numbr[Dyear % 10];        // 年个位
             a[6]=numbr[Dmonth / 10];       // 月十位
             a[7]=numbr[Dmonth % 10];       // 月个位
             a[10]=numbr[Dday / 10];         // 天十位
             a[11]=numbr[Dday % 10];         // 天个位                                   
         }
void Start_I2C()
{
   SDA=1;                  //发送起始条件的数据信号
   delay(1);
   SCL=1;
   delay(5);             //起始条件建立时间大于4.7us,延时
   SDA=0;                  //发送起始信号
   delay(5);             // 起始条件锁定时间大于4μs
   SCL=0;                  //钳住I2C总线,准备发送或接收数据
   delay(2);
}
void Stop_I2C()
{
    SDA=0;                  //发送结束条件的数据信号
   delay(1);             //发送结束条件的时钟信号
   SCL=1;                  //结束条件建立时间大于4us
   delay(5);
   SDA=1;                  //发送I2C总线结束信号
   delay(4);
}
uchar write_byte(uchar addr, ucharwrite_data)
{
   Start_I2C();
   SendByte(ADDRTW);                ///////////////
   if (ack == 0)
       return 0;
   SendByte(addr);   
   if (ack == 0)
       return 0;
   SendByte(write_data);
   if (ack == 0)
       return 0;
   Stop_I2C();
    delay1ms(10);      
   return 1;
}
void ModifyTime(uchar yea,uchar mon,ucharda,uchar hou,uchar min,uchar sec)
{     uchar temp=0;
   temp=HEX2BCD(yea);
   write_byte(DS3231_YEAR,temp);   //修改年
   temp=HEX2BCD(mon);
   write_byte(DS3231_MONTH,temp);  //修改月
temp=HEX2BCD(da);                                                                                     /////////////////////
   write_byte(DS3231_DATE,temp);   //修改日
   temp=HEX2BCD(hou);
   write_byte(DS3231_HOUR,temp);   //修改时
   temp=HEX2BCD(min);
   write_byte(DS3231_MIN,temp); //修改分
   temp=HEX2BCD(sec);
   write_byte(DS3231_SEC,temp); //修改秒
}
void xianshi(void)
   {
                            {uint i;
                   TimeDisplay(hour,min,sec);                                                                                         
                                     lcd_pos(1,1);                         //时间
                                     i=0;
                                     while(b[ i]!='\0')
                                               {
                                               delay1ms(1);
                                               write_dat(b);
                                               delay1ms(1);
                                               i++;
                                               }
                                     DateDisplay(year,month,date);        //显示日期                                                                                                                                                                  
                                     delay1ms(1);
                                     lcd_pos(0,0);
                                     i=0;
                                     while(a[ i]!='\0')
                                               {
                                               delay1ms(1);
                                               write_dat(a);
                                               delay1ms(1);
                                               i++;
                                               }
                                     ReadTemperature();                                                                //显示温度
                                     delay1ms(1);
                                     lcd_pos(2,1);
                                     delay1ms(1);
                                     i=0;
while(t[ i]!='\0')
                                                        {
                                                        delay1ms(1);
                                                        write_dat(t);
                                                        delay1ms(2);
                                                        i++;
                                                        }
                            }
}
void shuaxin(void)
         {                 uint i;
                 TimeDisplay(hour,min,sec);                                                                                         
                                     lcd_pos(1,1);                         //时间
                                     i=0;
                                     while(b[ i]!='\0')
                                               {
                                               delay1ms(1);
                                               write_dat(b);
                                               delay1ms(1);
                                               i++;
                                               }
                                     DateDisplay(year,month,date);        //显示日期                                                                                                                                                                  
                                     delay1ms(1);
                                     lcd_pos(0,0);
                                     i=0;
                                     while(a[ i]!='\0')
                                               {
                                               delay1ms(1);
                                               write_dat(a);
                                               delay1ms(1);
                                               i++;
                                               }
         }
void sotp(void)                                                                                                                 
{
         uinti;                     
while(1)
          {
         duan1:                if(K1==0)
                            {
                            delay1ms(100);
                            if(K1==0)
                                     {
                                     Readtime();
                                     shuaxin();
                                     i=0;
                            gotoduan2;
                                     }
                            }
                            else
                            {gotoduan5;}
         duan2:               if(K2==0)
                            {
                                     delay1ms(100);
                                     if(K2==0)
                                     {
                                     i++;
                                     if(i>6){i=0;}
                                     shuaxin();
                                     }        
                            }
                            switch(i)
                             {
                                     case 0:  if(K3==0){delay1ms(100);if(K3==0){year=year+1;}                 if(year>=100){year=0;}                                                             shuaxin();}break;
                                      case 1:  if(K3==0){delay1ms(100);if(K3==0){month=month+1;}        if(month>=13){month=0;}                                                                shuaxin();}break;
                                     case 2:  if(K3==0){delay1ms(100);if(K3==0){date=date+1;}                if(date>=32){date=0;}                                                              shuaxin();}break;
                                     case 3:  if(K3==0){delay1ms(100);if(K3==0){hour=hour+1;}                if(hour>=25){hour=0;}                                                              shuaxin();}break;
                                     case 4:  if(K3==0){delay1ms(100);if(K3==0){min=min+1;}                 if(min>=61){min=0;}                                                                        shuaxin();}break;
case 5:  if(K3==0){delay1ms(100);if(K3==0){sec=sec+1;}                   if(sec>=61){sec=0;}                                                                shuaxin();} break;
                             }
         duan4:               if(K4==0)
                            {
                            delay1ms(100);
                            if(K4==0)
                            {
                            ModifyTime(year,month,date,hour,min,sec);
                            gotoduan5;                                 ///////////////////////////
                            }        
                   }
                          else
                            {gotoduan2;}
duan5:      Readtime();
                    xianshi();
                   }
         }
main()                                             
{
         lcd_init();
         delay1ms(5);
         InitDS3231();
         delay1ms(5);
         delay1ms(5);
         sotp();      
}

回复

使用道具 举报

ID:149988 发表于 2017-10-2 04:35 | 显示全部楼层

RE: 求大神看下程序那有问题

1、缺少void delay1ms(unsigned int i) 子程序
2、缺少void delay(unsigned int i) 子程序
3、elseif(X == 1)   else与if连到一起,所以报告elseif没有定义
4、 uinti;    uint与 i 连到一起,所以程序没有找到i,所以报告iswitch(i)中的i没有定义
5、gotoduan2; gotoduan5;中gotoduan与2;gotoduan与5;连到一起,所以报告gotoduan2没有定义
7、ucharda中uchar与da连到一起,所以报告da没有定义
不找了,都是这类问题,你自己一项一项查看吧。
回复

使用道具 举报

ID:236639 发表于 2017-10-2 23:23 | 显示全部楼层
不倒翁.WZT 发表于 2017-10-2 04:35
1、缺少void delay1ms(unsigned int i) 子程序
2、缺少void delay(unsigned int i) 子程序
3、elseif(X = ...

谢谢,我找找
回复

使用道具 举报

ID:236639 发表于 2017-10-2 23:32 | 显示全部楼层
不倒翁.WZT 发表于 2017-10-2 04:35
1、缺少void delay1ms(unsigned int i) 子程序
2、缺少void delay(unsigned int i) 子程序
3、elseif(X = ...

请问你说的1,2该往那加
回复

使用道具 举报

ID:232205 发表于 2017-10-3 09:05 | 显示全部楼层
都是这类问题,你自己一项一项查看吧
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表