这一届很简单,没什么难的
题目和代码都已附上,所有功能都已实现
代码:
main函数
#include "stc15f2k60s2.h"
#include "intrins.h"
#include "iic.h"
#include "ds1302.h"
#include "onewire.h"
unsigned char code tab[]=
{
0xc0, //0
0xf9, //1
0xa4, //2
0xb0, //3
0x99, //4
0x92, //5
0x82, //6
0xf8, //7
0x80, //8
0x90, //9
0xff, //灭(10)
0xbf, //- (11)
0x88, //A (12)
0x83, //b (13)
0xc6, //C (14)
0xa1, //d (15)
0x86, //E (16)
0x8e, //F (17)
0x8c //P (18)
};
unsigned char code keycode[4][4]={{7,11,15,19},{6,10,14,18},{5,9,13,17},{4,8,12,16}};
unsigned char dscom=0;
unsigned char keysta[4][4]={{1,1,1,1},{1,1,1,1},{1,1,1,1},{1,1,1,1}};
unsigned char keyback[4][4]={{1,1,1,1},{1,1,1,1},{1,1,1,1},{1,1,1,1}};
unsigned char keybuff[4][4]={{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff}};
unsigned char dsbuff[8];
unsigned char number=0;
unsigned char ym_mode=1;
unsigned char shuju_mode=1;
unsigned char canshu_mode=1;
unsigned char wendu_count=0;
bit wendu_bit=0;
unsigned char clk_count=0;
bit clk_bit=0;
unsigned char ad_count=0;
bit ad_bit=0;
unsigned int tempture;
unsigned int ad_value;
unsigned int ad_v;
bit liangdu;
unsigned char shijian_canshu=17;
unsigned char wendu_canshu=25;
unsigned char led_canshu=4;
sbit h0=P3^0;
sbit h1=P3^1;
sbit h2=P3^2;
sbit h3=P3^3;
sbit l0=P4^4;
sbit l1=P4^2;
sbit l2=P3^5;
sbit l3=P3^4;
void yemian();
void keysong(unsigned char dat);
void keyaction(unsigned char dat);
void select573(unsigned char channel)
{
P2&=0x1f;
P0=0xff;
switch(channel)
{
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 system_init()
{
select573(4);P0=0xff;
select573(5);P0=0x00;
select573(6);P0=0xff;
select573(7);P0=0xff;
}
void timer0init()
{
TMOD=0x00;
TH0=(65536-1000)/256;
TL0=(65536-1000)%256;
TF0=0;
ET0=1;
EA=1;
TR0=1;
}
void display()
{
select573(7);P0=0xff;
select573(6);
P0=1<<dscom;
select573(7);
if((dscom==6 && ym_mode==1 && shuju_mode==2) ||(ym_mode==1 && shuju_mode==3 && dscom==2))
{
P0=tab[dsbuff[dscom]]&0x7f;
}
else
P0=tab[dsbuff[dscom]];
P2&=0x1f;
P0=0xff;
if(++dscom==8)
dscom=0;
}
//=========按键函数=====================================================================================================
void key_scan()
{
unsigned char i;
static unsigned char keyout=0;
keybuff[keyout][0]=keybuff[keyout][0]<<1|l0;
keybuff[keyout][1]=keybuff[keyout][1]<<1|l1;
keybuff[keyout][2]=keybuff[keyout][2]<<1|l2;
keybuff[keyout][3]=keybuff[keyout][3]<<1|l3;
for(i=0;i<4;i++)
{
if((keybuff[keyout][i]&0x0f)==0x00)
{
keysta[keyout][i]=0;
}
else if((keybuff[keyout][i]&0x0f)==0x0f)
{
keysta[keyout][i]=1;
}
}
keyout++;
if(keyout>=4)
keyout=0;
switch(keyout)
{
case 0:h0=0;h3=1;break;
case 1:h1=0;h0=1;break;
case 2:h2=0;h1=1;break;
case 3:h3=0;h2=1;break;
}
}
void key_handle()
{
unsigned char i,j;
for(i=0;i<4;i++)
{
for(j=0;j<4;j++)
{
if(keyback[i][j]!=keysta[i][j])
{
if(keysta[i][j]==0)
{
keyaction(keycode[i][j]);
}
else if(keysta[i][j]==1)
{
keysong(keycode[i][j]);
}
keyback[i][j]=keysta[i][j];
}
}
}
}
void keyaction(unsigned char dat)
{
//==========界面按键==============
if(dat==4)
{
if(ym_mode==1)
{
ym_mode=2;//参数界面
canshu_mode=1;
}
else if(ym_mode==2)
{
ym_mode=1;//数据界面
shuju_mode=1;
}
}
//==========切换按键==============
if(dat==5)
{
if(ym_mode==1)//数据界面
{
if(shuju_mode==1)
{
shuju_mode=2; //温度数据显示
}
else if(shuju_mode==2)
{
shuju_mode=3; //亮暗状态显示
}
else if(shuju_mode==3)
{
shuju_mode=1; //时间数据显示
}
}
else if(ym_mode==2) //参数界面
{
if(canshu_mode==1)
{
canshu_mode=2;//温度参数P2
}
else if(canshu_mode==2)
{
canshu_mode=3;//指示灯参数P3
}
else if(canshu_mode==3)
{
canshu_mode=1;//时间参数P1
}
}
}
if(dat==8)
{
if(ym_mode==2)
{
if(canshu_mode==1)
{
shijian_canshu--;
}
else if(canshu_mode==2)
{
wendu_canshu--;
}
else if(canshu_mode==3)
{
led_canshu--;
if(led_canshu<1)
led_canshu=8;
}
}
}
if(dat==9)
{
if(ym_mode==2)
{
if(canshu_mode==1)
{
shijian_canshu++;
}
else if(canshu_mode==2)
{
wendu_canshu++;
}
else if(canshu_mode==3)
{
led_canshu++;
if(led_canshu>8)
{
led_canshu=1;
}
}
}
}
}
void keysong(unsigned char dat)
{
if(dat==9)
{
}
}
//========LED函数=====================================================================================================
unsigned char led_number=0xff;
void led_IRQ()
{
P0=0xff;
select573(4);
P0=led_number;
P2&=0x1f;
}
void led_function()
{
// L1
if((((clk[2]/16)*10+clk[2]%16) % shijian_canshu==0) && ((clk[2]/16)*10+clk[2]%16) % 8!=0&&ad_value>70)
{
led_number &= 0xfe;
}
else
{
led_number |= 0x01;
}
// L2
if(tempture<wendu_canshu*10)
{
led_number &= 0xfd;
}
else
{
led_number |= 0x02;
}
// L3 有延时,放中断里了
//L4
if(ad_value<40)
{
if(led_canshu==4)
{
led_number &= 0xf7;
}
else
{
led_number |= 0x08;
}
if(led_canshu==5)
{
led_number &= 0xef;
}
else
{
led_number |= 0x10;
}
if(led_canshu==6)
{
led_number &= 0xdf;
}
else
{
led_number |= 0x20;
}
if(led_canshu==7)
{
led_number &= 0xbf;
}
else
{
led_number |= 0x40;
}
if(led_canshu==8)
{
led_number &= 0x7f;
}
else
{
led_number |= 0x80;
}
}
else
{
led_number |= 0x08;
led_number |= 0x10;
led_number |= 0x20;
led_number |= 0x40;
led_number |= 0x80;
}
}
//=========中断函数=====================================================================================================
unsigned int l3_count=0;
unsigned int l3_l_count=0;
void timer0()interrupt 1
{
led_IRQ();
display();
yemian();
key_scan();
//=========温度
wendu_count++;
if(wendu_count>=250)
{
wendu_count=0;
wendu_bit=1;
}
//=========时间
clk_count++;
if(clk_count>=250)
{
clk_count=0;
clk_bit=1;
}
//=========ad采集
ad_count++;
if(ad_count>=250)
{
ad_count=0;
ad_bit=1;
}
//=========led3===
if(ad_value<50)
{
l3_count++;
if(l3_count>=3000)
{
l3_l_count=0;
led_number &= 0xfb;
}
}
else
{
l3_l_count++;
if(l3_l_count>=3000)
{
l3_count=0;
led_number |= 0x04;
}
}
}
//=========main函数=====================================================================================================
void main()
{
system_init();
timer0init();
ds1302_init();
while(1)
{
key_handle();
led_function();
//=========温度
if(wendu_bit==1)
{
wendu_bit=0;
tempture=(unsigned int)read_tempture();
}
//=========时间
if(clk_bit==1)
{
clk_bit=0;
read_ds1302();
}
//=========ad采集
if(ad_bit==1)
{
ad_bit=0;
ad_value=pcf_ad(0x01);
if(ad_value>=80)
{
liangdu=0;
}
else
{
liangdu=1;
}
ad_v=ad_value*100/51.0;
}
}
}
//=========页面函数=====================================================================================================
void yemian()
{
if(ym_mode==1)
{
if(shuju_mode==1)
{
dsbuff[0]=clk[2]/16;
dsbuff[1]=clk[2]%16;
dsbuff[2]=11;
dsbuff[3]=clk[1]/16;
dsbuff[4]=clk[1]%16;
dsbuff[5]=11;
dsbuff[6]=clk[0]/16;
dsbuff[7]=clk[0]%16;
}
else if(shuju_mode==2)
{
dsbuff[0]=14;
dsbuff[1]=ad_value/100;
dsbuff[2]=ad_value/10%10;
dsbuff[3]=ad_value%10;
dsbuff[4]=10;
dsbuff[5]=tempture/100;
dsbuff[6]=tempture/10%10;
dsbuff[7]=tempture%10;
}
else if(shuju_mode==3)
{
dsbuff[0]=16;
dsbuff[1]=10;
dsbuff[2]=ad_v/100;
dsbuff[3]=ad_v/10%10;
dsbuff[4]=ad_v%10;
dsbuff[5]=10;
dsbuff[6]=10;
dsbuff[7]=liangdu;
}
}
else if(ym_mode==2)
{
if(canshu_mode==1)
{
dsbuff[0]=18;
dsbuff[1]=1;
dsbuff[2]=10;
dsbuff[3]=10;
dsbuff[4]=10;
dsbuff[5]=10;
dsbuff[6]=shijian_canshu/10;
dsbuff[7]=shijian_canshu%10;
}
else if(canshu_mode==2)
{
dsbuff[0]=18;
dsbuff[1]=2;
dsbuff[2]=10;
dsbuff[3]=10;
dsbuff[4]=10;
dsbuff[5]=10;
dsbuff[6]=wendu_canshu/10;
dsbuff[7]=wendu_canshu%10;
}
else if(canshu_mode==3)
{
dsbuff[0]=18;
dsbuff[1]=3;
dsbuff[2]=10;
dsbuff[3]=10;
dsbuff[4]=10;
dsbuff[5]=10;
dsbuff[6]=10;
dsbuff[7]=led_canshu%10;
}
}
}
IIC函数
#include "iic.h"
#include "intrins.h"
#define DELAY_TIME 5
sbit scl=P2^0;
sbit sda=P2^1;
//
static void I2C_Delay(unsigned char n)
{
do
{
_nop_();_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();_nop_();
}
while(n--);
}
//
void I2CStart(void)
{
sda = 1;
scl = 1;
I2C_Delay(DELAY_TIME);
sda = 0;
I2C_Delay(DELAY_TIME);
scl = 0;
}
//
void I2CStop(void)
{
sda = 0;
scl = 1;
I2C_Delay(DELAY_TIME);
sda = 1;
I2C_Delay(DELAY_TIME);
}
//
void I2CSendByte(unsigned char byt)
{
unsigned char i;
for(i=0; i<8; i++){
scl = 0;
I2C_Delay(DELAY_TIME);
if(byt & 0x80){
sda = 1;
}
else{
sda = 0;
}
I2C_Delay(DELAY_TIME);
scl = 1;
byt <<= 1;
I2C_Delay(DELAY_TIME);
}
scl = 0;
}
//
unsigned char I2CReceiveByte(void)
{
unsigned char da;
unsigned char i;
for(i=0;i<8;i++){
scl = 1;
I2C_Delay(DELAY_TIME);
da <<= 1;
if(sda)
da |= 0x01;
scl = 0;
I2C_Delay(DELAY_TIME);
}
return da;
}
//
unsigned char I2CWaitAck(void)
{
unsigned char ackbit;
scl = 1;
I2C_Delay(DELAY_TIME);
ackbit = sda;
scl = 0;
I2C_Delay(DELAY_TIME);
return ackbit;
}
//
void I2CSendAck(unsigned char ackbit)
{
scl = 0;
sda = ackbit;
I2C_Delay(DELAY_TIME);
scl = 1;
I2C_Delay(DELAY_TIME);
scl = 0;
sda = 1;
I2C_Delay(DELAY_TIME);
}
unsigned char pcf_ad(unsigned char channel)
{
unsigned char adt;
EA=0;
I2CStart();
I2CSendByte(0x90);
I2CWaitAck();
I2CSendByte(channel);
I2CWaitAck();
I2CStart();
I2CSendByte(0x91);
I2CWaitAck();
adt=I2CReceiveByte();
I2CSendAck(1);
I2CStop();
EA=1;
return adt;
}
ds1302函数
#include "ds1302.h"
#include "intrins.h"
sbit SCK=P1^7;
sbit SDA=P2^3;
sbit RST=P1^3;
unsigned char clk[3];
//
void Write_Ds1302(unsigned char temp)
{
unsigned char i;
for (i=0;i<8;i++)
{
SCK = 0;
SDA = temp&0x01;
temp>>=1;
SCK=1;
}
}
//
void Write_Ds1302_Byte( unsigned char address,unsigned char dat )
{
RST=0; _nop_();
SCK=0; _nop_();
RST=1; _nop_();
Write_Ds1302(address);
Write_Ds1302(dat);
RST=0;
}
//
unsigned char Read_Ds1302_Byte ( unsigned char address )
{
unsigned char i,temp=0x00;
RST=0; _nop_();
SCK=0; _nop_();
RST=1; _nop_();
Write_Ds1302(address);
for (i=0;i<8;i++)
{
SCK=0;
temp>>=1;
if(SDA)
temp|=0x80;
SCK=1;
}
RST=0; _nop_();
SCK=0; _nop_();
SCK=1; _nop_();
SDA=0; _nop_();
SDA=1; _nop_();
return (temp);
}
void ds1302_init()
{
Write_Ds1302_Byte(0x8e,0x00);
Write_Ds1302_Byte(0x80,0x50);
Write_Ds1302_Byte(0x82,0x59);
Write_Ds1302_Byte(0x84,0x16);
Write_Ds1302_Byte(0x8e,0x80);
}
void read_ds1302()
{
clk[0]=Read_Ds1302_Byte(0x81);
clk[1]=Read_Ds1302_Byte(0x83);
clk[2]=Read_Ds1302_Byte(0x85);
}
onewire函数
#include "intrins.h"
#include "onewire.h"
sbit DQ=P1^4;
//
void Delay_OneWire(unsigned int t)
{
unsigned char i;
while(t--){
for(i=0;i<12;i++);
}
}
//
void Write_DS18B20(unsigned char dat)
{
unsigned char i;
for(i=0;i<8;i++)
{
DQ = 0;
DQ = dat&0x01;
Delay_OneWire(5);
DQ = 1;
dat >>= 1;
}
Delay_OneWire(5);
}
//
unsigned char Read_DS18B20(void)
{
unsigned char i;
unsigned char dat;
for(i=0;i<8;i++)
{
DQ = 0;
dat >>= 1;
DQ = 1;
if(DQ)
{
dat |= 0x80;
}
Delay_OneWire(5);
}
return dat;
}
//
bit init_ds18b20(void)
{
bit initflag = 0;
DQ = 1;
Delay_OneWire(12);
DQ = 0;
Delay_OneWire(80);
DQ = 1;
Delay_OneWire(10);
initflag = DQ;
Delay_OneWire(5);
return initflag;
}
float read_tempture()
{
unsigned int temp;
unsigned char low,high;
EA=0;
init_ds18b20();
Write_DS18B20(0xcc);
Write_DS18B20(0x44);
init_ds18b20();
Write_DS18B20(0xcc);
Write_DS18B20(0xbe);
low=Read_DS18B20();
high=Read_DS18B20();
EA=1;
temp=high;
temp=temp<<8;
temp=temp|low;
return temp*=0.625;
}