单片机/MCU论坛
直播中

小年白鹿

3年用户 4经验值
私信 关注
[问答]

请问这程序错哪了

这个程序错哪里了。
#include
#include
#define uchar unsigned char
#define uint unsigned int
#define NACK_number 10
/*********** 定义 LCD 功能管脚 ************************************/
***it rs=P2^0;    // 控制 LCD 数据或命令的读写
***it rw=P2^1;    // 控制 LCD 读写信号
***it e=P2^2;    // 使能 LCD
/**************** 定义 MLX90614**********************************/
***it SCK=P2^3;
***it SDA=P2^4;
/*********** 定义 DS1302 功能管 脚 *********************************/
***it DSRST = P1^0; //DS1302 复位管脚
***it DSCLK = P1^1; //DS1302 时钟
***it DSIO = P1^2; // 控制 DS1302 数据传输
***it dq=P3^7;    // 温度传感器 I/O 口定义
/************ 数据定义 *******************************************/
bdata uchar  flag1;
***it bit_out=flag1^7;
***it bit_in=flag1^0;
uchar th_temp,tl_temp,err;
uint numh=110,numl=50; // 上下限温度
uchar bai,shi,ge,xiaoshu,fuhao;
uchar th_temp,tl_temp;
uchar secondh,secondl,minuteh,minutel,hourh,hourl,second,minute,hour;
uint monthl,monthh, month,day,datel,dateh,date,year,yearl,yearh;
void delay_ms(uint z);
void delay_us(uchar z);
void lcd1602_init();
bit judge_lcd();
void write_com(uchar com);
void write_date(uchar date);
void HELLO_lcd();
void star();
void stop();
uchar ReadByte(void);
vo id send_bit(void);
void SendByte(uchar number);
void read_bit(void);
void delay(uint N);
uint readtemp(void);
void display();
void convert_temp();
void byond();
void ds1302_init();
uchar read_ds1302();
void init_ds1302();
void write_ds1302() ;
void  read1302_write1602 ();
void HELLO();
/********************* 延时函数 *****************/
void delay_us(uchar z)
{
while(z--);
}
void delay_ms(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
/********************lcd1602 初始 化 ***************************/
void lcd1602_init()
{
write_com(0x01);
delay_ms(50);
write_com(0x38);
delay_ms(50);
write_com(0x0c);
delay_ms(50);
write_com(0x06);  
delay_ms(50);
}
/***********************lcd1602 忙碌判断子程序 *******************/
bit judge_lcd()
{
bit flag;
e = 0;
rs = 0;
rw = 1;
e = 1;
delay_ms(1);
flag=(bit)(P0&0x80); // 状态位第 7 位为 1 时禁止读写,为 0 时可读写
e = 0;
return flag;  
}
/************* *********lcd1602 写指令子程序 *******************/
void write_com(uchar addr)
{
         
while(judge_lcd()); // 检测 LCD 是否为忙碌状态
rs=0;
rw=0;
P0=addr;
delay_us(5);
e=0;
delay_us(5);
e=1;
delay_us(5);
e=0;
}
/***********************lcd 写数据子程序 *******************/
void write_date(uchar date)
{
while(judge_lcd()); // 检测 LCD 是否为忙碌状态
rs=1;
rw=0;
P0=date;
delay_us(5);
e=0;
delay_us(5);
e=1;
delay_us(5);
e=0;
}
/***********lcd1602 写指令及数据 ********************************/
void write_com_date(uint addr,uint date)
{
write_com(addr);
delay_ms(1);
write_date(date);
}
/************************MLX90614 起始条件子程序 ************************/
void star(void)
{
SDA=1;
delay(4);
SCK=1;
delay(4);
SDA=0;
delay(4);
SCK=0;
delay(4);
}
/************************MLX90614 停止条件子程序 **********************/
void stop(void)
{
SCK=0;
delay(4);
SDA=0;
delay(4);
SCK=1;
delay(4);
SDA=1;
}
/************************ 字节写子程序 *********************/
void SendByte(uchar number)
{
uchar i,n,dat;
n=NACK_number;
Send_again:
dat=number;
for(i=0;i<8;i++)
{
   if(dat&0x80)
   {
     bit_out=1;
   }
   else
   {
     bit_out=0;
   }
   send_ bit();
   dat=dat<<1;
}
read_bit();
if(bit_in == 1)
{
   stop();
   if(n!=0)
   {
     n--;
     goto Repeat;
   }
   else
   {
     goto exit;
   }
}
else
{
   goto exit;
}
Repeat:
   star();
   goto Send_again;
   exit:;
}
/********************** 位写子程序 ********************************/
void send_bit(void)
{
if(bit_out==1)
{
   SDA=1;
}
else
{
   SDA=0;
}
_nop_();
SCK=1;
delay(4);
delay(4);
SCK=0;
delay(4);
delay(4);
}
/************************ 字节读子程序 ***************** ****************/
uchar ReadByte(void)
{
uchar i,dat;
dat=0;
for(i=0;i<8;i++)
{
   dat=dat<<1;
   read_bit();
   if(bit_in==1)
   {
     dat=dat+1;
   }
}
SDA=0;
send_bit();
return dat;
}
/*********************** 位读子程序 ************************************/
void read_bit(void)
{
SDA=1;
bit_in=1;
SCK=1;
delay(4);delay(4);
bit_in=SDA;
_nop_();
SCK=0;
delay(4);delay(4);
}
/******************ds1302 写指令子程序 **********************************/
void write_ds1302(uchar addr, uchar date)
{
uchar i;
  DSRST=0;
DSCLK=0;
DSRST=1;  
for (i=0;i<8;i++) // 循环 8 次   写入地址数据
{
DSCLK=0;
_nop_();
   DSIO=addr&0x01; // 每次传输低字节  
addr>>=1; // 右移一位
DSCLK=1;
_nop_();
}
for (i=0;i<8;i++) // 循环 8 次   写入数据
{
DSCLK=0;
   _nop_();
   DSIO=date&0x01; // 每次传输低字节  
date>>=1; // 右移一位  DSCLK=1
   DSCLK=1;
_nop_();
}
DSRST=0;
delay_ms(1);
}
/*****************ds1302 初始化子程序 ********************************/
void ds1302_init(void)
{
if((((second=read_ds1302(0x81))>>7)&&0x01)==1) // 读秒
{
write_ds1302(0x8e,0x00); // 关闭写保护
write_ds1302(0x80,0x00); //00 秒
write_ds1302(0x82,0x54); //54 分
write_ds1302(0x84,0x17); //17 点
   write_ds1302(0x86,0x08); //8 日
write_ds1302(0x88,0x06); //6 月
write_ds1302(0x8a,0x05); // 星期五
write_ds1302(0x8c,0x12); //2012 年
write_ds1302(0x8e,0x80); // 允许写保护
}  
}  
/****************************** 延时子程序 ************* *************************/
void delay(uint n)
{
uint i;
for(i=0;i
{
   _nop_();
}
}
/***************************** 温度转化与 LCD 显示部分 ****************************/
void convert_temp()
{  
uint temp_zhen;
uchar temp_fu;
SCK=0;
star();
SendbByte(0xcc);
SendByte(0x44);
delay_ms(300);
star();
SendByte(0xcc);
bit_out=0;
tl_temp=ReadByte();
bit_out=0
th_temp=ReadByte();
bit_out=1;
err=ReadByte();
stop();
return(th_temp*256+tl_temp);
if((th_temp&0xf0)!=0xf0)
{
  fuhao=0x2b;  // 正数处理
temp_zhen=th_temp*256+tl_temp;
temp_zhen=temp_zhen/16;
   temp_zhen=((tl_temp&0xf0)>>4)|(th_temp<<4);
bai=temp_zhen/100;  // 将十进制的每一位都拆开
   shi=temp_zhen/10%10;
    ge=temp_zhen%10;
xiaoshu=(tl_temp&0x0f)*10*0.0625;
}
else
{
fuhao=0x2d;  // 负数处理
   temp_fu=((tl_temp&0xf0)>>4)|(th_temp<<4);
   temp_fu=~temp_fu;
   if((tl_temp&0x0f)==0x00)
   {
   temp_fu=temp_fu+1;
}
   bai=temp_fu/100;
shi=temp_fu/10%10;
ge=temp_fu%10;
xiaoshu=((~(tl_temp&0x0f)&0x0f)+1)*10*0.0625;  
   xiaoshu=xiaoshu%10;        // 精确到小数点后一位
}
if(temp_zhen>numh|temp_fu>numl)
{
beyond();
}  
}
/******* ***************lcd1602 温度显示子程序 *********************/
void display()
{
write_com(0xCa);
write_date(fuhao);
if(bai!=0)      // 百位为 0 不显示
{
write_date(bai+0x30);
write_date(shi+0x30);
}
else if(bai==0&&shi!=0)
{
   write_date(shi+0x30);
}
write_date(ge+0x30);
write_date(0x2e);
write_date(xiaoshu+0x30);
write_date(0x43);
write_date(0x20);
}
/********************** 初始欢迎界面函数 ************************/
void HELLO()
{  
write_com_date(0x85,'H');
write_com_date(0x86,'E');
write_com_date(0x87,'L');
write_com_date(0x88,'L');
write_com_date(0x89,'O');
write_com_date(0xc4,'E');
write_com_date(0xc5,'V');
write_com_date(0xc6,'E');
   write_com_date(0xc7,'R');
write_com_date(0xc8,'Y');
write_com_date(0xc9,'O');
write_com_date(0xca,'N');
write_com_date(0xcb,'E');
delay_ms(1500);
}
/******************** 超过温度上下限子程序 ***********************/
void b eyond()
{
uint temp_zhen;
uchar temp_fu;
while(1)
{
write_com(0xCA);
write_date('0');
write_date('0');
write_date('0');
write_date('0');
write_date('0');
write_date('0');  
read1302_write1602();
if(temp_zhen<=numh||temp_fu<=numl)
break;
}
}   
/************************ 从 ds1302 中读时间并在 LCD1602 上显示 ***************************/
void read1302_write1602 ()
{
second=read_ds1302(0x81);
secondl=second&0x0f;
secondh=second>>4;
minute=read_ds1302(0x83);
minutel=minute&0x0f;
minuteh=minute>>4;
hour=read_ds1302(0x85);
hourl=hour&0x0f;
hourh=hour>>4;  
month=read_ds1302(0x89);
monthl=month&0x0f;
monthh=month>>4;
year=read_ds1302(0x8d);
yearl=year&0x0f;
yearh=year>>4 ;
date=read_ds1302(0x87);
datel=date&0x0f;
dateh=date>>4;
day=read_ds1302(0x8b);
day=day&0x0f;
delay_ms(5);
write_com_date(0xc7,0x30+secondl);
write_com_date(0xc6,0x30+secondh);
write_com_date(0xc5,'-');
write_com_date(0xc4,0x30+minutel);
write_com_date(0xc3,0x30+minuteh);   
write_com_date(0xc2,'-');
write_com_date(0xc1,0x30+hourl);
write_com_date(0xc0,0x30+hourh);
write_com_date(0x83,0x30+yearl);
write_com_date(0x82,0x30+yearh);
wr ite_com_date(0x84,'-');
write_com_date(0x86,0x30+monthl);
write_com_date(0x85,0x30+monthh);   
write_com_date(0x87,'-');
write_com_date(0x89,0x30+datel);
write_com_date(0x88,0x30+dateh);
write_com_date(0x8b,'w');
write_com_date(0x8c,'e' );
write_com_date(0x8d,'e');
write_com_date(0x8e,'k');
write_com_date(0x8f,0x2f+day);
}
/***************************** 主函数部分 **********************************/
void main()
{  
uint Temp;
SCK=1;
SDA=1;
delay(4);
SCK=0;
delay(1000);
SCK=1;
lcd1602_init();
delay_ms(2);
HELLO();
lcd1602_init();
delay_ms(2);
write_com_date(0x80,'2');
write_com_date(0x81,'0');
delay_ms(2);
ds1302_init();
delay_ms(3);
while(1)
{
   convert_temp();
display();
   read1302_write1602 () ;
}
}


回帖(1)

阿信509

2021-6-25 14:28:53
如果你把错误现象描述一下会更好,程序太长大家不好给你找原因
举报

更多回帖

×
20
完善资料,
赚取积分