完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
这个程序错哪里了。 #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 () ; } } |
|
相关推荐
2 条评论
1个回答
|
|
|
如果你把错误现象描述一下会更好,程序太长大家不好给你找原因
|
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
506 浏览 0 评论
607 浏览 0 评论
837 浏览 0 评论
832 浏览 0 评论
RT-Thread与英飞凌(infineon)合作得板子PSOC 6 板子学习
768 浏览 0 评论
【youyeetoo X1 windows 开发板体验】少儿AI智能STEAM积木平台
17049 浏览 31 评论
/9
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-12-13 23:30 , Processed in 4.366978 second(s), Total 86, Slave 65 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191

淘帖
3933