完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
扫一扫,分享给好友
我是单片机初学者,第一次学模块化编程,编译有四个警告(我不理解这四个警告是什么意思,)没有错误,程序下进开发板led1602不显示,硬件肯定没有问题,因为开发板例程可以正常使用,各部分程序如下,希望大家能帮我看看,程序贴在下面,源代码压缩包也已经上传了
编译信息如下 Build target 'Target 1' assembling STARTUP.A51... compiling LED.c... LED.H(1): warning C323: newline expected, extra characters found compiling DS18B20.C... DS18B20.H(1): warning C323: newline expected, extra characters found compiling main.c... LED.H(1): warning C323: newline expected, extra characters found DS18B20.H(1): warning C323: newline expected, extra characters found linking... Program Size: data=21.0 xdata=0 code=1870 creating hex file from "LED-DS18B20-串口"... "LED-DS18B20-串口" - 0 Error(s), 4 Warning(s). 主程序如下 #include #include #include #include #include"LED.H" #include"DS18B20.H" void LcdDisplay(int); void uart_init(); void main() { uart_init(); LED_init(); write_com(0x80); //写地址 80表示初始地址 write_date('C'); while(1) { LcdDisplay(Ds18b20ReadTemp); } } void LcdDisplay(int temp) { uchar datas[]={0,0,0,0,0,0}; float tp; if(temp< 0) //当温度值为负数 { // write_com(0x80); //写地址 80表示初始地址 SBUF='-'; //将接收到的数据放入到发送寄存器 while(!TI); //等待发送数据完成 TI=0; //清除发送完成标志位 write_date('-'); //显示负 //因为读取的温度是实际温度的补码,所以减1,再取反求出原码 temp=temp-1; temp=~temp; tp=temp; temp=tp*0.0625*100+0.5; //留两个小数点就*100,+0.5是四舍五入,因为C语言浮点数转换为整型的时候把小数点 //后面的数自动去掉,不管是否大于0.5,而+0.5之后大于0.5的就是进1了,小于0.5的就 //算由?.5,还是在小数点后面。 } else { // write_com(0x80); //写地址 80表示初始地址 write_date('+'); //显示正 SBUF='+';//将接收到的数据放入到发送寄存器 while(!TI); //等待发送数据完成 TI=0; //清除发送完成标志位 tp=temp;//因为数据处理有小数点所以将温度赋给一个浮点型变量 //如果温度是正的那么,那么正数的原码就是补码它本身 temp=tp*0.0625*100+0.5; //留两个小数点就*100,+0.5是四舍五入,因为C语言浮点数转换为整型的时候把小数点 //后面的数自动去掉,不管是否大于0.5,而+0.5之后大于0.5的就是进1了,小于0.5的就 //算加上0.5,还是在小数点后面。 } datas[0] = temp / 10000; datas[1] = temp % 10000 / 1000; datas[2] = temp % 1000 / 100; datas[3] = temp % 100 / 10; datas[4] = temp % 10; write_com(0x82); //写地址 80表示初始地址 write_date('0'+datas[0]); //百位 SBUF = '0'+datas[0]; //将接收到的数据放入到发送寄存器 while (!TI); //等待发送数据完成 TI = 0; write_com(0x83); //写地址 80表示初始地址 write_date('0'+datas[1]); //十位 SBUF = '0'+datas[1]; //将接收到的数据放入到发送寄存器 while (!TI); //等待发送数据完成 TI = 0; write_com(0x84); //写地址 80表示初始地址 write_date('0'+datas[2]); //个位 SBUF = '0'+datas[2]; //将接收到的数据放入到发送寄存器 while (!TI); //等待发送数据完成 TI = 0; write_com(0x85); //写地址 80表示初始地址 write_date('.'); //显示 ‘.’ SBUF = '.'; //将接收到的数据放入到发送寄存器 while (!TI); //等待发送数据完成 TI = 0; write_com(0x86); //写地址 80表示初始地址 write_date('0'+datas[3]); //显示小数点 SBUF = '0'+datas[3]; //将接收到的数据放入到发送寄存器 while (!TI); //等待发送数据完成 TI = 0; write_com(0x87); //写地址 80表示初始地址 write_date('0'+datas[4]); //显示小数点 SBUF = '0'+datas[4]; //将接收到的数据放入到发送寄存器 while (!TI); //等待发送数据完成 TI = 0; } void uart_init() { SCON=0X50; //设置为工作方式1 TMOD=0X20; //设置计数器工作方式2 PCON=0X80; //波特率加倍 TH1=0XF3; //计数器初始值设置,注意波特率是4800的 TL1=0XF3; TR1=1; //打开计数器 } led1602驱动程序如下 #include void delayms(uint t) { uint i,j; for(i=t;i>=0;i--) for(j=110;j>=0;j--); } void LED_init() { write_com(0x38); //开显示 write_com(0x0c); //开显示不显示光标 write_com(0x06); //写一个指针加1 write_com(0x01); //清屏 write_com(0x80); //设置数据指针起点 } void write_com(uchar com) { LCD1602_E = 0; //使能 LCD1602_RS = 0; //选择发送命令 LCD1602_RW = 0; //选择写入 LCD1602_DATAPINS = com; delayms(1); LCD1602_E = 1; //写入时序 delayms(5); LCD1602_E = 0; } void write_date(uchar date) { LCD1602_E = 0; //使能 LCD1602_RS = 0; //选择发送命令 LCD1602_RW = 0; //选择写入 LCD1602_DATAPINS = date; delayms(1); LCD1602_E = 1; //写入时序 delayms(5); LCD1602_E = 0; } DS18B20驱动如下 #include void delay_ms(uint x) //延时函数 { uint i,j; for(i=x;i>=0;i--) for(j=110;j>=0;j--); } uchar DS18B20_init() //初始化 { uint z; DS18B20_io=0; z=70; while(z--); DS18B20_io=1; z=0; while(DS18B20_io) { for(z=65;z>=0;z--) { delay_ms(z); } return 0; } return 1; } void Ds18b20WriteByte(uchar dat) //写字节 { uint i, j; for(j=0; j<8; j++) { DS18B20_io= 0; //每写入一位数据之前先把总线拉低1us i++; DS18B20_io= dat & 0x01; //然后写入一个数据,从最低位开始 i=6; while(i--); //延时68us,持续时间最少60us DS18B20_io= 1; //然后释放总线,至少1us给总线恢复时间才能接着写入第二个数值 dat >>= 1; } } uchar Ds18b20ReadByte() //读字节 { uchar byte, bi; uint i, j; for(j=8; j>0; j--) { DS18B20_io= 0; i++; DS18B20_io= 1; i++; i++;//延时6us等待数据稳定 bi = DS18B20_io; //读取数据,从最低位开始读取 /*将byte左移一位,然后与上右移7位后的bi,注意移动之后移掉那位补0。*/ byte = (byte >> 1) | (bi << 7); i = 4; //读取完之后等待48us再接着读取下一个数 while(i--); } return byte; } void Ds18b20ChangTemp() //温度转换命令发送 { DS18B20_init(); delay_ms(1); Ds18b20WriteByte(0xcc); //跳过ROM操作命令 Ds18b20WriteByte(0x44); //温度转换命令 delay_ms(100); //等待转换成功 } void Ds18b20ReadTempCom() //读取温度 { DS18B20_init(); delay_ms(1); Ds18b20WriteByte(0xcc); //跳过ROM操作命令 Ds18b20WriteByte(0xbe); //发送读取温度命令 } int Ds18b20ReadTemp() { int temp = 0; uchar tmh, tml; Ds18b20ChangTemp(); //先写入转换命令 Ds18b20ReadTempCom(); //然后等待转换完后发送读取温度命令 tml = Ds18b20ReadByte(); //读取温度值共16位,先读低字节 tmh = Ds18b20ReadByte(); //再读高字节 temp = tmh; temp <<= 8; temp |= tml; return temp; } ds18b20头文件如下 #ifndef _DS18B20.H_ #define _DS18B20.H_ #include #define uchar unsigned char #define uint unsigned int ***it DS18B20_io=P3^7; void delay_ms(uint x); uchar DS18B20_init(); void Ds18b20WriteByte(uchar dat); void Ds18b20ChangTemp(); uchar Ds18b20ReadByte(); void Ds18b20ReadTempCom(); int Ds18b20ReadTemp(); #endif led1602头文件如下 #ifndef _LED.H_ #define _LED.H_ #include #define LCD1602_DATAPINS P0 #define uchar unsigned char #define uint unsigned int ***it LCD1602_E=P2^7; ***it LCD1602_RW=P2^5; ***it LCD1602_RS=P2^6; void LED_init(); void write_com(uchar com); void write_date(uchar date); #endif
|
|
相关推荐
7个回答
|
|
LCD1602不论是写数据还是写命令,都是需要先查忙,或加入一定的延时,对照一下1602的例程,看看区别在哪。
|
|
|
|
|
|
|
|
wulinwl 发表于 2017-7-7 18:44 这个头里面的IF应该没啥问题,是判断是否有同名头存在,可能是引用问题就是include的用法问题,还有可以考虑是不是接线原因造成的,最好上个电路板的示意贴图。 |
|
|
|
|
|
|
|
***lbin2008 发表于 2017-7-7 22:48 我已经说的这么清楚你怎么还不明白? 这里不能用“点”,要用下划线!否则头文件内容不能正确包含。 这里不能用尖括号< >,要用双引号" "!否则C文件不能正确引用头文件。尖括号表示在系统文件里查找,双引号表示在工程文件里查找。 这是修改后的截图 |
|
|
|
|
|
|
|
谢谢指正,没注意到是点的问题。 |
|
|
|
只有小组成员才能发言,加入小组>>
求解外围电路实现的是4脚给持续低电平复位并正常工作,高电平不工作的原因
2076 浏览 1 评论
3494 浏览 3 评论
PIC1946程序有一个变量在运行过程中恢复初始值其他变量保持不变
2329 浏览 2 评论
2754 浏览 0 评论
PIC16F1825的RC5引脚,在主程序中操作无效,在中断中可以改变是为什么?
4012 浏览 5 评论
962浏览 0评论
用XC8编译PIC18F25K80时提示下面Error,求怎么解决这个问题
6347浏览 0评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-25 04:58 , Processed in 0.744735 second(s), Total 94, Slave 75 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号