📄 text3.c
字号:
//闹钟3
#include <STC12C5410AD.h>
#include <intrins.h>
//#include "stdio.h"
sbit HC138_2=P2^0;
sbit HC138_1=P2^1;
sbit HC138_3=P2^2;
sbit SERIALIN=P2^3; //595_14 SER
sbit CLOCK=P2^6; //595_11 CLOCK
sbit LATCH=P2^7; //595_12 RCLK
sbit BM=P3^0; //秒闪
sbit SPEAK=P3^1; //输出蜂鸣,输入保存
sbit INT_0=P3^2;
sbit INT_1=P3^3;
sbit DQ =P3^7; //温度检测
bit Noeep,D_F,E_F,Naozhong,KAIJI; //D_F=0蜂鸣标志,E_F=0闪烁标志
void InitialMCU();
void shanshuo();
unsigned char n,dig,Time;
unsigned char Banmiao,s;
unsigned char code shu[11]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x00};
// 0xBF,0x86,0xDB,0xCF,0xE6,0xED,0xFD,0x87,0xFF,0xEF,0x00,0x80};
unsigned char a[8],b[8], ShowCase[8];
unsigned char wendu,e,f;
unsigned int p,TimeCom;
void delay(unsigned int i)
{
while(i--);
}
Init_DS18B20(void) //18b20初始化函数
{
unsigned char x=0;
DQ = 1; //DQ复位
delay(80);
//delay(160); //稍做延时
DQ = 0; //单片机将DQ拉低
delay(800);
//delay(1600); //精确延时 大于 480us
DQ = 1; //拉高总线
delay(100);
//delay(300);
x=DQ; //稍做延时后 如果x=0则初始化成功 x=1则初始化失败
delay(160);
//delay(400);
}
ReadOneChar(void) //读一个字节
{
unsigned char i=0;
unsigned char dat=0;
for(i=8;i>0;i--)
{
DQ=0; // 给脉冲信号
dat>>=1;
DQ=1; // 给脉冲信号
if(DQ)
dat|=0x80;
delay(80);
}
return(dat);
}
WriteOneChar(unsigned char dat) //写一个字节
{
unsigned char i=0;
for (i=8; i>0; i--)
{
DQ = 0;
DQ = dat&0x01;
delay(100);
DQ = 1;
dat>>=1;
}
}
ReadTemperature(void) //读取温度
{
unsigned char a=0;
unsigned char b=0;
unsigned int t=0;
Init_DS18B20();
WriteOneChar(0xCC); // 跳过读序号列号的操作
WriteOneChar(0x44); // 启动温度转换
Init_DS18B20();
WriteOneChar(0xCC); //跳过读序号列号的操作
WriteOneChar(0xBE); //读取温度寄存器等(共可读9个寄存器) 前两个就是温度
a=ReadOneChar();
b=ReadOneChar();
t=b;
t<<=8;
t=t|a;
t=t*0.0625;
return(t);
}
unsigned char eeprom_read(unsigned int byte_addr)
{
ISP_ADDRH = (unsigned char)(byte_addr >> 8);
ISP_ADDRL = (unsigned char)(byte_addr & 0x00ff);
EA=0;
ISP_CONTR = 0X81;
ISP_CMD = 1;
ISP_TRIG = 0X46;
ISP_TRIG = 0XB9;
_nop_();
EA=1;
return(ISP_DATA);
}
void eeprom_write(unsigned int byte_addr, unsigned char DataBuf)
{
ISP_ADDRH = (unsigned char)(byte_addr >> 8);
ISP_ADDRL = (unsigned char)(byte_addr & 0x00ff);
ISP_DATA = DataBuf;
EA=0;
ISP_CONTR = 0X81;
ISP_CMD = 2;
ISP_TRIG = 0X46;
ISP_TRIG = 0XB9;
_nop_();
EA=1;
ISP_ADDRH=0;
ISP_ADDRL=0;
ISP_CONTR=0;
ISP_CMD=0;
ISP_TRIG=0;
}
void eeprom_sector(unsigned int Sector_addr)
{
unsigned char addre;
addre = (unsigned char)(Sector_addr >> 8); // 1111,1110,0000,0000; 取扇区地址
ISP_ADDRH = addre&0xfe;
ISP_ADDRL = 0x00;
EA = 0;
ISP_CONTR = 0X81;
ISP_CMD = 3;
ISP_TRIG = 0X46;
ISP_TRIG = 0XB9;
_nop_();
EA=1;
ISP_ADDRH=0;
ISP_ADDRL=0;
ISP_CONTR=0;
ISP_CMD=0;
ISP_TRIG=0;
}
void Disp(char data_buf) //74HC595显示数字
{
unsigned char j,temp;
temp=data_buf;
for(j=0;j<8;j++)
{
temp=temp<<1;
SERIALIN=CY;
CLOCK=1;
CLOCK=0; }
LATCH=0;
LATCH=1;
}
void Display()
{ unsigned char i;
for(i=0;i<8;i++)
{ Disp(ShowCase[i]);
if(i==0)
P2 &=0xf8;
else
P2=P2+1;
delay(1000);
}
Disp(shu[10]);
}
/*
void Display()
{ if(n==7)
{n=0;P2 &=0xf8; }
else
{ n++; P2=P2+1; }
Disp(ShowCase[n]);
}*/
void shanshuo()
{ unsigned char i;
for(i=1;i<9;i++)
{ if((dig==i)&&(!E_F))
{ if((TimeCom%40)>15)
b[i-1]=10;
if(TimeCom%40<16)
b[i-1]=a[i-1];
}
else
if(dig==0)
{b[i-1]=a[i-1];
b[4]=e;b[5]=f; b[6]=10;b[7]=10;}
else //E_F=1 不闪烁
b[i-1]=a[i-1];
}
}
void Timer1(void) interrupt 3 //定时器0中断
{ unsigned char i;
//TH1 = 0xd8; //定时10MS
//TL1 = 0xf0;
TH1 = 0xb1; //定时20MS
TL1 = 0xe0;
//TH0 = 0xec; //定时5MS
//TL0 = 0x78;
//TH0 = 0xf6; //定时2.5MS
//TL0 = 0x3c;
TimeCom++;//Time++;
Display();
if(INT_0)
{ EX0=1;D_F=0; }
if(INT_1)
{ EX1=1;D_F=0; }
if ((TimeCom==(p+50))&&(!D_F))
{ SPEAK=1;
D_F=1; }
if (Banmiao==24)
{ Banmiao=0;BM=BM^1;
if(BM)
{ if(s==59)
{ s=0;
if(a[3]==9)
{a[3]=0; if(a[2]==5)
{ a[2]=0;
if((a[1]+a[0]*10)!=23)
if(a[1]==9)
{a[1]=0; a[0]=a[0]+1;}
else
a[1]++;
else
a[0]=a[1]=0;
}
else
a[2]=a[2]+1;
}
else
a[3]=a[3]+1; }
else
s++;
}
else
{ wendu=ReadTemperature(); //读温度
e=(wendu%100)/10;
f=wendu%10; }
}
else
Banmiao++;
shanshuo();
for(i=0;i<8;i++)
ShowCase[i]=shu[b[i]];
if(!E_F)
{ Time++ ;
if(Time>250)
{E_F=1;KAIJI=0; dig=0;Time=0; } }
// if (TimeCom==(p+50)&&C_F)
// EX0=1;
if(Naozhong)
{ if(Banmiao%10<5)
SPEAK=0;
else
SPEAK=1;
}
else
SPEAK=1;
//TimeCom=0;
}
void int0(void) interrupt 0
{ if(Naozhong)
{Naozhong=0;Noeep=0;}
else
{ delay(5);
if(INT_0==0)
{if(dig<8)
dig=dig+1;
else
dig=0;
E_F=0; //闪烁
p=TimeCom;
if(!D_F)
SPEAK=0;
}
KAIJI=1;
Time=0; }
EX0=0;
}
void int1(void) interrupt 2
{ if(Naozhong)
{Naozhong=0;Noeep=0;}
else
{ delay(5);
if(INT_1==0)
switch(dig)
{ case 1:
if(a[0]==2)
a[0]=0;
else
a[0]++; break;
case 2:
if(a[0]!=2)
{if(a[1]==9)
a[1]=0;
else
a[1]++;}
else
{if(a[1]==3)
a[1]=0;
else
a[1]++;} break;
case 3:
if(a[2]==5)
a[2]=0;
else
a[2]++; break;
case 4:
if(a[3]==9)
a[3]=0;
else
a[3]++; break;
case 5:
if(a[4]==2)
a[4]=0;
else
a[4]++; break;
case 6:
if(a[4]!=2)
{if(a[5]==9)
a[5]=0;
else
a[5]++;}
else
{if(a[5]==3)
a[5]=0;
else
a[5]++;} break;
case 7:
if(a[6]==5)
a[6]=0;
else
a[6]++; break;
case 8:
if(a[7]==9)
a[7]=0;
else
a[7]++; break;
default: break;
}
//C_F=1; //cc=1 快速上调
//E_F=1; //停止闪烁
p=TimeCom;
if(!D_F)
SPEAK=0;
Time=0; }
EX1=0;
}
void main(void)
{ InitialMCU();
CLOCK=0; Noeep=1;
//LATCH=1;
P1M0=0x00;
P1M1=0xff; //P1口为推挽输出
P2M0=0x00;
P2M1=0xff; //P2口为推挽输出
P3M0=0x00;
P3M1=0x00; //P3口为准双向口
//WDT_CONTR = 0x3d;
P2=0;
a[4]=eeprom_read(0x2800);
a[5]=eeprom_read(0x2801);
a[6]=eeprom_read(0x2802);
a[7]=eeprom_read(0x2803);
while(1)
{
if(KAIJI&&!dig)
{eeprom_sector(0x2800);
eeprom_write(0x2800,a[4]);
eeprom_write(0x2801,a[5]);
eeprom_write(0x2802,a[6]);
eeprom_write(0x2803,a[7]);
KAIJI=0;
}
if((a[0]==a[4])&&(a[1]==a[5])&&(a[2]==a[6])&&(a[3]==a[7]))
{ if(Noeep) Naozhong=1;
else Naozhong=0; }
else
{Naozhong=0;Noeep=1;}
}
}
void InitialMCU()
{
TCON = 0x00;
TMOD = 0x11; //初始化定时器0的参数
//AUXR=0X80; //设置定时器工作于1T还是12T,默认为12T模式
TH1 = 0xb1; //定时20MS
TL1 = 0xe0;
//TH1 = 0xd8; //定时10MS
//TL1 = 0xf0;
//TH0 = 0xec; //定时5MS
//TL0 = 0x78;
//TH0 = 0xf6; //定时2.5MS
//TL0 = 0x3c;
ET1=1;
// ET1=1;
EX1=1; //外部中断允许
EA = 1; // 开中断
TR1=1;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -