با سلام دوستان من دنبال پروژه ترموستات با 7سگمنت بودم که توی سایت خارجی با این مدار برخورد کردم میتونین کمکی کنید یه مداری به این شکل با avr atmegaساخت من برنامش رو هم میزارم به زبان اسمبلی فک کنم مداز جالبیه
[HTML][PHP]#include<reg52.h>
#include<stdio.h>
#define uchar unsigned char
#define uint unsigned int
sbit ds=P2^2; //ζȴ«¸ÐÆ÷ÐźÅÏß
sbit d1=P2^4; //ÉÏÏÞָʾµÆ
sbit d2=P2^5; //ÔÊÐíָʾµÆ
sbit d3=P2^6; //ÏÂÏÞָʾµÆ
sbit d4=P1^6; //ÉÏÏÞÉèÖÃָʾµÆ
sbit d5=P1^7; //ÏÂÏÞÉèÖÃָʾµÆ
sbit s1=P1^0; //ÉÏÏÂÏÞÉèÖü°²é¿´¼ü¼ü
sbit s2=P1^1; //Ôö´ó¼ü
sbit s3=P1^2; //¼õС¼ü
uint temp,low,high,i,m,n,t;
float f_temp;
uchar shi,ge,xiao,s1num,a,ashi,age,b,c;
unsigned char code table0[]={
0xfd,0x61,0xdb,0xf3,
0x67,0xb7,0xbf,0xe1,
0xff,0xf7}; //СÊý±àÂë
unsigned char code table1[]={
0xfc,0x60,0xda,0xf2,
0x66,0xb6,0xbe,0xe0,
0xfe,0xf6}; //ÕûÊý±àÂë
void chushihua() //³õʼ»¯º¯Êý
{
a=1;
b=0;
c=0;
low=5;
high=30;
}
void delay(uint z) //ÑÓʱº¯Êý
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void dsreset(void) //18B20¸´Î»£¬³õʼ»¯º¯Êý
{
uint i;
ds=0;
i=103;
while(i>0)i--;
ds=1;
i=4;
while(i>0)i--;
}
bit tempreadbit(void) //¶Á1λº¯Êý
{
uint i;
bit dat;
ds=0;i++; //i++ ÆðÑÓʱ×÷ÓÃ
ds=1;i++;i++;
dat=ds;
i=8;while(i>0)i--;
return (dat);
}
uchar tempread(void) //¶Á1¸ö×Ö½Ú
{
uchar i,j,dat;
dat=0;
for(i=1;i<=8;i++)
{
j=tempreadbit();
dat=(j<<7)|(dat>>1); //¶Á³öµÄÊý¾Ý×îµÍλÔÚ×îÇ°Ãæ£ ¬ÕâÑù¸ÕºÃÒ»¸ö×Ö½ÚÔÚDATÀï
}
return(dat);
}
void tempwritebyte(uchar dat) //Ïò18B20дһ¸ö×Ö½ÚÊý¾Ý
{
uint i;
uchar j;
bit testb;
for(j=1;j<=8;j++)
{
testb=dat&0x01;
dat=dat>>1;
if(testb) //д 1
{
ds=0;
i++;i++;
ds=1;
i=8;while(i>0)i--;
}
else
{
ds=0; //д 0
i=8;while(i>0)i--;
ds=1;
i++;i++;
}
}
}
void tempchange(void) //DS18B20 ¿ªÊ¼»ñȡζȲ¢×ª»»
{
dsreset();
delay(1);
tempwritebyte(0xcc); // дÌø¹ý¶ÁROMÖ¸Áî
tempwritebyte(0x44); // дζÈת»»Ö¸Áî
}
uint get_temp() //¶ÁÈ¡¼Ä´æÆ÷Öд洢µÄζÈÊý¾ Ý
{
uchar a,b;
dsreset();
delay(1);
tempwritebyte(0xcc);
tempwritebyte(0xbe);
a=tempread(); //¶ÁµÍ8λ
b=tempread(); //¶Á¸ß8λ
temp=b;
temp<<=8; //Á½¸ö×Ö½Ú×éºÏΪ1¸ö×Ö
temp=temp|a;
f_temp=temp*0.0625; //ζÈÔڼĴæÆ÷ÖÐΪ12λ ·Ö±æÂÊλ0.0625¡ã
temp=f_temp*10+0.5; //³ËÒÔ10±íʾСÊýµãºóÃæֻȡ1Î £¬¼Ó0.5ÊÇËÄÉáÎåÈë
f_temp=f_temp+0.05;
return temp; //tempÊÇÕûÐÍ
}
void deal() //ζȿØÖÆ´¦Àí×Ó³ÌÐò
{
if((t>m)&&(t<=n)) //СÓÚÉÏÏÞÖµ£¬´óÓÚÏÂÏÞÖµ
{
d2=0;
d1=1;
d3=1;
}
else if(t<=m) //СÓÚÏÂÏßÖ±½Ó
{
d3=0;
d1=1;
d2=1;
}
else //´óÓÚÉÏÏÞÖµ
{
d1=0;
d2=1;
d3=1;
}
}
void display(uint k) //ζÈÏÔʾ×Ó³ÌÐò
{
shi=k/100;
ge=k%100/10;
xiao=k%100%10;
P3=0xfb;
P0=table1[shi];
delay(1);
P3=0xfd;
P0=table0[ge];
delay(1);
P3=0xfe;
P0=table1[xiao];
delay(1);
}
void display1(uint m) //ζÈÉÏÏÂÏÞÉèÖÃÏÔʾ×Ó³ÌÐò
{
ashi=m/10;
age=m%10;
P3=0xfb;
P0=table1[ashi];
delay(1);
P3=0xfd;
P0=table1[age];
delay(1);
}
void keyscan() //¼üÅÌɨÃè×Ó³ÌÐò
{
if(s1==0) //¼ì²âS1
{
delay(5);
if(s1==0)
{
s1num++; //¼Ç¼°´Ï´ÎÊý
while(!s1);
a=0;
switch(s1num)
{ //ÉÏÏÂÏÞÖµÉ趨¶¨Î»
case 1: d5=0;
d4=1;
a=0;
b=1;
break;
case 2: d4=0;
d5=1;
c=1;
b=0;
break;
case 3: s1num=0;
d4=1;
d5=1;
b=0;
c=0;
a=1;
m=low*10;
n=high*10;
break;
}
}
}
if(s1num!=0) //Ö»Óе±S1°´Ïº󣬲żì²âS2ºÍS3
{
if(s2==0)
{
delay(1);
if(s2==0)
{
while(!s2);
b=0;
c=0;
switch(s1num)
{ //¸ù¾Ý¹¦Äܼü´ÎÊýµ÷½ÚÏàÓ¦ÊýÖ µ
case 1: low++;
if(low==99)
low=0;
b=1;
break;
case 2: high++;
if(high==99)
high=0;
c=1;
break;
}
}
}
if(s3==0)
{
delay(1);
if(s3==0)
{
while(!s3);
b=0;
c=0;
switch(s1num)
{ //¸ù¾Ý¹¦Äܼü´ÎÊýµ÷½ÚÏàÓ¦ÊýÖ µ
case 1: low--;
if(low==0)
low=99;
b=1;
break;
case 2: high--;
if(high==0)
high=99;
c=1;
break;
}
}
}
}
}
void main()
{
chushihua(); //³õʼ»¯º¯Êý
while(1)
{
keyscan();
if(b==1)
{
display1(low);
}
if(c==1)
{
display1(high);
}
if(a==1)
{
tempchange();
display(get_temp());
t=get_temp();
delay(5);
deal();
}
if(a==0)
{
d1=1;
d2=1;
d3=1;
}
}
} [/PHP][/HTML]