数据类型说明符
typedef unsigned int WORD;
#define BYTE unsigned char
BYTE a1 = 0x12;
WORD a2 = 0x1234;
宏定义
#define CBYTE((unsigned char volatitle*) 0x50000L)
#define DBYTE((unsigned char volatitle*) 0x40000L)
#define BYTE unsigned char
指针
#define uchar unsigned char
#define uint unsigned int
void func(void)
{
uchar data var1;
uchar pdata *dp1;
uint xdata *dp2;
uchar data *dp3;
dp1 = 0x30;
dp2 = 0x1000;
*dp1 = 0xff;
*dp1 = 0x1234;
dp3 = &var1;
*dp3 = 0x20;
}
扩展关键字“at”
#define uchar unsigned char
#define uint unsigned int
data uchar x1_at_0x40;
xdata uint x2_at_0x2000;
void main(void)
{
x1 = 0xff;
x2 = 0x1234;
while(1);
}
中断函数
interrupt m
m = 0;
m = 1;
m = 2;
m = 3;
m = 4;
使用寄存器组
using m
n = 0;
n = 1;
n = 2;
n = 3;
计数器,中断方式
#include <absacc.h>
sbit P1_0=P1^0;
void main()
{
TMOD = 0x02;
TH0 = 0x06;
TL0 = 0x06;
EA = 1;
ET0 = 1;
TR0 = 1;
while(1);
}
void time0_int(void) interrupt 1
{
P1_0 = !P1_0;
}
计数器,查询方式
#include <absacc.h>
sbit P1_0=P1^0;
void main()
{
TMOD = 0x02;
TH0 = 0x06;
TL0 = 0x06;
TR0 = 1;
for(;;)
{
if(TF0)
{
TF0 = 0;
P1_0 = !P1_0;
}
}
}
寄存器R2计数,中断处理
#include <absacc.h>
sbit P1_1=P1^1;
char i;
void main()
{
TMOD = 0x01;
TH0 = 0xD8;
TL0 = 0xF0;
EA = 1;
ET0 = 1;
i = 0 ;
TR0 = 1;
while(1);
}
void time0_int(void) interrupt 1
{
TH0 = 0xD8;
TL0 = 0xF0;
i ++;
if(i == 50)
{
P1_1 = !P1_1;
}
}
T1计数器,T0/T1都是中断方式工作
#include <absacc.h>
sbit P1_1=P1^1;
sbit P3_5=P3^5;
void main()
{
TMOD = 0x61;
TH0 = 0xD8;
TL0 = 0xF0;
TH1 = 0xE7;
TL1 = 0xE7;
EA = 1;
ET0 = 1;
ET1 = 1;
TR0 = 1;
TR1 = 1;
while(1);
}
void time0_int(void) interrupt 1
{
TH0 = 0xD8;
TL0 = 0xF0;
P3_5 = !P3_5;
}
void time1_int(void) interrupt 3
{
P1_0 = !P1_0;
}
双机通讯,T1工作方式2且定时
#include <absacc.h>
void main()
{
unsigned char i;
SP = 0x60;
SCON = 0x50;
TMOD = 0x20;
TH1 = 0xE6;
TL1 = 0xE6;
EA = 1;
ES = 1;
TR1 = 1;
while(1)
{
P1 = 0xFF;
i = P1;
SBUF = i;
while(TI == 0);
TI = 0;
}
}
void funins(void) interrupt 4
{
EA = 0;
RI = 0;
P2 = SBUF;
EA = 1;
}
利用外部中断统计外部事件的次数
#include <absacc.h>
#define uchar unsigned char
uchar a = 0x00;
void main()
{
IE = 0x81;
IT0 = 1;
P2 = 0;
while(1);
}
void int0(void) interrupt 0
{
a += 1;
P2 = a;
}
数码管动态显示:60进制轮播
#include <reg51.h>
#include <absacc.h>
#define uchar unsigned char
#define com8255 XBYTE[0xff23]
#define pa8255 XBYTE[0xff20]
#define pb8255 XBYTE[0xff21]
uchar code table[20] = {0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92,
0x82, 0xF8, 0x80, 0x90, 0x88, 0x83,
0xC6, 0xA1, 0x86, 0x8E, 0xFF, 0x0C,
0x89, 0xDE};
uchar code wei[] = {0x20, 0x10, 0x08, 0x04, 0x02, 0x01};
void delay(unsigned int i)
{
unsigned int j, k;
for (k = 0; k < i; k++)
{
for (j = 0; j < 100; j++);
}
}
void main(void)
{
uchar m = 0;
com8255 = 0x80;
pa8255 = 0x00;
pb8255 = 0x00;
delay(2);
while (1)
{
unsigned int j = 0;
while (j < 150)
{
pb8255 = table[m % 10];
pa8255 = ~wei[5];
delay(2);
pb8255 = table[m / 10];
pa8255 = ~wei[4];
delay(2);
j++;
}
m++;
if (m == 60)
{
m = 0;
}
}
}
数码管动态显示:定时器T1,20ms检查一次
#include <reg51.h>
#include <absacc.h>
#define uchar unsigned char
#define uint unsigned int
uchar disbuffer[8] = {0, 1, 2, 3, 4, 5, 6, 7};
void delay(uint i)
{
for (uint j = 0; j < i; j++);
}
void display(void)
{
uchar codevalue[16] = {0x3F, 0x06, 0x5B, 0x4F,
0x66, 0x6D, 0x7D, 0x07,
0x7F, 0x6F, 0x77, 0x7C,
0x39, 0x5E, 0x79, 0x71};
uchar chocode[8] = {0xFE, 0xFD, 0xFB, 0xF7, 0xEF, 0xDF, 0xBF, 0x7F};
uchar i, p, temp;
for (i = 0; i < 8; i++)
{
temp = chocode[i];
P2 = temp;
p = disbuffer[i];
temp = codevalue[p];
P0 = temp;
delay(20);
}
}
void main(void)
{
TH1 = (65536 - 20000) / 256;
TL1 = (65536 - 20000) % 256;
EA = 1;
ET1 = 1;
TR1 = 1;
while (1);
}
void time1(void) interrupt 3
{
TH1 = (65536 - 20000) / 256;
TL1 = (65536 - 20000) % 256;
display();
}
独立式键盘
#include <reg51.h>
#define uchar unsigned char
sbit K0 = P1 ^ 0;
sbit K1 = P1 ^ 1;
sbit K2 = P1 ^ 2;
sbit K3 = P1 ^ 3;
sbit D0 = P2 ^ 0;
sbit D1 = P2 ^ 1;
sbit D2 = P2 ^ 2;
sbit D3 = P2 ^ 3;
void delay(uchar k)
{
uchar i, j;
for (i = 0; i < k; i++)
{
for (j = 0; j < 250; j++);
}
}
void main()
{
if (K0 == 0){delay(10);if (K0 == 0)D0 = 0;}
if (K1 == 0){delay(10);if (K1 == 0)D1 = 0;}
if (K2 == 0){delay(10);if (K2 == 0)D2 = 0;}
if (K3 == 0){delay(10);if (K3 == 0)D3 = 0;}
}
矩阵式键盘
#include <reg51.h>
#include <absacc.h>
#define uchar unsigned char
#define uint unsigned int
void delay(uint);
void display(uint);
uchar checkkey();
uchar keyscan(void);
uchar disbuffer[8] = {0, 1, 2, 3, 4, 5, 6, 7};
void main(void)
{
uchar key;
while (1)
{
key = keyscan();
if (key != 0xFF)
{
disbuffer[0] = disbuffer[1];
disbuffer[1] = disbuffer[2];
disbuffer[2] = disbuffer[3];
disbuffer[3] = disbuffer[4];
disbuffer[4] = disbuffer[5];
disbuffer[5] = disbuffer[6];
disbuffer[6] = disbuffer[7];
disbuffer[7] = key;
}
display();
}
}
void delay(uint i)
{
uint j;
for (j = 0; j < i; j++)
;
}
void display(void)
{
uchar codevalue[16] = {0x3F, 0x06, 0x5B, 0x4F,
0x66, 0x6D, 0x7D, 0x07,
0x7F, 0x6F, 0x77, 0x7C,
0x39, 0x5E, 0x79, 0x71};
uchar chocode[8] = {0xFE, 0xFD, 0xFB, 0xF7, 0xEF, 0xDF, 0xBF, 0x7F};
uchar i, p, temp;
for (i = 0; i < 8; i++)
{
temp = chocode[i];
P2 = temp;
p = disbuffer[i];
temp = codevalue[p];
P0 = temp;
delay(20);
}
}
uchar checkkey()
{
uchar i;
P3 = 0xF0;
i = P3;
i = i | 0xF0;
if (i == 0xFF)
{
return 0xFF;
}
else
{
return 0;
}
}
uchar keyscan()
{
uchar scancode;
uchar codevalue;
uchar m;
uchar k;
uchar i, j;
if (checkkey() == 0xFF)
return 0xFF;
else
{
delay(20);
if (checkkey() == 0xFF)
{
return 0xFF;
}
else
{
scancode = 0xEF;
for (i = 0; i < 4; i++)
{
k = 0x01;
P3 = scancode;
m = 0x00;
for (j = 0; j < 4 j++)
{
if ((P3 & K) == 0)
{
codevalue = m + i;
while (checkkey() != 0xFF);
}
else
{
k = k << 1 m = m + 4;
}
}
scancode = scancode << 1;
scancode++;
}
}
return codevalue;
}
}
D/A转换
#include <absacc.h>
#define uchar unsigned char
#define DAC0832 XBYTE[0xFF80]
void delay(void)
{
uchar i;
for (i = 0; i < 0xFF; i++);
}
void main()
{
uchar i;
uchar n = 1000;
while (1)
{
while (n > 0)
{
for (i = 0; i < 0xFF; i++) DAC0832 = i;
n--;
}
n = 1000;
while (n > 0)
{
for (i = 0; i < 0xFF; i++) DAC0832 = i;
for (i = 0xFF; i > 0; i--) DAC0832 = i;
n--;
}
n = 1000;
while (n > 0)
{
DAC0832 = 0;
delay();
DAC0832 = 0xFF;
delay();
n--;
}
n = 1000;
}
}
A/D转换
#include <absacc.h>
#include <stdio.h>
#define uchar unsigned char
#define uint unsigned int
#define AD XBYTE[0xFF80]
#define com8255 XBYTE[0xff23]
#define pa8255 XBYTE[0xff20]
#define pb8255 XBYTE[0xff21]
uchar code table[20] = {0xC0, 0xF9, 0xA4, 0xB0,
0x99, 0x92, 0x82, 0xF8,
0x80, 0x90, 0x88, 0x83,
0xC6, 0xA1, 0x86, 0x8E,
0xFF, 0x0C, 0x89, 0xDE};
uchar code wei[6] = {0x20, 0x10, 0x08, 0x04, 0x02, 0x01};
uint i, temp, digit;
void delay(int x)
{
while (x--);
}
void show(uint num)
{
temp = num;
digit = 0;
if (temp == 0)
{
pb8255 = table[temp % 10];
pa8255 = ~wei[5 - digit];
}
else
{
while (temp)
{
pb8255 = table[temp % 10];
pa8255 = ~wei[5 - digit];
temp /= 10;
digit++;
delay(1000);
}
}
}
void main()
{
com8255 = 0xFF80;
pa8255 = 0xFF00;
pb8255 = 0xFF00;
while (1)
{
AD = 0XFF80;
show(AD);
delay(100);
}
}
数码管动态显示
void delay(uint x);
void display(void);
uchar disbuffer[8] = {0, 1, 2, 3, 4, 5, 6, 7};
void main(void)
{
while (1) display();
}
void delay(uint i)
{
uint j;
for (j = 0; j < i; j++);
}
void display(void)
{
uchar codevalue[16] = {0x3F, 0x06, 0x5B, 0x4F,
0x66, 0x6D, 0x7D, 0x07,
0x7F, 0x6F, 0x77, 0x7C,
0x39, 0x5E, 0x79, 0x71};
uchar chocode[8] = {0xFE, 0xFD, 0xFB, 0xF7,
0xEF, 0xDF, 0xBF, 0x7F};
uchar i, p, temp;
for (i = 0; i < 8; i++)
{
temp = chocode[i];
P2 = temp;
p = disbuffer[i];
temp = codevalue[p];
P0 = temp;
delay(20);
}
}