逐行解释以下代码:#include<reg51.h> #include<intrins.h> #define ADCDATA P1 #define uchar unsigned char; unsigned char getdata; unsigned char min = 0; unsigned char sec = 0; unsigned char count = 0; sbit START = P2^0; sbit ALE = P2^0; sbit EOC = P2^1; sbit OE = P2^2; sbit CHOO =P2^3; uchar code dtable[10] = {0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xef,0xef}; uchar code table[10] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; uchar code num[4] = {0x0E, 0x0D, 0x0B, 0x07}; uchar disbuf[4] = {0,0,0,0}; uchar i; void delay(unsigned int k) { unsigned int j; for(j=0;j<k;j++); } void Init() { START=0; OE = 0; _nop_(); ALE = 0; _nop_(); _nop_(); ALE = 1; _nop_(); _nop_(); ALE = 0; _nop_(); _nop_(); TMOD=0x01; TH0=(65535-50000)/256; TL0=(65535-50000)%256; EA=1; ET0=1; IT0=1; TR0=1; } void display1(void) { getdata = ((getdata*1.0)/255)*500; disbuf[0] = getdata/100; disbuf[1] = getdata%100/10; disbuf[2] = getdata%10; disbuf[3] = 0x00; for(i = 0;i<4;i++) { if(i==0) { P0 = dtable[disbuf[i]]; P3 = num[i]; } else { P0 = table[disbuf[i]]; P3 = num[i]; } delay(200); P3 = 0x0f ; } } void display2(void) { unsigned char k; for(k=0;k<4;k++) { switch(k) { case 0: {P0=table[min/10];P3=num[k];break;} case 1: {P0=table[min%10];P3=num[k];break;} case 2: {P0=table[sec/10];P3=num[k];break;} case 3: {P0=table[sec%10];P3=num[k];break;} } delay(200); P3=0xff; } }
时间: 2024-01-14 18:05:19 浏览: 96
这段代码是基于 8051 单片机的程序,主要涉及到数码管显示和 ADC 转换。下面是逐行解释:
```c
#include<reg51.h>
#include<intrins.h>
```
引入 8051 单片机的头文件。
```c
#define ADCDATA P1
```
定义 ADC 的数据口为 P1。
```c
#define uchar unsigned char;
```
定义一个无符号字符类型的宏。
```c
unsigned char getdata;
unsigned char min = 0;
unsigned char sec = 0;
unsigned char count = 0;
```
定义三个无符号字符类型的变量和一个计数器。
```c
sbit START = P2^0;
sbit ALE = P2^0;
sbit EOC = P2^1;
sbit OE = P2^2;
sbit CHOO =P2^3;
```
定义五个单片机 I/O 口的位变量。
```c
uchar code dtable[10] = {0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xef,0xef};
uchar code table[10] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
```
定义两个数组,用于将数字转换为数码管的显示码。
```c
uchar code num[4] = {0x0E, 0x0D, 0x0B, 0x07};
```
定义一个数组,用于选择数码管的编号。
```c
uchar disbuf[4] = {0,0,0,0};
```
定义一个数组,用于存储要显示的数字。
```c
uchar i;
```
定义一个无符号字符类型的变量。
```c
void delay(unsigned int k) {
unsigned int j;
for(j=0;j<k;j++);
}
```
定义一个延时函数。
```c
void Init() {
START=0;
OE = 0; _nop_();
ALE = 0; _nop_(); _nop_();
ALE = 1; _nop_(); _nop_();
ALE = 0; _nop_(); _nop_();
TMOD=0x01;
TH0=(65535-50000)/256;
TL0=(65535-50000)%256;
EA=1;
ET0=1;
IT0=1;
TR0=1;
}
```
定义一个初始化函数,初始化 ADC 转换和定时器。
```c
void display1(void) {
getdata = ((getdata*1.0)/255)*500;
disbuf[0] = getdata/100;
disbuf[1] = getdata%100/10;
disbuf[2] = getdata%10;
disbuf[3] = 0x00;
for(i = 0;i<4;i++) {
if(i==0) {
P0 = dtable[disbuf[i]];
P3 = num[i];
}
else {
P0 = table[disbuf[i]];
P3 = num[i];
}
delay(200);
P3 = 0x0f ;
}
}
```
定义一个显示函数,将 ADC 转换得到的数据转换为数码管的显示码并显示出来。
```c
void display2(void) {
unsigned char k;
for(k=0;k<4;k++) {
switch(k) {
case 0: {P0=table[min/10];P3=num[k];break;}
case 1: {P0=table[min%10];P3=num[k];break;}
case 2: {P0=table[sec/10];P3=num[k];break;}
case 3: {P0=table[sec%10];P3=num[k];break;}
}
delay(200);
P3=0xff;
}
}
```
定义另一个显示函数,将秒钟和分钟转换为数码管的显示码并显示出来。
阅读全文