抱歉,您的浏览器无法访问本站
本页面需要浏览器支持(启用)JavaScript
了解详情 >

虚拟串口

代码

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
/* 
time:2023-05-10
COM
*/
# include "reg51.h"
unsigned char recdat = 0, flag = 0;

void initscon()
{
SCON = 0X50; // 0101 0000
TMOD = 0X20; // 0010 0000
TH1 = 256 - 3;
TL1 = 256 - 3;
ES = 1;
EA = 1;
TR1 = 1;
}

void scon_isr() interrupt 4 // COM interrupt
{
recdat = SBUF;
RI = 0;
flag = 1;
}

void senddat()
{
SBUF = recdat;
while(!TI);
TI = 0;
}

void main()
{
initscon();
while(1)
{
if (flag == 1)
{
senddat();
flag = 0;
}
}
}

LCD1602

常用指令码

  1. 0X38:设置16 * 2 显示,5*7点阵, 8位数据接口
  2. 0X0C:设置开显示,不显示光标
  3. 0X06:写一个字符后地址指针加1
  4. 0X01: 显示清0,数据指针清0
  5. 0X80:LCD第一行的起始地址
  6. 0X80+0X40:LCD第二行的起始地址

LCD1602功能

  1. RS​,片选

    • RS=0​,输入命令,不显示字符
    • RS=1​,写入数据,显示字符
  2. RW​,读写操作

    • RW=0​,写操作
    • RW=1​,读操作
  3. E​,使能端,高电平有效

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
/* 
time:2023-05-10
LCD display
*/
# include "reg51.h"
sbit RS = P3^0;
sbit RW = P3^1;
sbit E = P3^2;
unsigned char str[] = {"xuaner"};

void delay(unsigned char n)
{
unsigned int i = 0, j = 0;

for (i=0; i<n; i++)
{
for (j=0; j<120; j++);
}
}

// write sign
void writecom(unsigned char com)
{
RS = 0;
RW = 0;
E = 0; //P3^2 is low --->E is high
P2 = com;
delay(5); // delay
E = 1;
E = 0;
}

// write Data
void writedate(unsigned char date)
{
RS = 1;
RW = 0;
E = 0;
P2 = date;
delay(5);
E = 1;
E = 0;
}

// initial
void initlcd()
{
writecom(0x38);
writecom(0x0c);
writecom(0x06);
writecom(0x01);
}

void display()
{
unsigned int i = 0;

writecom(0x80); // second line:0x80 + 0x40
delay(5);
/* one Char display
writedate('x');
delay(5);
writedate('u');
delay(5);
writedate(a');
delay(5);
writedate('n');
delay(5);
writedate(e');
delay(5);
writedate('r');
delay(5);
*/
// string display
while (str[i] != '\0')
{
writedate (str[i]);
delay(5);
i++;
}
}

void main()
{
initlcd();
while(1)
{
display();
}
}

LCD时钟

代码

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
/*
time:2023-05-10
simple clk
*/

# include "reg51.h"
sbit RS = P3^0;
sbit RW = P3^1;
sbit E = P3^2;
unsigned char count = 0;
unsigned int hour = 9, min = 54, sec = 0;
unsigned char str[] = {"0123456789"};
unsigned char str1[] = {"xuaner CLK"};

void delay(unsigned char n)
{
unsigned int i = 0, j = 0;

for (i=0; i<n; i++)
{
for (j=0; j<120; j++);
}
}


void writecom(unsigned char com)
{
RS = 0;
RW = 0;
E = 0;
P2 = com;
delay(5);
E = 1;
E = 0;
}


void writedate(unsigned char date)
{
RS = 1;
RW = 0;
E = 0;
P2 = date;
delay(5);
E = 1;
E = 0;
}


void initlcd()
{
writecom(0x38);
writecom(0x0c);
writecom(0x06);
writecom(0x01);
}

void display()
{
unsigned char temp0 = 0, temp1 = 0, temp2 = 0, temp3 = 0, temp4 = 0, temp5 = 0;
unsigned char i = 0;
temp0 = hour / 10;
temp1 = hour % 10;
temp2 = min / 10;
temp3 = min % 10;
temp4 = sec / 10;
temp5 = sec % 10;
writecom(0X80);
delay(5);
while(str1[i] != '\0')
{
writedate(str1[i]);
delay(5);
i++;
}
writecom(0X80 + 0X40 + 4);
delay(5);
writedate(str[temp0]);
delay(5);
writedate(str[temp1]);
delay(5);
writedate(':');
delay(5);
writedate(str[temp2]);
delay(5);
writedate(str[temp3]);
delay(5);
writedate(':');
delay(5);
writedate(str[temp4]);
delay(5);
writedate(str[temp5]);
delay(5);
}

void inittimer()
{
TMOD = 0x01;
TH0 = (65536-50000)/256; // 50ms
TL0 = (65536-50000)%256;
ET0 = 1;
EA = 1;
TR0 = 1;
}

void timer0_isr() interrupt 1
{
TH0 = (65536-50000)/256; // 50ms
TL0 = (65536-50000)%256;
count++;
if (count == 20) // 1s
{
sec = sec + 1;
count = 0;
}
if (sec == 60)
{
min = min + 1;
sec = 0;
}
if (min == 60)
{
hour = hour + 1;
min = 0;
}
if (hour == 24)
{
hour = 0;
}
}

void main()
{
initlcd();
inittimer();
while(1)
{
display();
}
}

点阵显示

代码

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
/*
time:2023-05-10
matrix
*/

# include "reg51.h"
unsigned char code tab[] = { 0x00, 0x7e, 0xff, 0xc3, 0xc3, 0xff, 0x7e, 0x00, // 0
0x00, 0x00, 0x43, 0xff, 0xff, 0x03, 0x00, 0x00, // 1
0x00, 0x63, 0xc7, 0xcf, 0xdb, 0xf3, 0x63, 0x00, // 2
0x00, 0x42, 0xdb, 0xdb, 0xdb, 0xff, 0x66, 0x00, // 3
0x00, 0x3e, 0x46, 0xff, 0xff, 0x06, 0x06, 0x00, // 4
};
unsigned char row[] = {0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80};
unsigned char num = 0, flag = 0;
sbit key0 = P1^0;

void key()
{
if (flag == 0 && key0 == 0)
{
flag = 1;
}
if (flag == 1 && key0 == 1)
{
num++;
flag = 0;
}
if (num == 5)
{
num = 0;
}
}

void matrix()
{
unsigned int i = 0;

for (i=8*num; i<8*(num+1); i++)
{
P3 = ~row[i-8*num];
P2 = tab[i];
}
}

void main()
{
while(1)
{
matrix();
key();
}
}


DA转换

代码

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
/*
time:2023-05-10
DA
*/

# include "reg51.h"
unsigned int value = 100, flag = 0;
sbit key0 = P1^0;
sbit key1 = P1^1;

void key()
{
if (key0 == 0 && flag == 0)
{
flag = 1;
}
if (flag == 1 && key0 == 1)
{
value += 10;
flag = 0;
}

if (key1 == 0 && flag == 0)
{
flag = 1;
}
if (flag == 1 && key1 == 1)
{
value -= 10;
flag = 0;
}
}
void delay(unsigned int n)
{
int i=0, j=0;
for (i=0; i<n; i++)
{
for (j=0; j<120; j++);
}
}
/* pwm
void PWM()
{
P2 = 0;
delay(100); // duty cycle :change delay
P2 = 255;
delay(value);

}
*/
void stair()
{
int i = 0;
for (i=0; i<255; i++)
{
P2 = i;
}
for (i=255; i<0; i--)
{
P2 = i;
}
}

void main()
{
while(1)
{
// PWM();
stair(); // sawtooth wave
key();
}
}