|
发表于 2010-8-5 22:47:55
|
显示全部楼层
楼主,我用你的程序,用共阴数码管显示,但是不行,不知出什么问题了,帮忙看一下。非常感激
#include<ioavr.h>
/*************************************************************************
ds18b20头文件
M16 内部8M
*************************************************************************/
#define CLR_DIR_1WIRE DDRC&=~0x80 //只要修改这里的参数就可以了!呵呵!
#define SET_DIR_1WIRE DDRC|=0x80 //里面什么都不用该! //BIT(2)换成0x80
#define CLR_OP_1WIRE PORTC&=~0x80
#define SET_OP_1WIRE PORTC|=0x80
#define CHECK_IP_1WIRE (PINC & 0x80) //检测
unsigned char wmh,wml;
unsigned char Num[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//0~9
#define uint unsigned int
#define uchar unsigned char
//uchar data[4];
unsigned char wmh,wml,wm3;
//延时程序:
//delay.h
/*-----------------------------------------------------------------------
延时函数
系统时钟:8M
-----------------------------------------------------------------------*/
void delay_1us(void) //1us延时函数
{
asm("nop");
}
void delay_nus(unsigned int n) //N us延时函数
{
unsigned int i=0;
for (i=0;i<n;i++)
delay_1us();
}
void delay_1ms(void) //1ms延时函数
{
unsigned int i;
for (i=0;i<1140;i++);
}
void delay_nms(unsigned int n) //N ms延时函数
{
unsigned int i=0;
for (i=0;i<n;i++)
delay_1ms();
}
void init_1820()
{
SET_DIR_1WIRE; //设置PC2 为输出
SET_OP_1WIRE;
CLR_OP_1WIRE;
delay_nus(580); //480us以上
SET_OP_1WIRE;
CLR_DIR_1WIRE;
delay_nus(25); //15~60us
while(CHECK_IP_1WIRE);
SET_DIR_1WIRE;
SET_OP_1WIRE;
delay_nus(140); //60~240us
}
void write_1820(unsigned char x)
{
unsigned char m;
for(m=0;m<8;m++)
{
CLR_OP_1WIRE;
if(x&(1<<m)) //写数据了,先写低位的!
SET_OP_1WIRE;
else
{CLR_OP_1WIRE;}
delay_nus(40); //15~60us
SET_OP_1WIRE;
}
SET_OP_1WIRE;
}
unsigned char read_1820()
{
unsigned char temp,k,n;
temp=0;
for(n=0;n<8;n++)
{
CLR_OP_1WIRE;
SET_OP_1WIRE;
CLR_DIR_1WIRE;
k=(CHECK_IP_1WIRE); //读数据,从低位开始
if(k)
temp|=(1<<n);
else
temp&=~(1<<n);
delay_nus(50); //60~120us
SET_DIR_1WIRE;
}
return (temp);
}
void gettemp() //读取温度值
{
unsigned char temh,teml,wm0,wm1,wm2;
init_1820(); //复位18b20
write_1820(0xcc); // 发出转换命令
write_1820(0x44);
// delay_nms(800); //不延时也好使,不知道怎么回事!
init_1820();
write_1820(0xcc); //发出读命令
write_1820(0xbe);
teml=read_1820(); //读数据
temh=read_1820();
wm0=teml>>4; //只要高8位的低四位和低8位的高四位,温度范围0~99啦!
wm1=temh<<4;
wm2=wm1+wm0; //16进制转10进制
wm3=wm2/100;
wmh=(wm2%100)/10; //出口参数了!wmh是显示的高位,wml使显示的低位
wml=(wm2%100)%10;
}
void main(void)
{
delay_nms(1);
uint a,b,c,d;
DDRA=0Xff;//假设数码管接在PA口上,数码管为共阴
PORTA=0x00;
DDRC=0X0f;
PORTC=0x00;//假设控制数码管位数的是PC口的低四位
a=wm3;
b=wmh;
c=wml;
while(1)
{
gettemp //a=(uint)i/100;
if(a==0)PORTC&=0xf7;
else
{
PORTC|=0x08;
PORTA=Num[a];
delay_nms(3);
}
if(b==0&&a==0)PORTC&=0xfb;
else
{
PORTC|=0x04;
PORTA=Num;
delay_nms(3);
}
PORTC|=0x02;
PORTA=Num[c];
PORTA|=0X80; // 假设数码管小数点的控制位是 PA7,使小数点点亮
delay_nms(3);
PORTC|=0x01;
PORTA=Num[d];
delay_nms(3);
}
} |
|