|
電路圖.jpg (1.69 MB, 下載次數: 131)
下載附件
電路圖
2015-9-20 01:54 上傳
#include <STC12C2052AD.h>
#include <intrins.h>
/*-----------------------------------接口定義-------------------------------------*/
sbit vcc1=P3^1;
sbit vcc2=P3^4;
sbit vcc3=P3^5;
sbit vcc4=P1^1;
sbit LEDa=P3^2;
sbit LEDb=P1^0;
sbit LEDc=P1^3;
sbit LEDd=P1^5;
sbit LEDe=P1^6;
sbit LEDf=P3^3;
sbit LEDg=P1^2;
sbit LEDp=P1^4;
sbit key=P3^7;
sbit beep=P3^0;
/*-------------------------------------變量定義-------------------------------------*/
unsigned char menu;
unsigned char code numtab[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
unsigned char sec,min,hour,T_time;
bit p_sw;
/*-------------------------------------延時函數-------------------------------------*/
void delayms (unsigned int a){
unsigned int i;
while( --a != 0){
for (i = 0; i < 12; i++);
}
}
/*----------------------------------數碼管驅動函數----------------------------------*/
void displayoff (void)
{
vcc1=0;
vcc2=0;
vcc3=0;
vcc4=0;
LEDa=1;
LEDb=1;
LEDc=1;
LEDd=1;
LEDe=1;
LEDf=1;
LEDg=1;
LEDp=1;
// delayms(1);
}
/***********************************************************************************/
void bit1 (unsigned char d)
{
unsigned char i;
i=d&0x01;
if (i==0x01){
vcc1=1;LEDa=0;}delayms(15);displayoff();
i=d&0x02;
if (i==0x02){
vcc1=1;LEDb=0;}delayms(15);displayoff();
i=d&0x04;
if (i==0x04){
vcc1=1;LEDc=0;}delayms(15);displayoff();
i=d&0x08;
if (i==0x08){
vcc1=1;LEDd=0;}delayms(15);displayoff();
i=d&0x10;
if (i==0x10){
vcc1=1;LEDe=0;}delayms(15);displayoff();
i=d&0x20;
if (i==0x20){
vcc1=1;LEDf=0;}delayms(15);displayoff();
i=d&0x40;
if (i==0x40){
vcc1=1;LEDg=0;}delayms(15);displayoff();
i=d&0x80;
if (i==0x80){
vcc1=1;LEDp=0;}delayms(15);displayoff();
}
/***********************************************************************************/
void bit2 (unsigned char d)
{
unsigned char i;
i=d&0x01;
if (i==0x01){
vcc2=1;LEDa=0;}delayms(15);displayoff();
i=d&0x02;
if (i==0x02){
vcc2=1;LEDb=0;}delayms(15);displayoff();
i=d&0x04;
if (i==0x04){
vcc2=1;LEDc=0;}delayms(15);displayoff();
i=d&0x08;
if (i==0x08){
vcc2=1;LEDd=0;}delayms(15);displayoff();
i=d&0x10;
if (i==0x10){
vcc2=1;LEDe=0;}delayms(15);displayoff();
i=d&0x20;
if (i==0x20){
vcc2=1;LEDf=0;}delayms(15);displayoff();
i=d&0x40;
if (i==0x40){
vcc2=1;LEDg=0;}delayms(15);displayoff();
i=d&0x80;
if (i==0x80){
vcc2=1;LEDp=0;}delayms(15);displayoff();
}
/***********************************************************************************/
void bit3 (unsigned char d)
{
unsigned char i;
i=d&0x01;
if (i==0x01){
vcc3=1;LEDa=0;}delayms(15);displayoff();
i=d&0x02;
if (i==0x02){
vcc3=1;LEDb=0;}delayms(15);displayoff();
i=d&0x04;
if (i==0x04){
vcc3=1;LEDc=0;}delayms(15);displayoff();
i=d&0x08;
if (i==0x08){
vcc3=1;LEDd=0;}delayms(15);displayoff();
i=d&0x10;
if (i==0x10){
vcc3=1;LEDe=0;}delayms(15);displayoff();
i=d&0x20;
if (i==0x20){
vcc3=1;LEDf=0;}delayms(15);displayoff();
i=d&0x40;
if (i==0x40){
vcc3=1;LEDg=0;}delayms(15);displayoff();
i=d&0x80;
if (i==0x80){
vcc3=1;LEDp=0;}delayms(15);displayoff();
}
/***********************************************************************************/
void bit4 (unsigned char d)
{
unsigned char i;
i=d&0x01;
if (i==0x01){
vcc4=1;LEDa=0;}delayms(15);displayoff();
i=d&0x02;
if (i==0x02){
vcc4=1;LEDb=0;}delayms(15);displayoff();
i=d&0x04;
if (i==0x04){
vcc4=1;LEDc=0;}delayms(15);displayoff();
i=d&0x08;
if (i==0x08){
vcc4=1;LEDd=0;}delayms(15);displayoff();
i=d&0x10;
if (i==0x10){
vcc4=1;LEDe=0;}delayms(15);displayoff();
i=d&0x20;
if (i==0x20){
vcc4=1;LEDf=0;}delayms(15);displayoff();
i=d&0x40;
if (i==0x40){
vcc4=1;LEDg=0;}delayms(15);displayoff();
i=d&0x80;
if (i==0x80){
vcc4=1;LEDp=0;}delayms(15);displayoff();
}
/***********************************************************************************/
void display(unsigned char l,unsigned char d)
{
switch (l)
{
case 1:
bit1(d);
break;
case 2:
bit2(d);
break;
case 3:
bit3(d);
break;
case 4:
bit4(d);
break;
}
}
/*--------------------------------A/D轉換初始化函數--------------------------------*/
void read_init (unsigned char CHA)
{
unsigned char AD_FIN=0; //存儲A/D轉換標志
CHA &= 0x07; //選擇ADC的8個接口中的一個(0000 0111 清0高5位)
ADC_CONTR = 0x40; //ADC轉換的速度(0XX0 0000 其中XX控制速度,請根據數據手冊設置)
_nop_();
ADC_CONTR |= CHA; //選擇A/D當前通道
_nop_();
ADC_CONTR |= 0x80; //啟動A/D電源
delayms(1); //使輸入電壓達到穩定(1ms即可)
}
/*-----------------------------------A/D讀取函數-----------------------------------*/
unsigned char T_read (void){
unsigned char AD_FIN=0; //存儲A/D轉換標志
ADC_CONTR |= 0x08; //啟動A/D轉換(0000 1000 令ADCS = 1)
_nop_();
_nop_();
_nop_();
_nop_();
while (AD_FIN ==0){ //等待A/D轉換結束
AD_FIN = (ADC_CONTR & 0x10); //0001 0000測試A/D轉換結束否
}
ADC_CONTR &= 0xE7; //1111 0111 清ADC_FLAG位, 關閉A/D轉換,
return (ADC_DATA/2); //返回A/D轉換結果(8位)
}
/*--------------------------------------主函數--------------------------------------*/
void main(void)
{
unsigned char temp,j,temperature;
unsigned char ahour,amin;
bit a_sw,a_temp;
TMOD=0x01;//定時器工作方式1
TH0=0x3C;//定時器初始產生50ms時基信號
TL0=0xB0;//定時器初始產生50ms時基信號
EA=1;//開總中斷
read_init(7);
temperature=T_read();
P1M0=0x80;
P1M1=0x02;
P3M0=0x00;
P3M1=0x32;
/************************************************************************************/
while(1)
{
if (ahour==hour&&amin==min&&sec==0&&a_sw&&a_temp&&menu!=2&&menu!=3&&menu!=7&&menu!=8)
{
menu=9;
}
if (sec==1&&min==0&&menu!=9)
{
beep=1;
}
/*-----------------------------------菜單切換程序-----------------------------------*/
if (menu==0)
{
display(1,0x40);
display(2,0x40);
display(3,0x40+0x80);
display(4,0x40+0x80);
if (key==0)
{
temp++;
if (temp>10)
{
temp=0;
ET0=1;//開定時器中斷
TR0=1;//啟動定時器
menu=1;
while (key==0);
}
}
}
/************************************************************************************/
if (menu==1)
{
if (hour<10)
{
display(1,0x00);
}
else
{
display(1,numtab[hour/10]);
}
display(2,numtab[hour%10]);
display(3,numtab[min/10]+(sec%2)*0x80);
display(4,numtab[min%10]+(sec%2)*0x80);
if (T_time>7)
{
menu=5;
}
if (key==0)
{
temp++;
T_time=0;
if (temp>150)
{
temp=0;
menu=2;
while (key==0);
/* {
if (hour<10)
{
display(1,0x00);
}
else
{
display(1,numtab[hour/10]);
}
display(2,numtab[hour%10]);
display(3,0x80);
display(4,0x80);
} */
}
}
if (key==1&&temp>10)
{
temp=0;
T_time=0;
menu=6;
}
}
/************************************************************************************/
if (menu==2)
{
if (hour<10)
{
display(1,0x00);
}
else
{
display(1,numtab[hour/10]);
}
display(2,numtab[hour%10]);
display(3,0x80);
display(4,0x80);
if (key==0)
{
temp++;
if (temp>150)
{
temp=0;
menu=3;
while (key==0);
/* {
display(3,numtab[min/10]+0x80);
display(4,numtab[min%10]+0x80);
} */
}
}
if (key==1&&temp>10)
{
temp=0;
hour++;
if (hour>23)
{
hour=0;
}
sec=0;
}
}
/************************************************************************************/
if (menu==3)
{
display(3,numtab[min/10]+0x80);
display(4,numtab[min%10]+0x80);
if (key==0)
{
temp++;
if (temp>150)
{
temp=0;
menu=4;
while (key==0);
/* {
if (hour<10)
{
display(1,0x00);
}
else
{
display(1,numtab[hour/10]);
}
display(2,numtab[hour%10]);
display(3,numtab[min/10]+(sec%2)*0x80);
display(4,numtab[min%10]+(sec%2)*0x80);
} */
}
}
if (key==1&&temp>10)
{
temp=0;
min++;
if (min>59)
{
min=0;
}
sec=0;
}
}
/************************************************************************************/
if (menu==4)
{
if (p_sw)
{
display(1,0x73);
display(2,0x00);
display(3,0x3f);
display(4,0x37);
}
else
{
display(1,0x73);
display(2,0x3f);
display(3,0x71);
display(4,0x71);
}
if (key==0)
{
temp++;
if (temp>150)
{
temp=0;
menu=1;
while (key==0);
}
}
if (key==1&&temp>10)
{
temp=0;
p_sw=~p_sw;
}
}
/************************************************************************************/
if (menu==5)
{
if (T_time>9)
{
T_time=0;
menu=1;
}
if (sec%2)
{
temperature=T_read();
}
if (temperature<10)
{
display(1,0x00);
}
else
{
display(1,numtab[temperature/10]);
}
display(2,numtab[temperature%10]);
display(3,0xD8);
while(key==0)
{
if (sec%2)
{
temperature=T_read();
}
if (temperature<10)
{
display(1,0x00);
}
else
{
display(1,numtab[temperature/10]);
}
display(2,numtab[temperature%10]);
display(3,0xD8);
}
}
/************************************************************************************/
if (menu==6)
{
if (T_time>2)
{
T_time=0;
menu=1;
}
if (key==0)
{
T_time=0;
}
if (a_temp)
{
if (ahour<10)
{
display (1,0x00);
}
else
{
display (1,numtab[ahour/10]);
}
display (2,numtab[ahour%10]);
display (3,numtab[amin/10]+0x80);
display (4,numtab[amin%10]+0x80);
}
else
{
display (1,0x40);
display (2,0x40);
display (3,0x40+0x80);
display (4,0x40+0x80);
}
if (key==0)
{
temp++;
if (temp>150)
{
temp=0;
a_temp=1;
menu=7;
while (key==0);
}
}
if (key==1&&temp>10)
{
temp=0;
a_sw=~a_sw;
if (a_sw)
{
for (j=0;j<100;j++)
{
display (1,0x77);
display (2,0x00);
display (3,0x3f);
display (4,0x37);
}
}
else
{
for (j=0;j<100;j++)
{
display (1,0x77);
display (2,0x3f);
display (3,0x71);
display (4,0x71);
}
}
}
}
/************************************************************************************/
if (menu==7)
{
if (ahour<10)
{
display (1,0x00);
}
else
{
display (1,numtab[ahour/10]);
}
display (2,numtab[ahour%10]);
display (3,0x80);
display (4,0x80);
if (key==0)
{
temp++;
if (temp>150)
{
temp=0;
menu=8;
while (key==0);
}
}
if (key==1&&temp>10)
{
temp=0;
ahour++;
if (ahour>23)
{
ahour=0;
}
a_sw=1;
a_temp=1;
}
}
/************************************************************************************/
if (menu==8)
{
display (1,0x00);
display (2,0x00);
display (3,numtab[amin/10]+0x80);
display (4,numtab[amin%10]+0x80);
if (key==0)
{
temp++;
if (temp>150)
{
temp=0;
T_time=0;
menu=6;
while (key==0);
}
}
if (key==1&&temp>10)
{
temp=0;
amin++;
if (amin>59)
{
amin=0;
}
a_sw=1;
a_temp=1;
}
}
/************************************************************************************/
if (menu==9)
{
if (hour<10)
{
display (1,0x00);
}
else
{
display (1,numtab[hour/10]);
}
display (2,numtab[hour%10]);
display (3,numtab[min/10]+(sec%2)*0x80);
display (4,numtab[min%10]+(sec%2)*0x80);
beep=sec%2;
if (key==0)
{
temp++;
if (temp>10)
{
temp=0;
beep=1;
T_time=0;
menu=1;
while (key==0);
}
}
if (sec==59)
{
beep=1;
menu=1;
T_time=0;
}
}
}
}
/*-----------------------------------中斷服務程序-----------------------------------*/
void Timer0_Routine(void) interrupt 1
{
unsigned char count;
TH0=0x3C;
TL0=0xB0;
count++;
if (count==20)
{
count=0;
sec++;
T_time++;
if (sec>59)
{
sec=0;
min++;
if (min>59)
{
min=0;
hour++;
if (p_sw&&menu!=3)
{
beep=0;
}
if (hour>23)
{
hour=0;
}
}
}
}
}
|
-
-
時鐘 溫度 程序.zip
2015-9-20 01:56 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
1.77 MB, 下載次數: 55, 下載積分: 黑幣 -5
評分
-
查看全部評分
|