原文是DS18B20+ DS12c8878位共阳数码管万年历加温度的代码我现在要改为DS12c887共阴极8位数码管万年历不用显示温度部分,经过几天的更改大部分更改,但是还有一些自己水平有限,已经没有能力了,特来这里求助。先谢谢啦!
主要问题是:1、根据自己的电路共阳极数码管转换为共阴极数码管,p端口更改后显示代码的更改。p2口段码的代码更改了,p1口位置码我怎么看都好像是共阴极数码管的,不知道对不对没有更改。
2、就是DS12c8878初始化的代码要删除,不知道我删除的对不对。
3、DS18B20温度部分代码删除的对不对。
我自己的电路
我自更改后的代码:
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
uchar hh,mm,ss,year,mouth,day,dd,week,aa,x,y,flag;
uint temp;
uchar code led[14]={ 0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0xbf,0x7f,0x00,0x39};//这两个没有改(0xbf - ,0x7f _ , ) uchar code led1[11]={ 0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0x00,0xef,0xa3}; //加了小数点最后一位没有改(0xa3 o)
sbit key1=P3^5; key1键调整时间时的‘位’选择功能
sbit key2=P3^6; key2执行加功能
sbit key3=P3^7; key3执行减功能 sbit DS_CS=P3^3; //定义DS12C887芯片片选端 (读哪个芯片)
sbit DS_AS=P3^2; //定义DS12C887地址选通输入端 (读到那里去)
sbit DS_RW=P3^1; //定义DS12C887读允许输入 (让读以后,我来输入数据) sbit DS_DS=P3^0; //定义DS12C887读数据允许输入脚,这里mot接地
#define DS_BUS P0 //DS12CR887数据总线(端口已改)
//向DS12CR887写数据函数
void ds_write(uchar add,uchar date)
{
DS_CS=0; //根据时序图,把相应的脚变化高低,片选端,低电平有效
DS_AS=1; //地址选通输入端
DS_DS=1; //读允许输入脚
DS_RW=1; //写输入脚
DS_BUS=add; //写地址
DS_AS=0;
DS_RW=0;
DS_BUS=date; //写命令
DS_RW=1;
DS_AS=1;
DS_CS=1;
}
//读取DS12CR887的数据
uchar ds_read(uchar add)
{
uchar z; //定义一个无符号函数
DS_AS=1; //ALE,地址锁存允许//根据时序图,进行高低电平设置
DS_DS=1; //Read读入
DS_RW=1; //!WR 禁止写入
DS_CS=0; //片选输入
DS_BUS=add; //写地址,确定要读什么位置的值 DS_AS=0;
DS_DS=0;
DS_BUS=0x00; //先把P1进行置高,清理数据
z=DS_BUS; //把新的得到了 12c887里面的数值,赋值给ds_bus DS_DS=1; //根据时序图继续设置电平
DS_AS=1;
DS_CS=1;
return z; //谁调用它,什么位置调用的,就会把这个新得到的值在返回给他,//看得出来只有读闹钟值是调用了。
}
void delay(uint z) //延时
{
uint x,y;
for(x=z;x>0;x--)
for(y=10;y>0;y--);
}
//DS12CR887初始化 根据需要修改,第一次用的时候写进去,以后就不用了
void ds_init()
{
DS_AS=0;
DS_DS=0;
DS_RW=0;
ds_write(0x0a,0x20);//DS12CR887寄存器A功能设置,开启时钟振荡器
}
void time_init()
{
ds_init(); //初始化DS12CR887
ds_write(0x0b,0x76) ;//设置寄存器B
ds_write(0x09,11);//2011年
ds_write(0x08,2);//2月
ds_write(0x07,22);//21日
ds_write(0x06,2);//星期1
ds_write(0x05,22);//时闹钟 19点
ds_write(0x04,13); //小时 15点
ds_write(0x03,30);//分钟闹钟 30分
ds_write(0x02,44); //分钟 43分
ds_write(0x01,0);//秒闹钟 0秒
ds_write(0x00,0);//秒 0秒
}
//Timer计时器初始化程序
void Init_Com(void)
{
TMOD = 0x20; //定时器1工作在模式2的方式下
PCON = 0x00; //初始化电源管理寄存器
SCON = 0x50; //串口工作在模式1的方式下
TH1 = 0xfd;//定时器高位寄存器初始化
TL1 = 0xfd; //定时器低位寄存器初始化
TR1 = 1; //启动定时器
}
/////键盘扫描
voidkeyscan() //键盘扫描用于调整时间
{
ucharx,y; //key1键调整时间时的‘位’选择功能
if(key1==0) //调整时间时只预示要调整的位
{ //每按一下key1键,要调整的位就
delay(30); //轮回预示呈现,以便调整
if(key1==0)
{
aa++;
flag=1;
while(!key1);
}
}
if(aa==1)
{
//读小时
hh=ds_read(0x04); //数码管1显示小时第一位
x=hh/10;
P2=0x00;//先把P进行置高,清理数据(端口已改)
P1=0xff; //(端口已改)
P1=0x7f; //(端口已改) P2=led[x]; //(端口已改)
delay(1);
//数码管2显示小时第二位
y=hh% 10;
P2=0x00;//全灭(端口已改)
P1=0xbf;//(端口已改)
P2=led[y];//(端口已改) delay(1);
}
if(aa==2)
{
//读分钟
mm=ds_read(0x02);
//数码管4显示分钟第1位
x=mm/10;
P2=0x00; //全灭(端口已改)
P1=0xef;//(端口已改)
P2=led[x];//(端口已改)
delay(1);
//数码管5显示分钟第2位
y=mm% 10;
P2=0x00;//全灭(端口已改)
P1=0xf7;//(端口已改)
P2=led[y];//(端口已改)
delay(1);
}
if(aa==3)
{
aa=0;
flag=0;
}
if(key2==0) //key2键执行‘+’功能
{
delay(50);
if(key2==0)
{
switch(aa)
{
case 1:hh++;
if(hh==24)hh=0;
ds_write(0x04,hh);break;
case 2:mm++;
if(mm==60)mm=0;
ds_write(0x02,mm);break;
}
while(!key2);
}
}
if(key3==0) //key3执行-功能
{
delay(5);
if(key3==0)
{
switch(aa)
{
case 1:hh--;
if(hh==-1)hh=23;
ds_write(0x04,hh);break;
case 2:mm--;
if(mm==-1)mm=59;
ds_write(0x02,mm);break;
}
while(!key3);
}
}
}
/////
void show_time()
{
uint q=4000;//
uchar x,y;
while(q)//显示时间 小时--分--秒
{
keyscan();
//读小时
hh=ds_read(0x04);
// 数码管1显示小时第一位
x=hh/10;
P2=0x00; //全灭(端口已改)
P1=0xff;//(端口已改)
P1=0x7f;//(端口已改)
P2=led[x];//(端口已改)
delay(1);
//数码管2显示小时第二位
y=hh% 10;
P2=0x00;//全灭(端口已改)
P1=0xbf;//(端口已改)
P2=led[y];//(端口已改)
delay(1);
//数码管3显示"--"
P2=0x00;//全灭(端口已改)
P1=0xdf;//(端口已改)
P2=led[10];//(端口已改)
delay(1);
//读分钟
mm=ds_read(0x02);
//数码管4显示分钟第1位
x=mm/10;
P2=0x00; //全灭(端口已改)
P1=0xef;//(端口已改)
P2=led[x];//(端口已改)
delay(1);
//数码管5显示分钟第2位
y=mm% 10;
P2=0x00;//全灭(端口已改)
P1=0xf7;//(端口已改)
P2=led[y];//(端口已改)
delay(1);
// 数码管6显示"--"
P2=0x00;//全灭(端口已改)
P1=0xfb;//(端口已改)
P2=led[10];//(端口已改)
delay(1);
//读秒钟
ss=ds_read(0x00);
//数码管7显示秒钟第1位
x=ss/10;
P2=0x00;//全灭(端口已改)
P1=0xfd;//(端口已改)
P2=led[x];//(端口已改)
delay(1);
//数码管7显示秒钟第2位
y=ss% 10 ;
P2=0x00;//全灭(端口已改)
P1=0xfe;//(端口已改)
P2=led[y];//(端口已改)
delay(1);
q--;
}
}
void show_day()
{
uint r=900;
while(r) //显示年、月、日
{
keyscan();
//读月份
mouth=ds_read(0x08);
//数码管5显示月份第1位
x=mouth/10;
P2=0x00;//全灭(端口已改)
P1=0x7f;//(端口已改)
if(x==0)
{
P0=led[12];
delay(1);
}
else
{
P2=led[x];//(端口已改)
delay(1);
}
// 数码管6显示月份第2位
y=mouth%10;
P2=0x00;//全灭(端口已改)
P1=0xbf;//(端口已改)
P2=led1[y];//(端口已改)
delay(1);
//读日期
day=ds_read(0x07);
//数码管7显示日期第1位
x=day/10;
P2=0x00;//全灭(端口已改)
P1=0xdf;//(端口已改)
if(x==0)
{
P2=led[12];//(端口已改)
delay(1);
}
else
{
P2=led[x];//(端口已改)
delay(1);
}
//数码管7显示日期第2位
y=day% 10 ;
P2=0x00;//全灭(端口已改)
P1=0xef;//(端口已改)
P2=led1[y];//(端口已改)
delay(1);
//读年
year=ds_read(0x09);
// 数码管1显示年"2"
P2=0x00;//全灭(端口已改)
P1=0xf7;//(端口已改)
P2=led[2];//(端口已改)
delay(1);
//数码管2显示年"0"
P2=0x00;//全灭(端口已改)
P1=0xfb;//(端口已改)
P2=led1[10];//(端口已改)
delay(1);
//数码管3显示年百位
x=year/10;
P2=0x00;//全灭(端口已改)
P1=0xfd;//(端口已改)
P2=led[x];//(端口已改)
delay(1);
//数码管4显示年个位
y=year%10;
P2=0x00; //全灭(端口已改)
P1=0xfe;//(端口已改)
P2=led[y];//(端口已改)
delay(1);
r--;
}
}
void show_tempture_week()
{
uint m=80;
while(m) ///显示温度、星期
{
keyscan();
//读星期
week=ds_read(0x06);
// 数码管8显示星期
x=week%10;
P2=0x00;//全灭(端口已改)
P1=0xfe;//(端口已改)
P2=led[x];//(端口已改)
delay(10);
// 数码管7 去亮
P2=0x00;//全灭(端口已改)
P1=0xfd;//(端口已改)
P2=led[12];//(端口已改)
delay(1);
m--;
}
}
void main()
{
keyscan();
show_time();//时间,日期显示
show_day();
show_tempture_week();
while(flag)
{
if(aa=1)
{show_time();keyscan();}
else if(aa=2)
{show_time();keyscan();}
else ;
}
}
}
谢谢啦!
|