给你个数码管的程序,看着你的电路改下端口
//********************************************* c程序 *****************************************************************************//
#include "reg52.h"
#define uchar unsigned char
#define uint unsigned int
#define disdata p0 // 段码入口
sbit dq=p3^3; // 温度输入口
uint temp; // variable of temperature 定义一个变量
uchar flag1; // 定义一个标志,标志温度是负还是正,1为负,0为正
sbit din=p0^7; // 小数点控制
#define discan p2 //扫描口
uchar h; // 定义变量
unsigned char code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff,0xbf};
//共阳数码管段码表 "0" "1" "2" "3" "4" "5" "6" "7" "8" "9" "灭" "-"
unsigned char code table1[]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10};//带小数点的编码
//共阳数码管带小数点段码表 "0" "1" "2" "3" "4" "5" "6" "7" "8" "9"
uchar data temp_data[2]={0x00,0x00};//读出温度暂放
uchar data dis_play[5]={0x00,0x00,0x00,0x00,0x00};//显示单元数据,共4个数据和一个运算暂用
uchar code ditab[16]={0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x04,0x05,0x06,0x06,0x07,0x08,0x08,0x09,0x09};
//小数部分对应十进制 "0" "1" "2" "3" "4" "5" "6" "7" "8" "9" "a" "b" "c" "d" "e" "f"
uchar code scan_con[4]={0xef,0xdf,0xbf,0x7f}; //列扫描控制字
/***************************************/
/* 延时子程序 */
/***************************************/
void delay(uint i) //delay
{
while(i--);
}
/************************************************/
/* 初始化ds18b2子函数* */
/************************************************/
init_ds18b20(void)
{
uchar x=0;
dq = 1; //dq复位
delay(8); //稍做延时
dq = 0; //单片机将dq拉低
delay(80); //精确延时 大于 480us
dq = 1; //拉高总线
delay(14);
x=dq; //稍做延时后 如果x=0则初始化成功 x=1则初始化失败
delay(20);
}
/*************************************************/
/* 读字节子函数 */
/*************************************************/
readonechar(void)
{
uchar i = 0;
uchar dat = 0;
for (i=8;i>0;i--)
{
dq = 0; // 给脉冲信号
dat>>=1; // 数据右移一位
dq = 1; // 给脉冲信号
if(dq) // dq为1
dat|=0x80; // 读出数据
delay(4); // 延时
}
return(dat);
}
/*************************************************/
/* 写字节子函数 */
/*************************************************/
writeonechar(unsigned char dat)
{
uchar i = 0;
for (i=8; i>0; i--)
{
dq = 0;
dq = dat&0x01; //写入一位数据
delay(5);
dq = 1;
dat>>=1; //右移一位数据
}
}
/******************************************/
/* 发送温度转换命令 */
/******************************************/
void tmpchange(void) // ds18b20 begin change
{
init_ds18b20(); // 初始化ds18b20
delay(200); // 延时
writeonechar(0xcc); // 跳过序列号命令
writeonechar(0x44); // 发送温度转换命令
}
/******************************************/
/* 读出温度函数 */
/******************************************/
uint tmp() //get the temperature
{
// float tt;
init_ds18b20(); // 初始化ds18b2子函数
delay(1);
writeonechar(0xcc); // 跳过rom命令
writeonechar(0xbe); // 发送读取数据命令
temp_data[0]=readonechar(); // 连续读两个字节数据
temp_data[1]=readonechar();
temp=temp_data[1];
temp<<=8;
temp=temp|temp_data[0]; // 两字节合成一个整型变量。
// tt=temp*0.0625; // 得到真实十进制温度值,因为ds18b20
// 可以精确到0.0625度,所以读回数据的最低位代表的是
// 0.0625度。
// temp=tt*10+0.5; // 放大十倍,这样做的目的将小数点后第一位
// 也转换为可显示数字,同时进行一个四舍五入操作。
return temp; // 返回温度值
}
/******************************************/
/* 温度数据显示处理函数 */
/******************************************/
void tem_deal(uint tem)
{
/*************温度数据处理*****************/
if(tem>6348) // 温度值正负判断
{tem=65536-tem;flag1=1;} // 负温度求补码,标志位置1
dis_play[4]=tem&0x0f; // 取小数部分的值
dis_play[0]=ditab[dis_play[4]]; // 存入小数部分显示值
dis_play[4]=tem>>4; // 取中间八位,即整数部分的值
dis_play[3]=dis_play[4]/100; // 取百位数据暂存
dis_play[1]=dis_play[4]%100; // 取后两位数据暂存
dis_play[2]=dis_play[1]/10; // 取十位数据暂存
dis_play[1]=dis_play[1]%10; // 取个位数据暂存
if(!dis_play[3]) // 最高位为0都不显示
{
dis_play[3]=0x0a; // 先判断百位是否为0
if(!dis_play[2])
{
dis_play[2]=0x0a; // 再判断十位是否为0
}
}
if(flag1)
{
dis_play[3]=0x0b; // 为负数时,最高位显示 "-"
}
}
/******************温度数据显示********************/
void display()
{
char k;
for(k=0;k<4;k++) //4位led扫描控制
{
disdata=table[dis_play[k]]; //数据显示
if (k==1){din=0;} //小数点显示
discan=scan_con[3-k]; //位选
delay(90); //延时
discan=0xff;
}
}
/******************************************/
/* 主函数 */
/******************************************/
void main()
{
disdata=0xff; //端口初始化
p3=0xff;
//开机显示"888.8";这段程序可以不要.
for(h=0; h<4; h++)
{
dis_play[h]=8;
}
for(h=0; h<50; h++)
{
display(); //显示数据
delay(1000); //延时
}
while(1)
{
tmpchange(); //温度转换
tem_deal(tmp()); //显示温度值
display();
};
}