题目就不贴了,也没什么感想,就直接上代码了(PS:代码没有设置多个.c文件、头文件,都堆在一起了,不过逻辑较简单)
//ds18b20,数码管,独立按键(跳线帽连接右边两个) ,LED灯,定时器
#include
#include
#define uchar unsigned char
#define uint unsigned int
sbit DQ=P1^4;
//1100 0110 //12
uchar code tab[]={0XC0,0XF9,0XA4,0XB0,0X99,0X92,0X82,0XF8,0X80,0X90,0XBF,0XFF,0xc6};
uchar yi,er,san,si,wu ,liu,qi,ba;
uchar mode=1,pwm;
uchar wendu;
uint rest_time=60;
bit s7=0,s6=0;
void delayms(int ms);
void delaypp(int ms);
void allinit();
void keyscan();
//void rel(uchar dong);
void display1(uchar yi,uchar er);
void display2(uchar san,uchar si);
void display3(uchar wu,uchar liu);
void display4(uchar qi,uchar ba);
void datapro();
uchar temget();
uchar readw();
void dsinitw();
void writew(uchar dat);
void Delay100us();
void Delay500us();
void ledmokuai();
void Timer0Init(void) //100微秒@11.0592MHz
{
AUXR |= 0x80; //定时器时钟1T模式
TMOD &= 0xF0; //设置定时器模式
TL0 = 0xAE; //设置定时初值
TH0 = 0xFB; //设置定时初值
TF0 = 0; //清除TF0标志
TR0 = 1; //定时器0开始计时
EA=1;
ET0=1;
}
void main()
{
allinit();
P34=1;
Timer0Init();
//while(1)上面定义
while(1)
{
wendu=temget();
keyscan();
datapro();
ledmokuai();
display1(yi,er);
display2(san,si);
display3(wu,liu);
display4(qi,ba);
}
}
void timer0() interrupt 1
{
static uchar count;
static uint yimiao;
if(rest_time!=0)
{
yimiao++;
if(yimiao==10000)
{
yimiao=0;
rest_time--;
}
if(rest_time!=0)
{
count++;
if(count==pwm)
{
P34=~P34;
}
if(count==10)
{
count=0;
P34=~P34;
}
}
}
}
void ledmokuai()
{
if(mode==1)
{
P2=0X80;
P0=0XFF;
P0=0XFE;
}
else if(mode==2)
{
P2=0X80;
P0=0XFF;
P0=0XFd;
}
else if(mode==3)
{
P2=0X80;
P0=0XFF;
P0=0XFb;
}
if((s6==1)||(rest_time==0))
{
P2=0X80;
P0=0XFF;
}
}
/*************ds18b20****************/
uchar temget()
{
uchar tempure;
uchar low,high;
dsinitw();
writew(0xcc);
writew(0x44);
Delay500us(); Delay500us();
dsinitw();
writew(0xcc);
writew(0xbe);
low=readw();
high=readw();
tempure=high<<4;//0000 0101 =0101 0000
tempure |= (low>>4); // 1010 0110 0000 0110 | 0101 0000=0101 0110
return tempure;
}
//以下考试会给出
uchar readw()
{
uchar i;
uchar dat;
for(i=0;i<8;i++)
{
DQ=0;
_nop_();
dat>>=1;
DQ=1;
if(DQ==1)
{
dat |= 0x80;// dat=dat|0x80; 0000 0000 | 1000 0000 =1000 0000
}
Delay100us();
}
return dat;
}
void writew(uchar dat)
{
uchar i;
for(i=0;i<8;i++)
{
DQ=0;
DQ=dat&0x01;//0100 0100 & 0000 0001 // 0000 0001
Delay100us();
DQ=1;
dat>>=1;//dat=dat>>1;//1001 0000//0010 0001
}
}
void dsinitw()
{
DQ=0;
Delay500us();
DQ=1;
Delay500us();
}
void Delay100us() //@11.0592MHz
{
unsigned char i, j;
_nop_();
_nop_();
i = 2;
j = 15;
do
{
while (--j);
} while (--i);
}
void Delay500us() //@11.0592MHz
{
unsigned char i, j;
_nop_();
_nop_();
i = 6;
j = 93;
do
{
while (--j);
} while (--i);
}
//数据处理
void datapro()
{
if(s7==1)
{
yi=10;er=4;san=10;si=11;
wu=11; //9999/1000=9
liu=wendu/10; // 25/10=2
qi=wendu%10; //25%10=5
ba=12; //9999%10=9
}
else
{
if(mode==1)
{
pwm=2;
}
else if(mode==2)
{
pwm=3;
}
else if(mode==3)
{
pwm=7;
}
yi=10;er=mode;san=10;si=11;
wu=rest_time/1000; //9999/1000=9
liu=rest_time%1000/100; //9999%1000=999/100=9
qi=rest_time%100/10; //9999%100=99/10=9
ba=rest_time%10; //9999%10=9
}
}
void keyscan()
{
if(P30==0)//s7
{
delayms(5);
if(P30==0)
{
s7=~s7;
}
while(!P30);
}
else if(P31==0)//s6
{
delayms(5);
if(P31==0)
{
s6=1;
rest_time=0;
}
while(!P31);
}
else if(P32==0)//s5
{
delayms(5);
if(P32==0)
{
s6=0;
rest_time+=60;
if(rest_time>120)
{
rest_time=0;
}
}
while(!P32);
}
else if(P33==0)//s4
{
delayms(5);
if(P33==0)
{
++mode;
if(mode==4)
{
mode=1;
}
}
while(!P33);
}
}
//void rel(uchar dong)
//{
// if(dong==0)
// {
// P2=0XA0;P0=0X00;//关闭蜂鸣器和继电器
// }
// else if(dong==1)
// {
// P2=0XA0;P0=0X40;//打开蜂鸣器
// }
// else if(dong==2)
// {
// P2=0XA0;P0=0X10;//打开继电器
// }
// else if(dong==3)
// {
// P2=0XA0;P0=0Xff;//打开蜂鸣器和继电器
// }
//}
void delayms(int ms)
{
int i,j;
for(i=ms;i>0;i--)
for(j=845;j>0;j--);
}
//如果数码管不亮,把这个延时换为上面的
//void delaypp(int ms)//数码管专用延时
//{
// int i,j;
// for(i=ms;i>0;i--)
// for(j=80;j>0;j--);
//}
void allinit()
{
P2=0XA0;
P0=0X00;//关闭蜂鸣器,继电器
P2=0X80;
P0=0XFF;//关闭LED灯
P2=0XC0;
P0=0XFF;//选择所有数码管
P2=0XFF;
P0=0XFF;//关闭所有数码管
}
void display1(uchar yi,uchar er)
{
P2=0XC0;//打开位选573 U8
P0=0X01;//选择第一个数码管
P2=0XFF;//打开段选573 U7
P0=tab[yi];
delayms(1);
P2=0XC0;
P0=0X02;
P2=0XFF;
P0=tab[er];
delayms(1);
}
void display2(uchar san,uchar si)
{
P2=0XC0;
P0=0X04;
P2=0XFF;
P0=tab[san];
delayms(1);
P2=0XC0;
P0=0X08;
P2=0XFF;
P0=tab[si];
delayms(1);
}
void display3(uchar wu,uchar liu)
{
P2=0XC0;
P0=0X10;
P2=0XFF;
P0=tab[wu];
delayms(1);
P2=0XC0;
P0=0X20;
P2=0XFF;
P0=tab[liu];
delayms(1);
}
void display4(uchar qi,uchar ba)
{
P2=0XC0;
P0=0X40;
P2=0XFF;
P0=tab[qi];
delayms(1);
P2=0XC0;
P0=0X80;
P2=0XFF;
P0=tab[ba];
delayms(1);
}