请大侠 帮忙看一下我的mega128+18B20+12864 的程序 不知道问题出在哪儿
我的12864 是调的别人的库 没问题这是程序结果总是显示1279不变拔掉1820 竟然还是显示同样的数字,请大侠帮帮忙谢谢#include<avr/io.h>
#include<util/delay.h>
#include "st7920.h"
#define uchar unsigned char
#define uint unsigned int
unsigned char table0={""};
const char DIP_NUM={"0123456789.C"};
#define ds_dat (PINA & 0x01)
#define ddr_dat 0
#define out_dat DDRA|=(1<<ddr_dat) //set output
#define in_dat DDRA&=~(1<<ddr_dat) //set input
#define set_dat PORTA|=(1<<ddr_dat) //set dat
#define clr_dat PORTA&=~(1<<ddr_dat) //clr dat
//unsigned char wmh,wml;
unsigned int a1,a2,a3,a4,a5,a6,a7,a8,a9,a10; //
long intt; //temperature
unsigned char a;
unsigned char b;
//***********************************
//功能:初始化
//说明:
void init_1820(void)
{
out_dat; //set output
set_dat; //set dat
clr_dat; //clr dat
_delay_us(480); //wait 480us
set_dat; //set dat
in_dat; //set input
_delay_us(60); //wait 15~60us
while(!ds_dat);
out_dat; //set output
set_dat; //set dat
_delay_us(140); //wait 60~240us
}
//***********************************
//功能:写一BYTE
//说明:
void write_1820(unsigned char x)
{
unsigned char m;
for(m=0;m<8;m++)
{
clr_dat;
if(x&(1<<m))
set_dat;
else
{clr_dat; }
_delay_us(60);
set_dat;
}
set_dat;
}
//***********************************
//功能:读一BYTE
//说明:
unsigned char read_1820()
{
unsigned char temp,k,n;
temp=0;
for(n=0;n<8;n++)
{
clr_dat ;
set_dat;
in_dat;
k=ds_dat; //read data
if(k)
temp|=(1<<n);
else
{temp&=~(1<<n); }
_delay_us(40);
out_dat;
}
return (temp);
}
//***********************************
//功能:得到数据
//说明:
void gettemp()
{
t=0;
//init_1820(); //resert
// write_1820(0xcc); //overlook 64bit address
init_1820(); //resert
write_1820(0xcc); //overlook 64bit address
write_1820(0x44); //start convert
_delay_ms(800);
init_1820(); //resert
write_1820(0xcc); // overlook 64bit address
write_1820(0xbe); //read memory
a1=read_1820(); //read temp low
//a2=read_1820(); //read temp hign
a3=read_1820(); //read th
a4=read_1820(); //read tl
a5=read_1820(); //read config
a6=read_1820(); //read reserved
a7=read_1820(); //.............
a8=read_1820(); //..............
a9=read_1820(); //read crc
// if(a2&0xf8) {a10='-';a1=~a1+1;a2=~a2;} // temperature sign
// else a10='+';
a2=0x07&a2;
t=t+a2;
t=t<<8;
t=t+a1;
t=t*625;
a=t/1000000; //100
a=t%1000000/100000; //10
a=t/10000%100%10; //1
a=t%10000/1000; //.1
a=t%1000/100; //0.01
a=t%100/10; //0.001
a=t%10; //0.0001
a=a*100+a*10+a; //int part
a=a*1000+a*100+a*10+a;//decimal fraction
table0=DIP_NUM[ a];
table0=DIP_NUM[ a];
table0=DIP_NUM[ a];
table0=DIP_NUM[ 10];
table0=DIP_NUM[ a];
table0=DIP_NUM;
}
/*void get_id()
{ unsigned char ii=0;
init_1820(); //resert
write_1820(0x33);
for(ii;ii<8;ii++)
{b=read_1820();
}
}
*/
unsigned char text[]={"少说话多做事"};
int main()
{
//LCD_ClearRam();
//LCD_DisplayCLR();
LCD_Init();
LCD_DisplayChinese(0,0,text);
// while(1);
//unsigned char d=4;
// unsigned char c=5;
// unsigned char b=6;
//table2=4;
// LCD_Init();
/// LCD_ClearRam();
// LCD_DisplayCLR();
// LCD_DisplayChinese(0,0,text1);
//LCD_DisplayCLR();
//Init_DS18B20();
while(1)
{
//_delay_ms(10);
//LCD_DisplayStrings_WithAddress(0x80,text);
// init_1820() ;
// get_temp();
gettemp();
//_delay_ms(50);
LCD_Init();
LCD_ClearRam();
LCD_DisplayCLR();
LCD_DisplayChinese(0,2,text);
_delay_ms(500);
LCD_DisplayChinese(0,1,table0);
//LCD_DisplayStrings_WithAddress(0x80,table2);
// LCD_DisplayStrings_WithAddress(0x80,"table2");
// LCD_DisplayChinese(0,2,table0);
_delay_ms(500);
}
} 我的程序 只读低八位 也是得到不变的数字 #include <iom128v.h>
#include <macros.h>
#define uchar unsigned char
#define uintunsigned int
#define DS18B20 PF0
#define RESOLU_9 0X1F //即分别对应config 中的R1 R0=00 01 10 11
#define RESOLU_10 0X3F
#define RESOLU_11 0X5F
#define RESOLU_12 0X7F
#define RD_ROM 0X33 //总线上只有一个设备时才可能使用该命令
#define MATCH_ROM 0X55
#define SKIP_ROM 0XCC
#define SEARCH_ROM 0XF0
#define ALARM_ROM 0XEC
#define TEMP_TRANS 0X44//启动温度转换
#define RD_SCRATCHPAD 0XBE//从暂存存储器中读字节(9字节)从字节0开始,可由复位中断读
#define WR_SCRATCHPAD 0X4E //写数值到暂存存储器地址2和3(TH,TL温度触发器)
#define COPY_SCRATCHPAD 0X48 //将暂存存储器中数值调入E2中(仅地址2、3:TH,TL高低温触发)
#define RECALL_E2 0XB8 //将非易失性存储器中的数值重新调入暂存存储器
#define RD_POWER 0XB4//发18B20电源方式的信号到主机
/******************************************************************
- 功能描述:延时函数
- 隶属模块:延时
- 函数属性:外部,供用户使用
- 参数说明:us:us级的延时
- 返回说明:无
- 注:无
******************************************************************/
void delay_us(uint us)
{
uint i;
us = us*5/4; //5/4是在8MHz晶振下,通过软件仿真反复实验得到的数值
for(i=0; i<us; i++);
}
/******************************************************************
- 功能描述:延时函数
- 隶属模块:延时
- 函数属性:外部,供用户使用
- 参数说明:ms:ms级的延时
- 返回说明:无
- 注:无
******************************************************************/
void delay(uint ms)
{
uint i,j;
for(i=0; i<ms; i++)
for(j=0; j<1141; j++);
}
/******************************************************************
- 功能描述:18b20的初始化
- 隶属模块:18b20
- 函数属性:内部
- 参数说明:无
- 返回说明:无
- 注:无
******************************************************************/
void _18B20_Init(void)
{
DDRF |= BIT(DS18B20);
PORTF &= ~BIT(DS18B20); //主机(Master Tx)发送复位脉冲
delay_us(600); //拉低至少480us
PORTF |= BIT(DS18B20);
delay_us(40); //18B20等待15-60us再响应主机复位脉冲发存在脉冲
DDRF &= ~BIT(DS18B20); //配置为输入,等待18B20发主机发存在脉冲
while(PINF & BIT(DS18B20));//等待18B20拉低总线(ds18b20 Tx)
delay_us(150);
while(!(PINF & BIT(DS18B20))); ////等待18B20释放总线
DDRF |= BIT(DS18B20);
}
/******************************************************************
- 功能描述:18b20的写入字节
- 隶属模块:18b20
- 函数属性:内部
- 参数说明:DaCmd为要写入的字节
- 返回说明:无
- 注:无
******************************************************************/
void Write_18B20(uchar DaCmd) //所有写时间片操作至少需要60us
{
uchar i = 0;
for(i=0; i<8; i++)
{
DDRF |= BIT(DS18B20); //配置为输出
PORTF &= ~BIT(DS18B20); //拉低总线,启动写数据位
delay_us(2); //每个独立的写周期都要1us的恢复时间
if(DaCmd & 0x01)
PORTF |= BIT(DS18B20); //DQ线拉低后15-60us,18b20对总线采样
else //总线为高则写1操作,为低则写0操作
PORTF &= ~BIT(DS18B20);
delay_us(60);
PORTF |= BIT(DS18B20);//释放总线
DaCmd >>= 1;
}
delay_us(50);
}
/******************************************************************
- 功能描述:18b20的读出字节
- 隶属模块:18b20
- 函数属性:内部
- 参数说明:无
- 返回说明:返回读出的字节
- 注:无
******************************************************************/
uchar Read_18B20(void)
{
uchar i = 0;
uchar recByte = 0;
for(i=0; i<8; i++)
{
recByte >>= 1;
DDRF |= BIT(DS18B20); //配置为输出
PORTF &= ~BIT(DS18B20);//主机拉低总线,启起读操作
//delay_us(1); //不能有延时
PORTF |= BIT(DS18B20);
delay_us(5);
DDRF &= ~BIT(DS18B20); //配置为输入,开始读取数据位
if(PINF & BIT(DS18B20))
recByte |= 0x80;
delay_us(60);
}
returnrecByte;
}
/******************************************************************
- 功能描述:18b20的分辨率调整
- 隶属模块:18b20
- 函数属性:外部
- 参数说明:RESOLU_9;RESOLU_10;RESOLU_11;RESOLU_12(对应9--12位分辨率)
- 返回说明:无
- 注:无
******************************************************************/
void Adjust_Resolu(uchar resolu)//调整分辨率resolu:0x1f,0x3f,0x5f,0x7f
{ //分别对应0.5c,0.25,0.125,0.0625
_18B20_Init();
Write_18B20(SKIP_ROM);
Write_18B20(WR_SCRATCHPAD);
Write_18B20(0x44); //设置TH
Write_18B20(0x86); //设置TL
Write_18B20(resolu); //设置配置寄存器R1 R0=01(分辨率10bit)
_18B20_Init();
Write_18B20(SKIP_ROM);
Write_18B20(COPY_SCRATCHPAD);
}
/******************************************************************
- 功能描述:18b20的读出温度
- 隶属模块:18b20
- 函数属性:外部
- 参数说明:无
- 返回说明:Temp_H:返回温度的16进制
- 注:g_TH, g_TL存放返回温度16进制的高低字节
******************************************************************/
uchar g_TH, g_TL;//全局变量
uint Convert_T(void)
{
uint Temp_H = 0; //定义为无符整型(16bit),最后用于存放温度
uchar Temp_L = 0;
uchar inter = 0;
uchar decim =0;
uchar i = 0;
_18B20_Init();
Write_18B20(SKIP_ROM);//单点总线,选择跳过ROM检测
Write_18B20(TEMP_TRANS);
delay(800); //温度转换需要750ms的时间,不然每次读的是上次值
_18B20_Init();
Write_18B20(SKIP_ROM);
Write_18B20(RD_SCRATCHPAD);
Temp_L = Read_18B20(); //该字节的低4位是温度的小数部分
Temp_H = Read_18B20(); //该字节的高5位是符号位,为0是表正温度,为1时为负
g_TH = Read_18B20(); //温度上限和下限,用于报警
g_TL = Read_18B20();
Temp_H =(Temp_H<<8) | (Temp_L); //转化为16位数据
return Temp_H;
}
/******************************************************************
- 功能描述:18b20的扩展性功能模块
- 隶属模块:18b20
- 函数属性:外部
- 参数说明:带入温度的16进制
- 返回说明:neg_flag:为负温度标志位
- 注:可以判断温度正负并转换为ACS码
******************************************************************/
uchar g_temperature;//全局数组,用来存放温度
uchar Split_temp(uint temp_val)
{
uchar inter = 0;
uchar decim = 0;
uchar neg_flag = 0; //负数标记
if((temp_val) & (0xF000))
{
temp_val = ~temp_val+1;
neg_flag = 1; //表明为负温度
}
else
{
neg_flag = 0;
}
inter = (uchar)(temp_val*0.0625); //取整数部分
decim = (uchar)(temp_val & 0xf)*0.625;//10位分辨率bit0,bit1未定义,权值为0
//扩大10倍,后取整,保留一位小数,有强制转换float->char
if(inter >= 100)
inter = 0;
g_temperature = inter/10 +'0';
g_temperature = inter%10 +'0';
g_temperature = '.';
g_temperature = decim +'0';
return neg_flag;
}
/******************************************************************
- 功能描述:向LCD中写入命令
- 隶属模块:LCD模块
- 函数属性:外部,供用户使用
- 参数说明:com:为命令控制字
- 返回说明:实现向LCD中写入控制命令
- 注:无
******************************************************************/
void write_com(uchar com)
{
PORTB&=~BIT(0);//RS
PORTB&=~BIT(1);//RW
PORTD=com;
PORTB|=BIT(2); //EN
delay(1);
PORTB&=~BIT(2);//EN
}
/******************************************************************
- 功能描述:向LCD中写入数据
- 隶属模块:LCD模块
- 函数属性:外部,供用户使用
- 参数说明:dat:为写入的数据
- 返回说明:实现向LCD中写入数据
- 注:无
******************************************************************/
void write_dat(uchar dat)
{
PORTB|=BIT(0);//RS
PORTB&=~BIT(1);//RW
PORTD=dat;
PORTB|=BIT(2); //EN
delay(1);
PORTB&=~BIT(2); //EN
}
/******************************************************************
- 功能描述:LCD初始化
- 隶属模块:LCD模块
- 函数属性:内部
- 参数说明:无
- 返回说明:实现LCD的初始化
- 注:无
******************************************************************/
void lcd_Init() //lcd初始化
{
DDRD=0XFF;//数据端
DDRB|=BIT(0)|BIT(1)|BIT(2); //控制端 RS RW EN
PORTB&=~BIT(2);
write_com(0X30);
delay(1);
write_com(0X01);
delay(1);
write_com(0X0C);
delay(1);
write_com(0X06); //如果为07且write_com(0X18)。。显示为右到左的现实直到消失,如果为06且write_com(0X18)为右到左显示
//07表示右边到左边显示出来。。06为光标处出现
}
void main()
{
uchar i;
uint Temperature,Tem;
lcd_Init(); //液晶初始化
Adjust_Resolu(RESOLU_11);
while(1)
{
Temperature=(Convert_T()); //除以100保留小数点后2位,符合18b20的10位精度
Tem=Temperature*6.25;
g_temperature=Tem/1000+'0';
g_temperature=Tem%1000/100+'0';
g_temperature='.';
g_temperature=Tem%100/10+'0';
g_temperature=Tem%10+'0';
write_com(0X80);
delay(1);
write_dat(g_temperature);
delay(1);
write_dat(g_temperature);
delay(1);
write_dat(g_temperature);
delay(1);
write_dat(g_temperature);
delay(1);
write_dat(g_temperature);
delay(1);
}
}
这个肯定没问题。。我前几天做的..1820部分抄论坛上的 回复【2楼】zhurenjiejj
-----------------------------------------------------------------------
谢谢了 您的程序 我稍微修改一下用还是不好使。
我想问一下 18B20的手册上说 释放总线 是什么意思 ?
是设置PORTx口 为高阻态 还是上拉电阻啊 这么会不好用。。我是128接12864画温度曲线,挺好用的啊 呜呜,好感动,参看3楼程序,成功调出
页:
[1]