我是
单片机初学者,第一次学模块化编程,编译有四个警告(我不理解这四个警告是什么意思,)没有错误,程序下进
开发板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
crea
ting 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