#include "reg52.h"
#include "ds1302.h"
#include "onewire.h"
sfr AUXR=0x8e;
sfr P4=0xc0;
sbit port1=P3^2;
sbit port2=P3^3;
sbit res1=P3^4;
sbit res2=P3^5;
sbit otherbit1=P3^0;
sbit otherbit2=P3^1;
code unsigned char seg_code[13]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xc1,0xff,0xbf};
code unsigned char read_addr[7]={0x81,0x83,0x85,0x87,0x89,0x8b,0x8d};
code unsigned char write_addr[7]={0x80,0x82,0x84,0x86,0x88,0x8a,0x8c};
unsigned char ledcounter=0;
unsigned char isRelay=0;
unsigned char tcounter=0;
unsigned char led_stat=0xfd;//1111 1101
unsigned char time[7]={0x50,0x59,0x13,0x12,0x04,0x06,0x24};
unsigned char timer0counter=0;
unsigned char ui_stat=1;//temp time setting
unsigned char mod_stat=1;//temp time
unsigned char time_mod=1;
unsigned char timer1counter=0;
double temp=0;
double buffer=0;
unsigned char key_val=0;
unsigned char set_temp=23;
unsigned char clock_flag=1;
void write_latch(unsigned char n,unsigned char val);
void enable_latch(unsigned char n);
void read_temp();
void init_sys(){
write_latch(4,0xfd);
write_latch(5,0x00);
write_latch(6,0xff);
write_latch(7,0xff);
}
unsigned char bcd2dec(unsigned char bcd){
unsigned char dec=0;
dec=bcd>>4;
dec*=10;
dec+=(bcd&0x0f);
return dec;
}
void set1302(){
unsigned char i=0;
Write_Ds1302_Byte(0x8e,0x00);
for(i=0;i<8;i++){
Write_Ds1302_Byte(write_addr[i],time[i]);
}
Write_Ds1302_Byte(0x8e,0x80);
}
void read_time(){
unsigned char i=0;
unsigned char tmp=0x00;
//read_temp();
for(i=0;i<8;i++){
time[i]=Read_Ds1302_Byte(read_addr[i]);
}
if((time[0]==0x00)&&(time[1]==0x00)&&clock_flag){
/relay
clock_flag=0;
timer1counter=0;
TR1=1;
enable_latch(4);
led_stat&=0xfe;
tmp=P0;
P0=led_stat;
enable_latch(0);
P0=tmp;
if(mod_stat==2){
write_latch(5,0x10);
isRelay=1;
}
}
}
void display_dat();
void enable_latch(unsigned char n){
switch(n){
case 0:
P2&=0x1f;
P2|=0x00;
break;
case 4:
P2&=0x1f;
P2|=0x80;
break;
case 5:
P2&=0x1f;
P2|=0xa0;
break;
case 6:
P2&=0x1f;
P2|=0xc0;
break;
case 7:
P2&=0x1f;
P2|=0xe0;
break;
}
}
void write_latch(unsigned char n,unsigned char val){
P0=val;
switch(n){
case 4:
P2&=0x1f;
P2|=0x80;
break;
case 5:
P2&=0x1f;
P2|=0xa0;
break;
case 6:
P2&=0x1f;
P2|=0xc0;
break;
case 7:
P2&=0x1f;
P2|=0xe0;
break;
}
P2&=0x1f;
}
void Delay1ms() //@12.000MHz
{
unsigned char i, j;
i = 12;
j = 169;
do
{
while (--j);
} while (--i);
}
void delay_ms_smg(unsigned char t){
while(t--){
Delay1ms();
}
}
void delay_ms(unsigned char t){
while(t--){
Delay1ms();
}
}
void delay(unsigned char t){
while(t--){
display_dat();
}
}
void scan_keys(){
unsigned char tmp;
port1=0;
port2=1;otherbit1=1;otherbit2=1;
if(res1==0){
delay_ms(10);
if(res1==0){
//key_val=17;
//write_latch(4,0x00);
if(ui_stat==3){
set_temp--;
if(set_temp<10){
set_temp=99;
}
}
else if(ui_stat==2){
while(res1==0){
time_mod=2;
//read_time();
display_dat();
}
time_mod=1;
}
}
}
if(res2==0){
delay_ms(10);
if(res2==0){
//key_val=13;abcd
if(mod_stat==1){
mod_stat=2;
enable_latch(4);
led_stat|=0x02; //0000 0010
tmp=P0;
P0=led_stat;
enable_latch(0);
P0=tmp;
}
else if(mod_stat==2){
mod_stat=1;
enable_latch(4);
led_stat&=0xfd;//1111 1101
tmp=P0;
P0=led_stat;
enable_latch(0);
P0=tmp;
}
}
}
port2=0;
port1=1;otherbit1=1;otherbit2=1;
if(res1==0){
delay_ms(10);
if(res1==0){
//key_val=16;
if(ui_stat==3){
set_temp++;
if(set_temp>99){
set_temp=10;
}
}
}
}
if(res2==0){
delay_ms(10);
if(res2==0){
//key_val=12;
if(ui_stat==1){
ui_stat=2;
}
else if(ui_stat==2){
ui_stat=3;
}
else if(ui_stat==3){
ui_stat=1;
}
}
}
}
void display_bit(unsigned char pos,unsigned char val,unsigned char dot){
write_latch(6,0x01<<(pos-1));
if(dot){
write_latch(7,seg_code[val]&0x7f);
}
else{
write_latch(7,seg_code[val]);
}
}
void read_temp(){
unsigned char LOW;
unsigned char HIGH;
unsigned int dat16;
init_ds18b20();
Write_DS18B20(0xcc);
Write_DS18B20(0x44);
delay(100);
init_ds18b20();
Write_DS18B20(0xcc);
Write_DS18B20(0xbe);
LOW=Read_DS18B20();
HIGH=Read_DS18B20();
init_ds18b20();
dat16=HIGH;
dat16=dat16<<8;
dat16|=LOW;
temp=(double)dat16*0.0625;
}
void display_UX(unsigned char n){
display_bit(1,10,0);
delay_ms(2);
display_bit(1,11,0);
display_bit(2,n,0);
delay_ms(2);
display_bit(2,11,0);
}
void off_bit(unsigned pos){
display_bit(pos,11,0);
}
void display_dat(){
//read_time();
if(ui_stat==1){
display_UX(1);
off_bit(3);
off_bit(4);
off_bit(5);
display_bit(6,temp/10,0);
delay_ms(2);
display_bit(6,11,0);
display_bit(7,(unsigned int)temp%10,1);
delay_ms(2);
display_bit(7,11,0);
display_bit(8,(unsigned int)(temp*10)%10,0);
delay_ms(2);
display_bit(8,11,0);
}
if(ui_stat==2){
display_UX(2);
read_time();
if(time_mod==1){
off_bit(3);
display_bit(4,bcd2dec(time[2])/10,0);
delay_ms(2);
display_bit(4,11,0);
display_bit(5,bcd2dec(time[2])%10,0);
delay_ms(2);
display_bit(5,11,0);
display_bit(6,12,0);
delay_ms(2);
display_bit(6,11,0);
display_bit(7,bcd2dec(time[1])/10,0);
delay_ms(2);
display_bit(7,11,0);
display_bit(8,bcd2dec(time[1])%10,0);
delay_ms(2);
display_bit(8,11,0);
}
else if(time_mod==2){
off_bit(3);
display_bit(4,bcd2dec(time[1])/10,0);
delay_ms(2);
display_bit(4,11,0);
display_bit(5,bcd2dec(time[1])%10,0);
delay_ms(2);
display_bit(5,11,0);
display_bit(6,12,0);
delay_ms(2);
display_bit(6,11,0);
display_bit(7,bcd2dec(time[0])/10,0);
delay_ms(2);
display_bit(7,11,0);
display_bit(8,bcd2dec(time[0])%10,0);
delay_ms(2);
display_bit(8,11,0);
}
}
if(ui_stat==3){
display_UX(3);
off_bit(3);
off_bit(4);
off_bit(5);
off_bit(6);
display_bit(7,set_temp/10,0);
delay_ms(2);
off_bit(7);
display_bit(8,set_temp%10,0);
delay_ms(2);
off_bit(8);
}
}
void Timer0Init(void) //2ms@12.000MHz
{
EA=1;
ET0=1;
AUXR &= 0x7F;
TMOD &= 0xF0;
TMOD |= 0x01;
TL0 = 0xB0;
TH0 = 0x3C;
TF0 = 0;
TR0 = 1;
}
void timer0server() interrupt 1{
unsigned char tmp2;
TL0 = 0xB0; //
TH0 = 0x3C; //
timer0counter++;
tcounter++;
ledcounter++;
if(timer0counter==4){
scan_keys();
timer0counter=0;
tcounter++;
}
if(tcounter==10){
buffer=temp;
read_time();
temp=buffer;
tcounter=0;
}
if(ledcounter==5){
ledcounter=0;
if(isRelay==1){
enable_latch(4);
if((led_stat&0x04)==0x04){//1111 1011 0000 0100
led_stat&=0xfb;
}
else{
led_stat|=0x04;
}
tmp2=P0;
P0=led_stat;
enable_latch(0);
P0=tmp2;
}
}
//display_dat();
}
void Timer1Init(void) //50ms@12.000MHz
{
AUXR &= 0xBF;
TMOD &= 0x0F;
TMOD |= 0x10;
TL1 = 0xB0;
TH1 = 0x3C;
EA=1;
ET1=1;
TF1 = 0;
TR1 = 0;
}
void timer1server() interrupt 3{
unsigned char tmp;
TL1 = 0xB0; //??????
TH1 = 0x3C; //??????
timer1counter++;
if(timer1counter==100){//5s
clock_flag=1;
TR1=0;
enable_latch(4);
led_stat|=0x01;
tmp=P0;
P0=led_stat;
enable_latch(0);
P0=tmp;
if(mod_stat==2){
write_latch(5,0x00);
isRelay=0;
}
}
}
void relay_temp_ctrl(){
if(temp>set_temp){
write_latch(5,0x10);//001 0000
isRelay=1;
}
else{
isRelay=0;
write_latch(5,0x00);
}
}
void main(){
init_sys();
set1302();
Timer0Init();
Timer1Init();
while(1){
read_temp();
if(mod_stat==1){
relay_temp_ctrl();
}
else{
}
display_dat();
}
}
第十三届蓝桥杯单片机组省赛题解
于 2024-03-02 20:27:29 首次发布
本文详细介绍了使用51单片机控制DS1302实时时钟,处理按键输入,以及温度监控和LED控制的功能。代码涉及中断处理、I/O操作和时间显示等功能模块。
摘要由CSDN通过智能技术生成