📄 kcsj.c
字号:
#include <reg52.h>
#include <math.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
code uchar table[11] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff};
uchar led[4];
uchar decimal=0; //小数点
uchar up=32,down=15;
uchar kk=0;
bit md,setflag;
unsigned long overflow=0,cnt; //定时器1和2的溢出变量
uchar sec=11,hour=0,min=26,month=9,day=17,xq,dingshil,dingshih;//时间(秒,分,时),秒表(高位,低位)
uint year=2007;
uchar displays=0;
unsigned char table1[13]={31,28,31,30,31,30,31,31,30,31,30,31};
unsigned char table2[13]={31,29,31,30,31,30,31,31,30,31,30,31};
/************************/
sbit clock = P2^2; //时钟口线
sbit dataout = P2^1; //数据输出口线
sbit cs = P2^0;//片选口线
sbit s3 = P1^3;
sbit s2 = P1^1;
sbit s1 = P1^2;
sbit s0 = P1^0;
sbit bell=P2^7;
/***********************/
sbit set = P1^4;
sbit add = P1^5;
sbit dec = P3^6;
sbit change =P3^7;
void delay_us()//AD转换延时
{
uint i;
for(i=0;i<3;i++);
}
void delay_ms()//动态扫描延时
{
uint i;
for(i=0;i<100;i++);
}
void display(void)
{
P1|=0x0f; //lit off all led
P0=0xff;
s0=0;
P0=table[led[0]];
delay_ms();
P1|=0x0f; //lit off all led
P0=0xff;
s1=0;
P0=table[led[1]];
delay_ms();
P1|=0x0f; //lit off all led
P0=0xff;
s2=0;
P0=table[led[2]]+decimal;
delay_ms();
P1|=0x0f; //lit off all led
P0=0xff;
s3=0;
P0=table[led[3]];
delay_ms();
P1|=0x0f; //lit off all led
P0=0xff;
}
void keyscan()
{
kk++;
if(kk==3)
kk=0;
}
void ttchange()
{ displays++;
if(displays==6)
displays=0;
}
uchar adc()
{
uchar i,value = 0;
clock = 0;
cs = 1;
delay_us();
cs = 0;
for(i=0;i<8;i++)
{
value <<= 1;
clock = 1;
if(dataout == 1)
value |=0x01;
clock = 0;
}
cs = 1;
return value;
}
void towset()
{ if(set==0) {while(set==0);setflag=~setflag;}
}
uint xqwork()
{
uint b,days,i;
if((year%4)==0&&(year%100)!=0)
{
for(i=0;i<month-1;i++)
days+=table2[i];
}
else
{
for(i=0;i<month-1;i++)
days+=table1[i];
}
days+=day;
b=year-1+(unsigned int)((year-1)/4)-(unsigned int)((year-1)/100)+(unsigned int)((year-1)/400)+days;
xq=b%7;
days=0;
return(xq);
}
void timer1(void) interrupt 1 // 定时器
{
overflow++;
if(overflow==3300) {sec++;overflow=0;md=~md;}
}
void timer2(void) interrupt 3
{
cnt++;
if(cnt==36)
{
dingshil++;
cnt=0;
if(dingshil==100)
{
dingshih++;
dingshil=0;
}
}
}
///////////主函数//////////
main()
{
uchar tmp;
uint j=20;
float temp,k;
TMOD=0x22; //计时器中断设置
TH0=6;
TL0=6; //定时时间T=256-6=250 U
TH1=6;
TL1=6;
ET0=1;
ET1=1;
EA=1;
TR0=1;
while(1)
{
if(change==0){ while(change==0); ttchange(); }
if(displays==0) //displays的初值是0
{
TR1=0;
if(md==0) decimal=0x80;
else decimal=0;
led[0]=min%10; //分
led[1]=min/10; //分
led[2]=hour%10; //小时
led[3]=hour/10; //小时
towset(); //设置时间,若无按键,跳过
if(setflag){ //setflag没有设初
if(add==0){while(add==0);min++;if(min==60){hour++;min=0;}}
if(dec==0){while(dec==0);if(min==0){if(hour==0) hour=23;else hour--;min=59;} else min--;}
}
else {if(add==0){while(add==0);hour++;if(hour==24){day++;hour=0;}}
if(dec==0){while(dec==0);if(hour==0){day--;hour=23;} else hour--;}
}
}
if(displays==1) //显示日月
{
TR1=0;
decimal=0x80;
led[0]=day%10;
led[1]=day/10;
led[2]=month%10;
led[3]=month/10;
towset(); //设置时间,若无按键,跳过
if(setflag){
if(add==0){while(add==0);day++;
if(month==2&&((year%4)==0&&(year%100)!=0)&&day==30){day=1;month++;}
else if(month==2&&day==29){day=1;month++;}
else if((month==4||month==6||month==9||month==11)&&day==31){day=1;month++;}
else if(day==32){day=1;month++;}
}
if(dec==0){while(dec==0);day--;
if(month==3&&((year%4)==0&&(year%100)!=0)&&day==0){day=29;month--;}
else if(month==3&&day==0){day=28;month--;}
else if((month==5||month==7||month==10||month==12)&&day==0){day=30;month--;}
else if(day==0){day=31;month--;}
}
}
else {if(add==0){while(add==0);month++;if(month==13){year++;month=1;}}
if(dec==0){while(dec==0);month--;if(month==0){year--;month=12;}}
}
}
if(displays==2) //显示星期
{
TR1=0;
decimal=0;
xq=xqwork();
led[0]=xq;
led[1]=table[10];
led[2]=table[10];
led[3]=table[10];
}
if(displays==3) //显示年份
{
TR1=0;
decimal=0;
led[0]=year%10;
led[1]=(year%100)/10;
led[2]=(year/100)%10;
led[3]=(year/100)/10;
if(add==0){while(add==0);year++;}
if(dec==0){while(dec==0);year--;}
}
if(displays==4) //定时
{ decimal=0x80;
led[0]=dingshil%10;
led[1]=dingshil/10;
led[2]=dingshih%10;
led[3]=dingshih/10;
if(add==0){while(add==0);TR1=0;}
if(dec==0){while(dec==0);TR1=1;}
if(set==0){while(set==0);TR1=0;dingshil=0;dingshih=0;}
}
if(displays==5)
{
TR1=0;
if(set==0)
{ while(set==0);
keyscan();
}
if(kk==0) //kk的初值是零,以下是温度计算
{ tmp = adc();
temp = (float)tmp;
k = log(temp/(255-temp));
temp = k/3380 + 1/298.15;
temp = 1/temp -270.15;
j = (uint)(temp*100);
led[3] = j/1000;
led[2] = j/100%10;
led[1] = j/10%10;
led[0] = j%10;
decimal=0x80;
j/=100;
}
if(kk==1)
{ decimal=0;
if(add==0) {while(add==0);up++; }
if(dec==0) {while(dec==0);up--; }
led[0]=(up%10);
led[1]=(up%100)/10;
led[2]=led[3]=10;
display();
}
if(kk==2)
{ decimal=0;
if(add==0) {while(add==0);down++; }
if(dec==0) {while(dec==0);down--; }
led[0]=down%10;
led[1]=(down%100)/10;
led[2]=led[3]=10;
display();
}
}
if (sec>=60) {sec=0;min++;} //时间转化
if (min>=60) {min=0;hour++;}
if (hour>=24){hour=0;day++;}
if(month==2&&((year%4)==0&&(year%100)!=0)&&day==30)day=1;
else if(month==2&&day==29)day=1;
else if((month==4||month==6||month==9||month==11)&&day==31)day=1;
else if(day==32)day=1;
if (month>=13){ month=1;year++;}
if(j>=up||j<=down) bell=0;
else bell=1;
display();
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -