蓝桥杯工程模板

工程模板主要是对一些基础设备做好初始化,比如四个锁存器的函数封装、定时器的初始化、数码管显示的初始化以及IIC,onewire和ADC的封装。

废话不多说,直接上代码。

mian.c

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include "common.h"

char temp_count = 0;

void main()
{
init();
init_timer();
while(1)
{
display_temp();
}
}

void timer2() interrupt 12
{
temp_count++;
display();
}

common.h

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#ifndef _COMMON_H_
#define _COMMON_H_

#include "reg52.h"
#include "display.h"
#include "onewire.h"

sfr AUXR = 0x8e;
sfr IE2 = 0xaf;
sfr T2H = 0xd6;
sfr T2L = 0xd7;

extern char temp_count,ADCount;

void select_channel(char channel);
void init();
void init_timer();
void delay(char n);

#endif

common.c

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#include "common.h"


void select_channel(char channel)
{
switch(channel)
{
case 4: P2 = P2&0x1f|0x80; P2 &= 0x1f; break;
case 5: P2 = P2&0x1f|0xa0; P2 &= 0x1f; break;
case 6: P2 = P2&0x1f|0xc0; P2 &= 0x1f; break;
case 7: P2 = P2&0x1f|0xe0; P2 &= 0x1f; break;
}
}

void init()
{
int i;
for(i = 0;i < 8;i++)
smgbuf[i] = 10;

P0 = 0xff;
select_channel(4);

P0 = 0x00;
select_channel(5);
}

void init_timer()
{
AUXR = AUXR&0x33|0x10;
IE2 = 0x04;
T2H = 0xf8;
T2L = 0x2f;
EA = 1;
}
void delay(char n)
{
int i;
while(n--)
for(i = 0;i < 120;i++);
}

display.h

1
2
3
4
5
6
7
8
9
10
#ifndef _DISPLAY_H_
#define _DISPLAY_H_

#include "common.h"

extern char smgbuf[8];

void display();

#endif

display.c

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
#include "display.h"

unsigned char smgw[] = {0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
unsigned char smgd[] = {0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x00,0x40};
char smgbuf[8],num = 0,point_flag = 0;

void display()
{
num++;
if(num >= 8)
num = 0;

P0 = 0xff;
select_channel(7);

P0 = smgw[num];
select_channel(6);


if(point_flag&&num == 1)
P0 = ~(smgd[smgbuf[num]] | 0x80);
else
P0 = ~smgd[smgbuf[num]];
select_channel(7);
}


void display_temp()
{
int temp;
point_flag = 1;

if(temp_count >= 50)
{
temp = read_temp();
}

smgbuf[0] = temp / 1000;
smgbuf[1] = temp % 1000 / 100;
smgbuf[2] = temp % 100 / 10;
smgbuf[3] = temp % 10;
}

void display_AData()
{
unsigned char dat;

point_flag = 0;

if(ADCount >= 50)
{
ADCount = 0;
dat = ADConvert(0x03);
}
smgbuf[0] = dat / 100;
smgbuf[1] = dat % 100 / 10;
smgbuf[2] = dat % 10;
}

void display_ds1302()
{
point_flag = 0;
smgbuf[0] = Read_Ds1302(0x85) / 16;
smgbuf[1] = Read_Ds1302(0x85) % 16;
smgbuf[2] = 11;
smgbuf[3] = Read_Ds1302(0x83) / 16;
smgbuf[4] = Read_Ds1302(0x83) % 16;
smgbuf[5] = 11;
smgbuf[6] = Read_Ds1302(0x81) / 16;
smgbuf[7] = Read_Ds1302(0x81) % 16;
}

onewire.h

1
2
3
4
5
6
7
8
9
#ifndef __ONEWIRE_H
#define __ONEWIRE_H

#include "common.h"

int read_temp();

#endif

onewire.c

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
#include "onewire.h"

sbit DQ = P1^4;

void Delay_OneWire(unsigned int t)
{
int i;
while(t--)
for(i = 0;i < 8;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;
}

int read_temp()
{
unsigned char TH,TL;
int temp;

init_ds18b20();
Write_DS18B20(0xcc);
Write_DS18B20(0x44);
Delay_OneWire(200);

init_ds18b20();
Write_DS18B20(0xcc);
Write_DS18B20(0xbe);

TL = Read_DS18B20();
TH = Read_DS18B20();

temp = ((TH<<8) + TL) * 0.0625 * 100;

return temp;
}

iic.h

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#ifndef _IIC_H
#define _IIC_H

#include "common.h"

void IIC_Start(void);
void IIC_Stop(void);
void IIC_Ack(bit ackbit);
void IIC_SendByte(unsigned char byt);
bit IIC_WaitAck(void);
unsigned char IIC_RecByte(void);
unsigned char ADConvert(char addr);
void e2prom_write(unsigned char dat,addr);
unsigned char e2prom_read(char addr);

#endif

iic.c

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
#include "iic.h"

#define somenop {_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();}


#define SlaveAddrW 0xA0
#define SlaveAddrR 0xA1

sbit SDA = P2^1; /* Êý¾ÝÏß */
sbit SCL = P2^0; /* ʱÖÓÏß */


void IIC_Start(void)
{
SDA = 1;
SCL = 1;
somenop;
SDA = 0;
somenop;
SCL = 0;
}

void IIC_Stop(void)
{
SDA = 0;
SCL = 1;
somenop;
SDA = 1;
}

void IIC_Ack(bit ackbit)
{
if(ackbit)
{
SDA = 0;
}
else
{
SDA = 1;
}
somenop;
SCL = 1;
somenop;
SCL = 0;
SDA = 1;
somenop;
}

bit IIC_WaitAck(void)
{
SDA = 1;
somenop;
SCL = 1;
somenop;
if(SDA)
{
SCL = 0;
IIC_Stop();
return 0;
}
else
{
SCL = 0;
return 1;
}
}

void IIC_SendByte(unsigned char byt)
{
unsigned char i;
for(i=0;i<8;i++)
{
if(byt&0x80)
{
SDA = 1;
}
else
{
SDA = 0;
}
somenop;
SCL = 1;
byt <<= 1;
somenop;
SCL = 0;
}
}

unsigned char IIC_RecByte(void)
{
unsigned char da;
unsigned char i;

for(i=0;i<8;i++)
{
SCL = 1;
somenop;
da <<= 1;
if(SDA)
da |= 0x01;
SCL = 0;
somenop;
}
return da;
}

unsigned char ADConvert(char addr)
{
unsigned char dat;
IIC_Start();
IIC_SendByte(0x90);
IIC_WaitAck();
IIC_SendByte(addr);
IIC_WaitAck();
IIC_Stop();

IIC_Start();
IIC_SendByte(0x91);
IIC_WaitAck();
dat = IIC_RecByte();
IIC_Ack(0);
IIC_Stop();

return dat;
}

void e2prom_write(unsigned char addr,dat)
{
IIC_Start();
IIC_SendByte(0xa0);
IIC_WaitAck();
IIC_SendByte(addr);
IIC_WaitAck();
IIC_SendByte(dat);
IIC_WaitAck();
IIC_Stop();
}

unsigned char e2prom_read(char addr)
{
unsigned char dat;

IIC_Start();
IIC_SendByte(0xa0);
IIC_WaitAck();
IIC_SendByte(addr);
IIC_WaitAck();
IIC_Stop();

IIC_Start();
IIC_SendByte(0xa1);
IIC_WaitAck();
dat = IIC_RecByte();
IIC_Ack(0);
IIC_Stop();

return dat;
}

ds1302.h

1
2
3
4
5
6
7
8
9
10
11
12
#ifndef __DS1302_H
#define __DS1302_H

#include "common.h"

void Write_Ds1302_Byte(unsigned char temp);
void Write_Ds1302( unsigned char address,unsigned char dat );
unsigned char Read_Ds1302 ( unsigned char address );
void init_ds1302(char h,m,s);

#endif

ds1302.c

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
#include "ds1302.h"

sbit SCK=P1^7;
sbit SDA=P2^3;
sbit RST = P1^3;

void Write_Ds1302_Byte(unsigned char temp)
{
unsigned char i;
for (i=0;i<8;i++)
{
SCK=0;
SDA=temp&0x01;
temp>>=1;
SCK=1;
}
}

void Write_Ds1302( unsigned char address,unsigned char dat )
{
RST=0;
_nop_();
SCK=0;
_nop_();
RST=1;
_nop_();
Write_Ds1302_Byte(address);
Write_Ds1302_Byte(dat);
RST=0;
}

unsigned char Read_Ds1302 ( unsigned char address )
{
unsigned char i,temp=0x00;
RST=0;
_nop_();
SCK=0;
_nop_();
RST=1;
_nop_();
Write_Ds1302_Byte(address);
for (i=0;i<8;i++)
{
SCK=0;
temp>>=1;
if(SDA)
temp|=0x80;
SCK=1;
}
RST=0;
_nop_();
RST=0;
SCK=0;
_nop_();
SCK=1;
_nop_();
SDA=0;
_nop_();
SDA=1;
_nop_();
return (temp);
}

void init_ds1302(char h,m,s)
{
Write_Ds1302(0x8e,0x00);
Write_Ds1302(0x84,h);
Write_Ds1302(0x82,m);
Write_Ds1302(0x80,s);
Write_Ds1302(0x8e,0x80);
}