
基于AT89C51单片机实验板
简介
这个作品是由AT89C51单片机芯片延伸出来的主要用于学生学习单片机教学的一块实验板。
简介:这个作品是由AT89C51单片机芯片延伸出来的主要用于学生学习单片机教学的一块实验板。开源协议
:CC BY-NC 3.0
描述
这个作品是由C51单片机芯片为主要核心,延伸出数码管动态显示模块,LED灯显示模块,按键模块,串行显示模块,AD测温模块的用于学生单片机教学的实验板。
动态数码管显示程序
`
#include
#define XSS 10
#define XS P2
sbit M1=P3^4;
sbit M2=P3^5;
sbit M3=P3^6;
sbit M4=P3^7;
bit dtbz=0;
unsigned char SMXS[XSS]={
0xC0, // 0
0xF9, // 1
0xA4, // 2
0xB0, // 3
0x99, // 4
0x92, // 5
0x82, // 6
0xF8, // 7
0x80, // 8
0x90, // 9
};
void dscsh(void) //T1定时,晶振6Mhz
{
TMOD=0X90;//1、设置方式
TH1=0Xfc; //2、计算初值
TL1=0X18;
ET1=1; //3、设置中断
EA=1;
TR1=1; //4、开启运行位,计数开始
}
void t1zd(void) interrupt 3
{
TH1=0Xfc; //初值重载
TL1=0X18;
dtbz=1;
}
void dtxs(void)
{
static unsigned char wx=0;
M1=1;
M2=1;
M3=1;
M4=1;
wx=wx+1;
if(wx>=5)
{
wx=1;
}
if(wx==1)
{
XS=SMXS[0];//'0'
M1=0;
M4=1;
}
if(wx==2)
{
XS=SMXS[3];//'3'
M2=0;
M1=1;
}
if(wx==3)
{
XS=SMXS[0];//'0'
M3=0;
M2=1;
}
if(wx==4)
{
XS=SMXS[4];//'4'
M4=0;
M3=1;
}
}
main()
{
dscsh();
while(1)
{
if(dtbz)
{
dtbz=0;
dtxs();
}
}
}`
定时器键控流水灯程序
`#include
#define uint unsigned int
#define uchar unsigned char
#define SMGHY P2 //数码管花样宏定义
#define SMGSD P1 //数码管速度宏定义
#define LSD P0 //流水灯宏定义
char sd = 1; //定义速度变量
uchar js = 0;
uchar hy = 0;
uchar sum;
void xs(void); //数码显示程序声明
void ys(void); //延时程序声明
void lsdxs(void); //流水灯主程序声明
void lsd1(void); //流水灯花样程序1声明
void lsd2(void); //流水灯花样程序2声明
void lsd3(void); //流水灯花样程序3声明
void lsd4(void); //流水灯花样程序4声明
void lsd5(void); //流水灯花样程序5声明
void lsd6(void); //流水灯花样程序6声明
void wzdcsh(void);
uchar code LED[8] = {0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
uchar code dispcode[ ] = {
0xC0,/0/
0xF9,/1/
0xA4,/2/
0xB0,/3/
0x99,/4/
0x92,/5/
0x82,/6/
0xF8,/7/
0x80,/8/
0x90,/9/
};
void wzdcsh(void)
{
TMOD = 0X10;//0 0 0 1 0 0 0 0
TH1 = 0XD8;//定时器预先设置一个初值(65535-50000)/256(256就是16进制的100)
TL1 = 0XF0;//整除/是高八位;%低八位
ET1 = 1;//定时器0中断
TR1 = 1;//T0开始计时
IT0 = 1;
IE0 = 1;
EX0 = 1;
IT1 = 1;
IE1 = 1;
EX1 = 1;
EA = 1;
}
void xs(void) //数码显示程序
{
if(hy != 0) //如果fs不等于0
{ //那么
SMGSD=dispcode[sd]; //数码管速度显示
SMGHY=dispcode[hy]; //数码管花样显示
}
if(hy == 0) //如果fs等于0并且方式初始化为1
{ //那么
SMGHY=0xc0; //数码管花样显示0
SMGSD=0xc0;
}
}
void ys(void) //延时速度程序
{
unsigned int k;
for(k = 0;k>=1;
}
}
void lsd3(void) //流水灯程序4
{
uint i;
uchar temp;
temp = 0xfe;
for(i = 0;i<8;i++) //8个流水灯依次全部点亮
{
LSD = temp;
ys();
temp<<=1;
}
}
void lsd4(void) //流水灯程序4
{
uint i;
uchar temp;
temp = 0xef;
for(i = 0;i<8;i++) //8个流水灯依次全部点亮
{
LSD = temp;
ys();
temp>>=1;
}
}
void lsd5(void)
{
uchar n = 0;
while(n<4)
{
sum += ~LED[n]+~LED[7-n];
LSD = ~sum;
n++;
ys();
}
}
void lsd6(void)
{
uchar n = 4;
P0 = 0xff;
while(n<8)
{
sum -= ~LED[n]+~LED[7-n];
LSD = ~sum;
n++;
ys();
}
}
void lsdxs(void) //流水灯显示程序
{
if(hy == 1) //如果方式为1
{ //那么
lsd1(); //调用流水灯程序1
}
else if(hy == 2) //如果方式为2
{ //那么
lsd2(); //调用流水灯程序2
}
else if(hy == 3) //如果方式为3
{ //那么
lsd3(); //调用流水灯程序3
}
else if(hy == 4) //如果方式为4
{ //那么
lsd4(); //调用流水灯程序4
}
else if(hy == 5) //如果方式为5
{ //那么
lsd5(); //调用流水灯程序5
}
else if(hy == 6) //如果方式为6
{ //那么
lsd6(); //调用流水灯程序6
}
else
{
LSD = 0xff; //流水灯全灭
}
}
void main(void)
{
wzdcsh();
SMGSD = 0x88; //速度数码管显示A
SMGHY = 0x86; //花样数码管显示E
while(1)
{
lsdxs();
}
}
void x0zd(void) interrupt 0
{
if(INT0 == 0)
{
hy++;
if(hy>6)
{
hy = 0;
}
xs();
}
}
void x1zd(void) interrupt 2
{
if(hy != 0)
{
if(INT1 == 0)
{
sd++;
if(sd>9)
{
sd = 1;
}
xs();
}
}
}`
设计图

BOM


评论