做完感觉还行,就是蜂鸣器和继电器卡了一下
题目如下:
代码如下:
main.c
#include "sys.h"
uint V;
uchar count;
bit T_FLAG = 0;
bit led_k = 1; //led3亮灭状态
uchar led_count;
void main(void)
{
SystemInit();
while(1)
{
key();
ReadAIN3();
if(T_FLAG)
{
T_FLAG = 0;
rd_temperature();
}
V = rb2*1.96;
DisplaySMG();
ControlInterface();
Function();
}
}
void Function(void)
{
uchar num = 0x10;
if(lock)
TR1 = 0;
else
{
TR1 = 1;
led_count = 0;
led_k = 1;
}
OperateLed(3,led_k);
if(T >= 220)
{
Operatews(num,1);
if(V > 360)
{
num |= 0x50;
Operatews(num,1);
}
else
{
Operatews(0x40,0);
}
}
else
{
Operatews(num,0);
if(V > 360)
{
num = 0x40;
Operatews(num,1);
}
else
{
Operatews(0x40,0);
}
}
// if(V > 360)
// {
//
Operatews(6,0);
// }
// else
// {
Operatews(6,0);
// }
}
void Timer0(void) interrupt 1
{
count++;
if(count == 20) //50ms*20 = 1s
{
count = 0;
T_FLAG = 1;
}
if(lock)
{
led_count++;
}
if(led_count == 2)
{
led_count = 0;
led_k = ~led_k;
}
}
sys.c
#include "sys.h"
void Select_74hc138(uchar channel)
{
switch(channel)
{
case 0: P2=P2&0X1F; break;
case 4: P2=(P2&0X1F)|0X80; break;
case 5: P2=(P2&0X1F)|0XA0; break;
case 6: P2=(P2&0X1F)|0XC0; break;
case 7: P2=(P2&0X1F)|0XE0; break;
}
}
void SystemInit(void)
{
Select_74hc138(4);
P0 = 0XFF;
Select_74hc138(5);
P0 = 0X00;
Select_74hc138(7);
P0 = 0XFF;
Select_74hc138(0);
Timer0Init();
UartInit();
do{
rd_temperature();
}while(T == 850);
}
void Delay(uint ms)
{
uint i;
for(ms; ms > 0; ms--)
for(i = 921; i > 0; i--);
}
void OperateLed(uchar who,status)
{
static uchar temp;
uchar zt;
switch(status)
{
case 0:
temp = temp|_crol_(0x01,who-1);
P0 = ~temp;
break;
case 1:
zt = (~temp)|_crol_(0x01,who-1);
if(temp != (~zt))
temp = ~zt;
P0 = zt;
break;
}
Select_74hc138(4);
Select_74hc138(0);
}
void Operatews(uchar num,status)
{
static uchar t;
if(status)
{
t = num;
P0 = t;
}
else
{
t = t & (~num);
P0 = t;
}
Select_74hc138(5);
Select_74hc138(0);
}
void Timer0Init(void) //50MS
{
AUXR &= 0X7F;
TMOD &= 0XF0;
TL0 = 0XB0;
TH0 = 0X3C;
TF0 = 0;
TR0 = 1;
ET0 = 1;
EA = 1;
}
smg.c
#include "sys.h"
uchar interface = 0;
code unsigned char Seg_Table[] =
{
0xc0, //0
0xf9, //1
0xa4, //2
0xb0, //3
0x99, //4
0x92, //5
0x82, //6
0xf8, //7
0x80, //8
0x90, //9
0xc1 //U
};
void DisplayBit(uchar pos,value,bit dot)
{
P0 = 0X00;
Select_74hc138(6);
Select_74hc138(0);
if(dot)
P0 = Seg_Table[value]&0x7f;
else
P0 = Seg_Table[value];
Select_74hc138(7);
Select_74hc138(0);
P0 = _crol_(0x01,pos-1);
Select_74hc138(6);
Select_74hc138(0);
Delay(1);
}
void DisplaySMG(void)
{
switch(interface)
{
case 0:
DisplayBit(1,10,0);
DisplayBit(2,1,0);
DisplayBit(6,T/100,0);
DisplayBit(7,T/10%10,1);
DisplayBit(8,T%10,0);
break;
case 1:
DisplayBit(1,10,0);
DisplayBit(2,2,0);
DisplayBit(6,V/100,1);
DisplayBit(7,V/10%10,0);
DisplayBit(8,V%10,0);
break;
}
}
key.c
#include "sys.h"
bit lock = 0;
void key(void)
{
uchar i = 0;
l1 = l3 = h4 = 1;
h3 = 0;
if(l1 == 0) //s5
{
Delay(10);
lock = 0;
while(l1 == 0)
{
DisplaySMG();
Function();
}
}
l1 = l3 = h3 = 1;
h4 = 0;
if(l1 == 0) //s4
{
Delay(10);
lock = 1;
while(l1 == 0)
{
DisplaySMG();
Function();
}
}
if(l3 == 0) //s12
{
Delay(10);
do{
if(TR1 == 0)
break;
if(interface == 0)
{
sprintf((char *)tem,"\n\rU1 %.1f\n\r",T/10.0);
SendString(tem);
}
else
{
sprintf((char *)tem,"\n\rU2 %.2f\n\r",V/100.0);
SendString(tem);
}
}while(i--);
while(l3 == 0)
{
DisplaySMG();
Function();
}
}
}
uart.c
#include "sys.h"
uchar urdat;
uchar tem[64];
void UartInit(void) //9600bps@12.000MHz
{
PCON &= 0X7F;
SCON = 0x50; //8位数据,可变波特率
AUXR &= 0xBF; //定时器1时钟为Fosc/12,即12T
AUXR &= 0xFE; //串口1选择定时器1为波特率发生器
TMOD &= 0x0F; //设定定时器1为16位自动重装方式
TMOD |= 0X20;
TL1 = 0xFD; //设定定时初值
TH1 = 0xFD; //设定定时初值
ET1 = 0; //禁止定时器1中断
TR1 = 1; //启动定时器1
ES = 1;
EA = 1;
}
void SendByte(uchar dat)
{
SBUF = dat;
while(TI == 0);
TI = 0;
}
void SendString(uchar *buf)
{
while(*buf != '\0')
{
SendByte(*buf++);
}
}
void ControlInterface(void)
{
switch(urdat)
{
case 'A':
interface = 0;
sprintf((char *)tem,"\n\rTEMP:%.1f℃\n\r",T/10.0);
SendString(tem);
urdat = 'C';
break;
case 'B':
interface = 1;
sprintf((char *)tem,"\n\rVoltage:%.2fV\n\r",V/100.0);
SendString(tem);
urdat = 'C';
break;
case 'C': break;
}
if(interface == 0)
{
OperateLed(1,0);
OperateLed(2,1);
}
else
{
OperateLed(1,1);
OperateLed(2,0);
}
}
void Uart(void) interrupt 4
{
if(RI)
{
RI = 0;
urdat = SBUF;
}
}
sys.h
#ifndef _SYS_H
#define _SYS_H
#include <STC15F2K60S2.H>
#include "intrins.h"
#include "stdio.h"
sbit sda = P2^1;
sbit scl = P2^0;
sbit DQ = P1^4;
sbit l1 = P4^4;
sbit l2 = P4^2;
sbit l3 = P3^5;
sbit l4 = P3^4;
sbit h3 = P3^2;
sbit h4 = P3^3;
sbit BUZZ = P0^6;
sbit RELAY = P0^4;
#define uchar unsigned char
#define uint unsigned int
extern uchar rb2;
extern uint V,T;
extern uchar interface;
extern bit lock;
extern uchar tem[64];
void Function(void);
void Select_74hc138(uchar channel);
void SystemInit(void);
void Delay(uint ms);
void OperateLed(uchar who,status);
void Operatews(uchar num,status);
void Timer0Init(void);
void DisplayBit(uchar pos,value,bit dot);
void DisplaySMG(void);
void KeyScans(void);
void KeyDown(void);
void key(void);
//iic.c
void ReadAIN3(void);
//onewire.c
void rd_temperature(void);
//uart.c
void UartInit(void);
void SendByte(uchar dat);
void SendString(uchar *buf);
void ControlInterface(void);
#endif
要发布的时候才发现,初始化灯全灭,这里就懒得改了。