当前位置:文档之家› 基于51单片机的小游戏

基于51单片机的小游戏

基于51单片机的小游戏
基于51单片机的小游戏

P 10

P 17P 16P 15P 14P 13P 12P 11K0K1K2K3K4K5K6K7GND

GND

GND

GND

K0

K1

K3

K2

GND

K4

P10P11P12P13P14P15P16P17

P27

P20

P21

P22

P23

P24

P25

P26

P20P21P22P23P24P25P26P27

VCC GND

GND

GND

K6

K5

K7

G7G6

G5

G4

G3

G2G1

G0

VCC

G0G1G2G3G4G5G6G7

GND

XTAL2

18

XTAL1

19

ALE 30EA

31

PSEN 29RST

9

P0.0/AD039P0.1/AD138P0.2/AD237P0.3/AD336P0.4/AD435P0.5/AD534P0.6/AD633P0.7/AD732P1.0/T21P1.1/T2EX 2P1.23P1.34P1.45P1.56P1.67P1.7

8

P3.0/RXD 10P3.1/TXD 11P3.2/INT012P3.3/INT113P3.4/T014P3.7/RD

17

P3.6/WR 16P3.5/T115P2.7/A1528P2.0/A821P2.1/A922P2.2/A1023P2.3/A1124P2.4/A1225P2.5/A1326P2.6/A1427P1.7P1.0

共阳低电平扫描

23456789

1

RP1

RESPACK 8×10k

12345678

161514131211109

RN1

220

R7

1.5k

R6

1.5k

R5

1.5k

R4

1.5k

R3

1.5k

R2

1.5k

R1

1.5k

R0

1.5k

限流电阻

X1

12MHz

C2

33pF

C3

33pF

R8

10k

C1

10uF

R13220

R12220

R11

220

D1

D2

D3

P2.0P2.7P1.6P1.5P1.4

P1.3P1.2P1.1P2.6

P2.5P2.4P2.3P2.2P2.1列

行SW1

SW-SPST

总开关

Q8

2N3906

R14

1.5k

R9

10k

R10

10k

Q7

2N3906

Q6

2N3906

Q5

2N3906

Q4

2N3906

Q3

2N3906

Q2

2N3906

Q1

2N3906

Q0

2N3906

12345678

161514131211109

RN2

10k

LS1

SPEAKER

#include

#include

#include"ours.h"

#define uchar unsigned char

#define SNAKE 20 //最长蛇身

#define SPEED 50 //运动速度控制,值越大,则扫描整个蛇

// 身的时间越长,即表现为移动速度慢#define MQ 5 //进入下一关的加速,pace=pace-MQ

sbit P3_0=P3^0; sbit P3_2=P3^2; sbit P3_3=P3^3;

//蜂鸣器位外部中断0 外部中断1

sbit P3_7=P3^7; sbit P3_6=P3^6; sbit P3_1=P3^1;//指示灯位sbit P0_7=P0^7;sbit P0_6=P0^6;sbit P0_5=P0^5;sbit P0_4=P0^4; //暂停增关卡,加速减关卡,退出加速

//do ruai mi fa

sbit P0_2=P0^2;sbit P0_1=P0^1;sbit P0_3=P0^3;sbit P0_0=P0^0; // 左下右上// sao la xi 退出

sbit P2_7=P2^7;sbit P2_6=P2^6;sbit P2_5=P2^5;sbit P2_4=P2^4; sbit P2_3=P2^3;sbit P2_2=P2^2;sbit P2_1=P2^1;sbit P2_0=P2^0;

uchar x[SNAKE+1]; //蛇身的坐标行

uchar y[SNAKE+1]; //蛇身的坐标列

uchar n,i,pace,xz; //当前蛇长,通用变量,当前速度,选择游戏标志

char bdata guanqia; //定义关卡,可谓寻址,便于控制指示灯

sbit guanqia_0=guanqia^0;sbit guanqia_1=guanqia^1;sbit guanqia_2=guanqia^2; char addx,addy; //移动方向,同直角坐标系,addx为横向,addy为纵向

bit again,out; //再次产生果实变量,停止播放音乐变量

bit pause=0; //暂停变量,1为暂停

uchar tone_H,tone_L;//定时器初值,用来控制音调

uchar ym; //选择音乐

uchar wait; //用于判断是否已经开始游戏

void display(uchar ); //声明显示函数

void display_p(uchar); //暂停时调用该函数显示

bit knock(); //声明撞击函数

void key_press(); //声明按键函数

void play1(unsigned int);

void play(uchar *,uchar *);

/************************************************************** 判断是否碰撞,是则返回1,否则返回0

**************************************************************/ bit knock()

{ bit k=0;

if(x[1]>7||y[1]>7)k=1; //撞墙

for(i=2;i

if((x[1]==x[i])&(y[1]==y[i]))k=1; //撞自己

return k;

}

/************************************************************** 键位处理

**************************************************************/ void key_press()

{ switch(~P0)

{ case 1:addx=0;addy=addy==-1?-1:1;break;//上

case 2:addx=0;addy=addy==1?1:-1; break;//下

case 4:addy=0;addx=addx==1?1:-1; break;//左

case 8:addy=0;addx=addx==-1?-1:1;break;//右

case 5:if(addx!=1||addy!=-1){addx=-1;addy=1;}break;//左上

case 9:if(addx!=-1||addy!=-1){addx=1;addy=1;}break;//右上

case 6:if(addx!=1||addy!=1){addx=-1;addy=-1;}break;//左下

case 10:if(addx!=-1||addy!=1){addx=1;addy=-1;}break;//右下

case 128:delay10ms(2);pause=~pause; //暂停

while(~P0_7)if(P0_5)display_p(1);break;

//按住暂停键不放且没有退出游戏请求

}

}

/*********************************************************

显示函数,按点从头到尾扫描,周期为SNAKE,扫描k个周期运动一格

**********************************************************/

void display(uchar k) //显示k次

{ while(k--)

{ for(i=0;i

P2=~mux(y[i]);P1=~mux(x[i]);//按点依次显示

delay1ms(1); //显示延时1ms

if(~P0) key_press(); //键位处理

if(~P0_5)k=0; //判断是否退出游戏

}

}

}

/*********暂停时调用该函数显示,以防闪烁*******************/

void display_p(uchar k) //显示k次

{ while(k--)

{ for(i=0;i

P2=~mux(y[i]);P1=~mux(x[i]);//按点依次显示

delay1ms(1); //显示延时1ms

}

}

}

/*****外部中断1,用于切换游戏,xz=0为贪吃蛇,xz=1为电子琴******/ void my_int1(void) interrupt 2

{ delay10ms(2); //去抖动

if(wait) //游戏开始前,用于选择游戏

if(~P3_3)

if(++xz==2)xz=0; //共有两个游戏,所以xz只能为0或1 if(~wait) //游戏已开始(只在电子琴里有效)

out=1; //停止播放音乐

while(~P3_3); //直到松开按键,才跳出中断,以防xz连续变化

}

/************************************************************** ******* 主程序*************************************** ***************************************************************/ void main(void)

{ EA=1; //开总中断

EX0=1; //开外部中断0

EX1=1; //开外部中断1

/*********************************************************************** ***************** 贪吃蛇**************************************** ************************************************************************/ TCS:while(1)

{ /**************初始化游戏**********************/

for(i=3;i

for(i=3;i

n=3; //初始蛇身长为n-1

y[1]=1;x[1]=0; //初始蛇头位置

y[2]=0;x[2]=0; //初始蛇尾位置

addx=0;addy=0; //初始位移偏移

pace=SPEED; //给运动速度赋初值

/*************产生果实*******************************/

do

{ x[0]=rand()%8; y[0]=rand()%8;//产生随机果实

again=0;

for(i=1;i

if((x[0]==x[i])&&(y[0]==y[i]))again=1;

}while(again); //若重叠则再次产生

/************等待开始游戏,贪吃蛇开始前可选关****************/

guanqia=1; //第一关

P3_7=~guanqia_2;P3_6=~guanqia_1;P3_1=~guanqia_0;//显示关卡

while(1) //等待选择游戏

{ wait=1; //等待选择游戏

if(xz) goto DZQ; //如果xz=1,则进入电子琴

display_p(1); //显示贪吃蛇初始位置

if(~P0_3|~P0_0)break;//如果按上或右键,则开始游

/*************选关******************************************/

if(~P0_6) //增关卡

{ delay10ms(2); //去抖动

if(~P0_6)

{ if(++guanqia<=7)//最大到7关

{ P3_7=~guanqia_2;P3_6=~guanqia_1;P3_1=~guanqia_0;

//将其值用发光二极管以二进制的形式显示出来

pace=pace-MQ; //加速

}else --guanqia;

while(~P0_6)display_p(1);

//直到松开按键才跳出,以防连续增加关卡

}

}

if(~P0_5) //减关卡

{ delay10ms(2);

if(~P0_5)

{ if(--guanqia>=1)

{ P3_7=~guanqia_2;P3_6=~guanqia_1;P3_1=~guanqia_0;

pace=pace+MQ;

}else ++guanqia;

while(~P0_5)display_p(1);

}

}

}

/*************贪吃蛇游戏正在运行**************************/

while(1)

{ wait=0; //游戏已开始,wait置0

if(knock()){pace=SPEED;break;} //判断是否碰撞

/*************显示部分************************/

if(P0_6&P0_4)display(pace); //判断是否速度运动

else display(10);//当P0^4或P0^6被按下时加速运动

if(~P0_5)break; //判断是否退出

/*************判断是否吃东西,及进入下一关**************/

if((y[0]==y[1]+addx)&&(x[0]==x[1]+addy)) //如果吃到

{ n++; //蛇身加1

if(n==SNAKE+1) //如果进入下一关

{ n=3; //蛇身长从2开始

pace=pace-MQ; guanqia++; //运动加速,关卡加1

P3_7=~guanqia_2;P3_6=~guanqia_1;P3_1=~guanqia_0;

//将关卡的值用三个指示灯显示出来

for(i=3;i

for(i=3;i

}

do

{ x[0]=rand()%8;y[0]=rand()%8;//产生随机果实

again=0;

for(i=1;i

if((x[0]==x[i])&(y[0]==y[i]))again=1;

}while(again); //若重叠则再次产生

}

/*************判断蛇身是否移动**********************/

if(~pause) //如果不暂停

{ for(i=n-1;i>1;i--)

{ x[i]=x[i-1];y[i]=y[i-1];} //蛇身从尾到头移动

y[1]=y[1]+addx;x[1]=x[1]+addy;//蛇头移动1格

}

}

}

/******************************************************************* *************** 电子琴************************************

********************************************************************/ DZQ:while(1)

{ P3_0=1;

ET0=1; //启用定时器0中断

TMOD=0x01; //定时器0工作在方式1

ym=0;out=0; //选择音乐及退出播放位无效

/***********等待开始游戏********************************/

while(1)

{ wait=1; //等待选择游戏

P2=0x00;P1=0xc7; //点亮点阵

P3_7=1;P3_6=1;P3_1=1; //关闭指示灯

if(~P0_7|~P0_6|~P0_5|~P0_4|~P0_3|~P0_2|~P0_1)break;

//7个键随便按一个则开始电子琴

if(xz==0)goto TCS;//如果xz=0,则进入贪吃蛇游戏

}

/***************电子琴正在运行*********************/

while(1)

{ wait=0; //游戏已开始,wait置0

P3_7=0;P3_6=0;P3_1=0;//开指示灯

if(P0_0==0)break; //如果按下P0^0则退出电子琴

if(ym) //如果有音乐请求

switch(ym) //选择音乐,最多7首

{ case 128:play(song1,beat1);ym=0;out=0;break;

case 64: play(song2,beat2);ym=0;out=0;break;

case 32:play(song3,beat3);ym=0;out=0;break;

case 16: play(song4,beat4);ym=0;out=0;break;

case 4:play(song5,beat5);ym=0;out=0;break;

case 2: play(song6,beat6);ym=0;out=0;break;

case 8: play(song7,beat7);ym=0;out=0;break;

}P3_0=1;

switch(~P0)

{ case 128:P2_0=1;play1(956);P2_0=0;break;

case 64: P2_1=1;play1(852);P2_1=0;break;

case 32: P2_2=1;play1(759);P2_2=0;break;

case 16: P2_3=1;play1(716);P2_3=0;break;

case 4: P2_4=1;play1(638);P2_4=0;break;

case 2: P2_5=1;play1(568);P2_5=0;break;

case 8: P2_6=1;play1(506);P2_6=0;break;

}P3_0=1;

}

}

}

/****自己弹奏时调用该函数***********/

void play1(x)

{ tone_H=(65536-x)/256;

tone_L=(65536-x)%256;

TH0=tone_H;

TL0=tone_L;

TR0=1;

while(~P0);

TR0=0;

}

/****播放音乐时调用该函数*******************/ void play(uchar *song,uchar *beat)

{ i=0;

while(song[i]!=50&&out!=1)

{ tone_H=(65536-tone[song[i]])/256;

tone_L=(65536-tone[song[i]])%256;

TH0=tone_H;

TL0=tone_L;

if(song[i])TR0=1;

beat_125ms(beat[i]);

i++;

TR0=0;

}

}

/****定时器0中断用于产生声******/

void tone_timer(void) interrupt 1

{ TH0=tone_H;

TL0=tone_L;

P3_0=~P3_0;

}

/****外部中断0,用于控制播放那个曲子*****/ void my_int0(void) interrupt 0

{ if(~P0) //如果有选择

ym=~P0; //则将其值赋给ym

}

ours库函数

#define uchar unsigned char

/******判断具体的亮点****************/ unsigned char mux(unsigned char temp)

{ switch(temp)

{ case 7:return 128; break;

case 6:return 64; break;

case 5:return 32; break;

case 4:return 16; break;

case 3:return 8; break;

case 2:return 4; break;

case 1:return 2; break;

case 0:return 1; break;

default: return 0;

}

}

/*******************************************

************** 延时函数****************

********************************************/

void delay1ms(int x) //延时1ms

{ int i,j;

for(i=0;i

for(j=0;j<122;j++);

}

void delay10ms(int x) //延时10ms

{ int i,j;

for(i=0;i

for(j=0;j<1934;j++);

}

/**********节拍延时函数**************/

void beat_125ms(uchar x) //延时125ms

{ uchar i;

unsigned int j;

for(i=0;i

for(j=0;j<24934;j++);

}

/******************************************************************* ****************乐谱************************************************ *********************************************************************/ unsigned int code tone[]={1012,

956, 852, 759, 716, 638, 568, 506, 478, 478,478, //中音

1908,1701,1515,1433,1276,1136,1012, 956, 956,956, //低音

478, 426, 379, 358, 319, 284, 253, 233 }; //高音

//dao ruai mi fa sao la xi

//song为乐谱,当出现50时表示结束;beat为节奏(以0.125秒为单位),

/*************画心*************/

uchar code song1[]={

3,5, 6,6,21,7,6,5, 2,3,3,3,5, 6,6,7,21,5,21,22,

22,23,23,25,23, 23,22,21,22,21,7, 21,22,7,5,6,3,5, 6,6,23,22,21,7,

5,6,6,3,4,5, 6,6,21,7,6,5,6, 3,3,3,3,5, 6,6,7,21,5,21,22,

22,23,23,25,23, 23,22,21,22,21,7, 21,22,7,5,6,3,5, 6,6,23,22,21,7,

5,6,6,25,23, 23,22,21,22,22,25, 23,23,23,25,23, 23,22,21,22,25,26,

22,23,23,25,23, 23,22,21,22,21,7, 21,22,7,5,6,3,5, 6,6,23,22,21,7,

5,6,6,50};

uchar code beat1[]={

4,4, 8,4,4,4,4,8, 6,2,16,4,4, 8,4,4,4,4,4,4,

4,4,16,4,4, 8,4,4,8,4,4, 4,4,4,4,8,4,4, 8,4,4,4,4,8,

6,2,6,4,4,4, 8,4,4,4,4,4,4, 4,4,8,4,4, 8,4,4,4,4,4,4,

4,4,16,4,4, 8,4,4,8,4,4, 4,4,4,4,8,4,4, 8,4,4,4,4,8,

6,2,18,4,4, 8,4,4,8,4,4, 4,4,8,4,4, 8,4,4,4,4,8,

6,2,16,4,4, 8,4,4,8,4,4, 4,4,4,4,8,4,4, 8,4,4,4,4,8,

6,2,24,4};

/***********梁祝*********************/

uchar code song2[]={

7,6,7, 5,6,4,3, 2,3,4,3,5,3, 2,3,5,2,3,4,3,2,

1,5, 17,2,16,1, 15,16,1, 15,

13,15,16, 1,2,16,1,15, 5,21,6,5,3,5, 2,

2,3,17,16, 15,16,1,2, 13,1,16,15,16,1, 15,

3,5,17,2, 16,1,15, 13,15,13,15,16,17,2, 16,15,16,

1,2,5,3, 2,3,2,1,16,15, 13,1, 16,1,16,15,13,15,16,1, 15,3,5, 2,3,2,1,17,16, 15,50};

uchar code beat2[]={

4,4,4, 6,2,4,4, 2,2,2,2,6,2, 2,2,2,2,2,2,2,2,

12,4, 4,4,4,4, 12,2,2, 16,

8,6,2, 6,2,2,2,4, 6,2,2,2,2,2, 16,

6,2,4,4, 6,2,4,4, 4,4,2,2,2,2, 16,

6,2,4,4, 2,2,8, 2,4,2,2,2,2,2, 12,2,2,

6,2,4,4, 4,2,2,4,2,2, 8,8, 3,1,2,2,2,2,2,2,

12,2,2, 2,2,2,2,4,4, 16,2};

/***********兄弟无数*******************/

uchar code song3[]={

6,6,5,6,0, 3,7,21,7,6,0, 7,6,7,5,3,0, 2,2,1,2,3,0,

6,5,6,5,3,7,6, 5,6,4,3,2,1,2, 6,5,6,5,3,7,6, 5,6,4,3,2,1,2, 3,21,21,7,22, 7,6,6,3,5, 3,4,3,2,1,2,3,5, 2,

22,22,6, 21,7,0, 7,7,6,6,2,5,6, 6,3,

22,22,6, 21,7,0, 7,7,6,6,2,0,22, 7,6,6,

7,7,7,6,3,6,4,3, 2, 3,22,7,6,5,6,7,7, 22,0,

22,23,6,6,

50};

uchar code beat3[]={

8,8,4,4,8, 8,4,4,4,4,8, 8,4,4,4,4,8, 8,4,4,4,4,8,

6,2,4,4,4,8,4, 6,2,4,4,4,4,8, 6,2,4,4,4,8,4, 6,2,4,4,4,4,8, 4,8,4,8,8, 4,4,4,4,16, 6,2,4,4,4,4,4,4, 24,

24,4,4, 16,8,8, 8,4,4,4,4,4,4, 8,24,

24,4,4, 16,8,8, 8,4,4,4,4,4,4, 4,4,24,

6,2,4,4,4,4,4,4, 24, 6,2,4,4,4,4,4,4, 24,8,

2,2,4,24,

4};

/*************伤不起******************/

uchar code song4[]={

6,6,5,3,3, 6,6,5,3,3, 6,21,3,5,5, 3,2,3,3,

6,6,5,3,3, 6,6,5,3,3, 5,3,5,7,7, 7,5,6,6,

5,6,6,6,5,3, 5,6,6,6, 5,6,6,6,21,6,6, 5,6,5,3,3,

6,6,2,3,2,2,1, 16,2,3,2, 5,5,5,5,5,5,6, 7,6,7,

5,6,6,6,5,3, 5,6,6,6, 5,6,6,6,21,6, 5,6,5,3,3,

6,6,2,3,2,2,1, 16,2,3,2, 5,5,5,5,5,6, 7,7,6,7,

21,7,6,6,5,3, 5,6,7,6,6, 21,6,21,6,21,6,21,22, 3,3,3,2,3,

22,22,22,21,22,6,21, 22,23,22,21,22,7, 7,7,7,7,22,22,22,23, 7,3,5,6,6, 21,7,6,6,5,3, 5,6,7,6,6, 21,6,21,6,21,6,21,22, 3,3,3,2,3,

22,22,22,21,22,6,21, 22,23,22,21,22,7, 7,7,7,7,22,22,22,23, 7,3,5,6,6, 50};

uchar code beat4[]={

4,2,4,2,4, 4,2,4,2,4, 4,2,4,2,4, 4,2,2,8,

4,2,4,2,4, 4,2,4,2,4, 4,2,4,2,4, 4,2,2,8,

2,2,4,4,2,2, 2,2,4,6, 2,2,2,2,4,2,2, 2,2,2,2,6,

2,2,2,2,4,2,2, 4,2,2,6, 2,2,2,2,4,2,2, 4,4,6,

2,2,4,4,2,2, 2,2,4,6, 2,2,2,2,4,4, 2,2,2,2,6,

2,2,2,2,4,2,2, 4,2,2,6, 2,2,2,2,4,4, 2,2,4,6,

4,2,2,4,2,2, 4,2,2,4,2, 2,2,2,2,2,2,2,2, 2,2,2,2,6,

2,2,2,2,4,2,2, 2,2,2,2,6,2, 2,2,2,2,2,2,2,2, 2,2,2,2,6,

4,2,2,4,2,2, 4,2,2,6,2, 2,2,2,2,2,2,2,2, 2,2,2,2,6,

2,2,2,2,4,2,2, 2,2,2,2,6,2, 2,2,2,2,2,2,2,2, 2,2,2,2,6,

4};

/**************兰若词******************/

uchar code song5[]={

16,17,1, 3,17,1, 16,16,16,17,1, 4,17,1,

16,16,17,1,3, 2,2,2,1, 2,2,3,4,2, 3,3,

16,17,1, 3,17,1, 16,16,16,17,1, 4,1,1,

16,16,17,1,3, 2,2,2,1, 2,1,2,3,15, 16,16,

3,5,6,7, 21,7,6,5,3, 6,5,3,2,1, 2,3,5,2,

3,3,5, 6,5,6,5, 6,7,21,7,6,5, 6,6,

6,3,5,6,7, 21,7,6,5,3, 6,5,3,2,1, 2,3,5,2,

3,2,1, 16,3,2,1, 16,3,2,3,5, 6,6,

50};

uchar code beat5[]={

3,3,3, 9,6,3, 6,3,3,3,3, 9,6,3,

6,3,3,3,3, 9,3,3,3, 6,3,3,3,3, 9,9,

3,3,3, 9,6,3, 6,3,3,3,3, 9,6,3,

6,3,3,3,3, 9,3,3,3, 6,3,3,3,3, 9,9,

2,2,2,2, 3,3,3,6,3, 3,3,3,6,3, 6,3,6,3,

9,3,3, 6,3,6,3, 3,3,3,3,3,3, 9,9,

9,2,2,2,2, 3,3,3,6,3, 3,3,3,6,3, 6,3,6,3,

9,3,3, 6,3,6,3, 6,3,3,3,3, 9,9,

4};

/***************二泉映月*******************/

uchar code song6[]={

6,5,6,4,3, 2,2,3,1,1,2, 3,5,6,5,6,5,6,21, 5,3,5,5,3,2,6,5,6,1,2,

3,5,2,3,5,21,6,2,3,5, 1,21,6,21,23,23,22, 21,6,21,22,23,23,22,21,21,6,21,22,23, 5,5,3,5,6,5,6,21,

5,3,5,5,21,6,6,5,6,5,5, 3,5,3,4,3,5,2,3,2,1,16,1,16, 1,1,2,3,5,1,2,5,3,6, 5,

21,6,21,23,23,22, 21,6,21,22,23,23,22,21,21,6,21,22,23, 5,3,5,3,5, 6,21,21,3,5,3,5,6,5,21,6, 5,3,5,5,21,6,6,5,6,5,5, 3,5,3,4,3,5,2,3,2,1,16,1,16, 1,16,1,2,3,5,1,2,5,3,5,6, 5,3,5,5,6,5,5,3,5, 6,

6,6,6,5,6,21, 5,3,5,5,21,6,6,5,6,5,5, 3,15,3,4,3,5,2,3,2,1,16,1,16, 1,16,1,2,3,5,1,2,5,3,5,6,

5,

50};

uchar code beat6[]={

8,2,2,2,2, 16,6,2,4,2,2, 12,4,4,4,2,2,2,2, 6,2,4,2,2,4,4,2,2,2,2,

12,4,3,1,2,2,2,2,2,2, 16,4,2,2,4,2,2, 12,4,3,1,2,2,4,6,4,2,2,2,2, 16,4,2,2,2,2,2,2,

6,2,2,4,2,4,4,2,2,2,2, 6,2,3,1,2,2,3,1,2,2,2,2,4, 8,6,2,2,2,4,2,2,2,2, 16,

4,2,2,4,2,2, 6,2,3,1,2,2,4,2,2,2,2,2,2, 16,2,2,2,2, 8,4,4,3,1,2,2,2,2,2,2,

6,2,2,4,2,4,4,2,2,2,2, 6,2,3,1,2,2,2,2,2,2,2,2,4, 6,2,6,2,2,2,4,3,1,2,2,2, 12,4,4,2,2,2,2,2,2, 16,

4,4,2,2,2,2, 6,2,2,4,2,4,4,2,2,2,2, 6,2,3,1,2,2,3,1,2,2,2,2,4, 6,2,6,2,2,2,4,3,1,2,1,1,

16,

4};

/***********土耳其进行曲***********/

uchar code song7[]={

7,6,5,6, 21,0,22,21,7,21, 23,0,24,23,22,23, 27,26,25,26,27,26,25,26,28,26,28,

27,26,25,26, 27,26,25,26, 27,26,25,24, 23,

21,22, 23,21,22, 23,22,21,7, 6,7,21,22,

7,5,21,22,23,21,22, 23,22,21,7, 6,22,7,5, 21,

23,24,23,22, 21,22,21,7,6,21,7,6, 5,6,7,5,3,4,5,3,6,5,7,6,21,7,21,22, 23,22,23,22,23,24,23,22, 21,22,21,7,6,21,7,6, 5,6,7,6,3,4,5,3, 4,5,6,4,2,3,4,2, 3,

5,4,3,2, 1,2,3,4,5,6,7,21,21,7,6,5,4,3,2, 1,2,3,4,5,6,7,21, 21,22,5,4,3,2,

1,2,3,4,5,6,7,21, 21,7,6,5,4,3,2, 3,5,1,3,2,4,7,2, 1,23,24,23,22,

21,22,21,7,6,21,7,6,5,6,7,5,3,4,5,3, 6,5,6,7,21,7,21,22,23,22,23,22,23,22,23,21, 24,23,24,23,24,23,24,23, 24,23,22,21,7,21,2,7,

21,22,23,6,5,6,7,5, 6,

50};

uchar code beat7[]={

1,1,1,1, 2,2,1,1,1,1, 2,2,1,1,1,1, 1,1,1,1,1,1,1,1,4,2,2,

2,2,2,2, 2,2,2,2, 2,2,2,2, 4,

2,2, 4,2,2, 2,2,2,2, 2,2,2,2,

2,2,2,2,4,2,2, 2,2,2,2, 2,2,2,2, 4,

1,1,1,1, 1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,

1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1, 4,

1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1, 2,2,1,1,1,1,

1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1, 4,1,1,1,1,

1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1, 4,

4};

AT89C51单片机简易计算器的设计

AT89C51单片机简易计算器的设计 单片机的出现是计算机制造技术高速发展的产物,它是嵌入式控制系统的核心,如今,它已广泛的应用到我们生活的各个领域,电子、科技、通信、汽车、工业等。本设计是基于51系列单片机来进行的数字计算器系统设计,可以完成计算器的键盘输入,进行加、减、乘、除六位数范围内的基本四则运算,并在LCD上显示相应的结果。设计电路采用AT89C51单片机为主要控制电路,利用MM74C922作为计算器4*4键盘的扫描IC读取键盘上的输入。显示采用字符LCD静态显示。软件方面使用C语言编程,并用PROTUES仿真。 一、总体设计 根据功能和指标要求,本系统选用MCS-51系列单片机为主控机。通过扩展必要的外围接口电路,实现对计算器的设计。具体设计如下:(1)由于要设计的是简单的计算器,可以进行四则运算,为了得到较好的显示效果,采用LCD 显示数据和结果。 (2)另外键盘包括数字键(0~9)、符号键(+、-、×、÷)、清除键和等号键,故只需要16 个按键即可,设计中采用集成的计算键盘。 (3)执行过程:开机显示零,等待键入数值,当键入数字,通过LCD显示出来,当键入+、-、*、/运算符,计算器在内部执行数值转换和存储,并等待再次键入数值,当再键入数值后将显示键入的数

值,按等号就会在LCD上输出运算结果。 (4)错误提示:当计算器执行过程中有错误时,会在LCD上显示相应的提示,如:当输入的数值或计算得到的结果大于计算器的表示范围时,计算器会在LCD上提示溢出;当除数为0时,计算器会在LCD 上提示错误。 系统模块图: 二、硬件设计 (一)、总体硬件设计 本设计选用AT89C51单片机为主控单元。显示部分:采用LCD 静态显示。按键部分:采用4*4键盘;利用MM74C922为4*4的键盘扫描IC,读取输入的键值。 总体设计效果如下图:

基于51单片机课程设计

基于51单片机课程设计报告 院系:电子通信工程 团组:电子设计大赛1组 姓名: 指导老师:

目录 一、摘要 (3) 二、系统方案的设计 (3) 三、硬件资源 (5) 四、硬件总体电路搭建 (13) 五、程序流程图 (14) 六、设计感想 (14) 七、参考文献 (16) 附录 (17) 附录 1 程序代码 (17)

一、摘要 本设计以STC89C51单片机为核心的温度控制系统的工作原理和设计方法。温度信号由温度芯片DS18B20采集,并以数字信号的方式传送给单片机。文中介绍了该控制系统的硬件部分,包括:温度检测电路、温度控制电路。单片机通过对信号进行相应处理,从而实现温度控制的目的。文中还着重介绍了软件设计部分,在这里采用模块化结构,主要模块有:数码管显示程序、键盘扫描及按键处理程序、温度信号处理程序、led控制程序、超温报警程序。 关键词:STC89C51单片机 DS18B20温度芯片温度控制 ,LED报警提示. 二、系统方案的设计 1、设计要求 基本功能: 不加热时实时显示时间,并可手动设置时间; 设定加热水温功能。人工设定热水器烧水的温度,范围在20~70度之间,打开开关后,根据设定温度与水温确定是否加热,及何时停止加热,可实时显示温度; 设定加热时间功能。限定烧水时间,加热时间内超过温度上限或低于温度下限报警,并可实时显示温度。 2、系统设计的框架

本课题设计的是一种以STC89C51单片机为主控制单元,以DS18B20为温度传感器的温度控制系统。该控制系统可以实时存储相关的温度数据并记录当前的时间。其主要包括:电源模块、温度测量及调理电路、键盘、数码管显示、指示灯、报警、继电器及单片机最小系统。 图1 系统设计框架 3 工作原理 温度传感器 DS18B20 从设备环境的不同位置采集温度,单片机STC8951获取采集的温度值,经处理后得到当前环境中一个比较稳定的温度值,再根据当前设定的温度上下限值,通过加热和降温对当前温度进行调整。当采集的温度经处理后超过设定温度的上限时,单片机通过三极管驱动继电器开启降温设备(压缩制冷器) ,当采集的温度经处理后低于设定温度的下时 , 单片机通过三极管驱动继电器开启升温设备 (加热器) ,这里采用通过LED1和LED2取代!!! 当由于环境温度变化太剧烈或由于加热或降温设备出现故障,或者温度传感头出现故障导致在一段时间内不能将环境温度调整到规定的温度限内的时候,单片机通过三极管驱动扬声器发出警笛声,这里采用HLLED提示。

基于51单片机电子密码锁设计

一、设计目的 1.1课题简介 如何实现防盗是很多人关心的问题,传统的机械锁由于其构造简单,被撬的事件屡见不鲜,使人们的人身及财产安全受到很大威胁。电子密码锁是一种依靠电子电路来控制电磁锁的开和闭的装置,开锁需要输入正确密码,若密码泄露,用户可以随时更改密码。因此其保密性高,使用灵活性好,安全系数高,可以满足广大用户的需要,现在广泛使用的有红外遥控电子密码锁,声控密码锁,按键密码锁等。 1.2课题研究目的 本设计是一种基于单片机的密码锁方案,根据基本要求规划单片机密码锁的硬件电路和软件程序,同时对单片机的型号选择、硬件设计、软件流程图、单片机存储单元的分配等都有注释。现在很多地方都需要密码锁,电子密码锁的性能和安全性大大超过了机械锁,为了提高密码的保密性,必须可以经常更改密码,以便密码被盗时可以修改密码。 本次设计的密码锁具备的功能:LED数码管显示初始状态“——————”,用户通过键盘输入密码,每输入一位密码,LED数码管相应有一位变为“P”,若想重新输入密码,只需按下“CLR”键。密码输入完毕后按确认键“#”,密码锁控制芯片将输入的密码和密码锁控制芯片中存储的密码相比,若密码错误,则不开锁,会有红灯亮提示,同时显示“Error”。若正确,则开锁,会有绿灯亮提示,同时显示“PASS”。用户可以根据实际情况随意改变密码值或密码长度,密码输入正确后可以按下“CHG”修改密码,输入新密码时每输入一位新密码相应有一位变为“H”,以便提示用户此时输入的是新密码,修改新密码时若想重新输入新密码只需按下“CLR”键即可。输入新密码后按确认键即修改成功,新密码写入单片机内部RAM中,以便以后用来确认密码的正确性。按下复位键,系统恢复初始状态,密码也恢复初始密码,本设计中初始密码是“096168”。 本次设计中硬件主要由我完成,软件主要由张振完成。 二、硬件设计 2.1概述 本系统主要由单片机最小系统、电源电路、输入键盘电路、输出显示电路、开锁电路等组成,系统框图如图1所示:

基于51单片机的计算器设计程序代码汇编

DBUF EQU 30H TEMP EQU 40H YJ EQU 50H ;结果存放 YJ1 EQU 51H ;中间结果存放GONG EQU 52H ;功能键存放 ORG 00H START: MOV R3,#0 ;初始化显示为空MOV GONG,#0 MOV 30H,#10H MOV 31H,#10H MOV 32H,#10H MOV 33H,#10H MOV 34H,#10H MLOOP: CALL DISP ;PAN调显示子程序WAIT: CALL TESTKEY ; 判断有无按键JZ WAIT CALL GETKEY ;读键 INC R3 ;按键个数 CJNE A,#0,NEXT1 ; 判断就是否数字键 LJMP E1 ; 转数字键处理NEXT1: CJNE A,#1,NEXT2 LJMP E1 NEXT2: CJNE A,#2,NEXT3 LJMP E1 NEXT3: CJNE A,#3,NEXT4 LJMP E1 NEXT4: CJNE A,#4,NEXT5 LJMP E1 NEXT5: CJNE A,#5,NEXT6 LJMP E1 NEXT6: CJNE A,#6,NEXT7 LJMP E1 NEXT7: CJNE A,#7,NEXT8 LJMP E1 NEXT8: CJNE A,#8,NEXT9 LJMP E1 NEXT9: CJNE A,#9,NEXT10 LJMP E1 NEXT10: CJNE A,#10,NEXT11 ;判断就是否功能键LJMP E2 ;转功能键处理NEXT11: CJNE A,#11,NEXT12 LJMP E2 NEXT12: CJNE A,#12, NEXT13 LJMP E2

基于51单片机简易电子琴的课程设计

基于51单片机简易电子琴 1 课题背景 单片微型计算机室大规模集成电路技术发展的产物,属于第四代电子计算机它具有高性能、高速度、体积小、价格低廉、稳定可靠、应用广泛的特点。他的应用必定导致传统的控制技术从根本上发生变革。因此,单片机的开发应用已成为高科技和工程领域的一项重大课题。 电子琴是现代电子科技与音乐结合的产物,是一种新型的键盘乐器。它在现代音乐扮演重要的角色,单片机具有强大的控制功能和灵活的编程实现特性,它已经溶入现代人们的生活中,成为不可替代的一部分。本文的主要内容是用AT89S52单片机为核心控制元件,设计一个电子琴。以单片机作为主控核心,与键盘扬声器等模块组成核心主控制模块,在主控模块上设有8个按键,和一个复位按键。 主要对使用单片机设计简易电子琴进行了分析,并介绍了基于单片机电子琴硬件的组成。利用单片机产生不同频率来获得我们要求的音阶,最终可随意弹奏要表达的音符。并且分别从原理图,主要芯片,个模块原理及各莫奎的程序的调试来详细阐述。 一首音乐是许多不同的音阶组成的,而每个音阶对应着不同的频率,这样我们就可以利用不同的频率的组合,构成我们想演奏的那首曲目。当然对于单片机来产生不同的频率非常方便,我们可以利用单片机的定时/计数器T0来产生这样的方波频率信号,因此,我们只要把一首歌曲的音阶对应频率关系编写正确就可以达到我们想要的曲目。 2 任务要求与总体设计方案 2.1 设计任务与要求 利用所给键盘的1,2,3,4,5,6,7,8八个键,能够发出7个不同的音调,而且有一个按键可以自动播放歌曲,要求按键按下时发声,松开延时一小段时间,中间再按别的键则发另外一音调的声音,当系统扫描到键盘按下,则快速检测出是哪一个按键被按下,然后单片机的定时器启动,发出一定频率的脉冲,该频率的脉冲经喇叭驱动电路放大滤波后,就会发出相应的音调。如果在前一个按下的键发声的同时有另一个按键被按下,则启动中断系统。前面的发音停止,转到后按的键的发音程序。发出后按的键的音调。 2.2 设计方案 2.2.1 播放模块 播放模块是由喇叭构成,它几乎不存在噪声,音响效果较好,而且由于所需驱动功率较小,且价格低廉,所以,被广泛应用。 2.2.2 按键控制模块

基于51单片机电子万年历设计

基于51单片机电子万年历设计 专业:机电设备维修与管理姓名:杜洪浦指导老师: 摘要电子万年历是一种非常广泛日常计时工具,对现代社会越来越流行。它可以对年、月、日、周日、时、分和秒进行计时,还具有闰年补偿等多种功能,而且DS1302的使用寿命长,误差小。对于数字电子万年历采用直观的数字显示,可以同时显示年、月、日、周日、时、分、秒等信息,还具有时间校准等功能。该电路采用AT89S52单片机作为核心,功耗小,能在3V的低压工作,电压可选用3到5V电压供电。 万年历的设计过程在硬件与软件方面进行同步设计。硬件部分主要由AT89C52单片机,液晶显示电路,复位电路,时钟电路,稳压电路电路以及串口下载电路等组成。在单片机的选择上使用了AT89C52单片机,该单片机适合于许多较为复杂控制应用场合。显示器使用液晶LCD1602。软件方面主要包括日历程序、液晶驱动程序,显示程序等。程序采用汇编语言编写。所有程序编写完成后,在Keil C51软件中进行调试,确定没有问题后,在Proteus软件中嵌入单片机内进行仿真。 关键词时钟电钟,DS1302,液晶LCD1602,单片机 目录 1设计要求与方案论证 (2) 1.1 设计要求 (2) 1.2 系统基本方案选择和论证 (2) 1.2.1单片机芯片的选择方案和论证 (2) 1.2.2 显示模块选择方案和论证 (3) 1.2.3时钟芯片的选择方案和论证: (3) 1.3 电路设计最终方案决定 (3) 2系统的硬件设计与实现 (3) 2.1 电路设计框图 (4) 2.2 系统硬件概述 (4) 2.3 主要单元电路的设计 (4) 2.3.1单片机主控制模块的设计 (4)

51单片机简易计算器程序

#include <reg51.h>#include <intrins.h> #include <ctype.h> #include <stdlib.h> #define uchar unsigned char #define uint unsigned int uchar operand1[9], operand2[9]; uchar operator; void delay(uint); uchar keyscan(); void disp(void); void buf(uint value); uint compute(uint va1,uint va2,uchar optor); uchar code table[] = {0xc0,0xf9,0xa4,0xb0,0x99, 0x92,0x82,0xf8,0x80,0x90,0xff}; uchar dbuf[8] = {10,10,10,10,10,10,10,10}; void delay(uint z) { uint x,y; for(x=z;x>0;x--)

for(y=110;y>0;y--); } uchar keyscan() { uchar skey; P1 = 0xfe; while((P1 & 0xf0) != 0xf0) { delay(3); while((P1 & 0xf0) != 0xf0) { switch(P1) { case 0xee: skey = '7'; break; case 0xde: skey = '8'; break; case 0xbe: skey = '9'; break; case 0x7e: skey = '/'; break; default: skey = '#'; }

基于51单片机的电子琴设计课程设计

目录 前言 (2) 第1章基于51单片机的电子琴设计 (3) 1.1 电子琴的设计要求 (3) 1.2 电子琴设计所用设备及软件 (3) 1.3 总体设计方案 (3) 第2章系统硬件设计 (5) 2.1 琴键控制电路 (5) 2.2 音频功放电路 (6) 2.3 时钟-复位电路 (6) 2.4 LED显示电路 (6) 2.5 整体电路 (6) 第3章电子琴系统软件设计 (7) 3.1 系统硬件接口定义 (7) 3.2 主函数 (8) 3.2.1 主函数程序 (8) 3.3 按键扫描及LED显示函数 (9) 3.3.1 键盘去抖及LED显示子程序 (10) 3.4 中断函数 (11) 3.4.1 中断程序 (12) 第4章电子琴和调试 (12) 4.1 调试工具 (12) 4.2 调试结果 (13) 4.3 电子琴设计中的问题及解决方法 (14) 第5章电子琴设计总结 (15) 参考文献 (16) 附录 (17)

前言 音乐教育是学校美育的主要途径和最重要内容,它在陶冶情操、提高素养、开发智力,特别是在培养学生创新精神和实践能力方面发挥着独特的作用。近年来,我国音乐教育在理论与实践上都取得了有目共睹的成绩,探索并形成了具有中国特色的、较为完整的音乐教育教学体系。但我国音乐教育的改革力度离素质教育发展的要求还存在一定距离。如今,电子琴作为电子时代的新产物以其独特的功能和巨大的兼容性被人们广泛的接受和推崇。而在课堂教学方面,它拥有其它乐器无法比拟的两个瞬间:瞬间多元素思维的特殊的弹奏方法;瞬间多声部(包括多音色)展示的乐队音响效果的特点。结合电子琴自身强大的功能及独特的优点来进行音乐教育的实施,这样就应该大力推广电子琴进入音乐教室,让电子琴教学在音乐教育中发挥巨大的作用。现代乐器中,电子琴是高新科技在音乐领域的一个代表,体现了人类电子技术和艺术的完美结合。电子琴自动伴奏的稳定性、准确性,以及鲜明的强弱规律、随人设置的速度要求,都更便于人们由易到难、深入浅出的准确掌握歌曲节奏和乐曲风格,对其节奏的稳定性和准确性训练能起到非常大的作用。电子琴所包含的巨量的音乐信息和强大的音乐表现力可以帮助音乐教学更好地贯彻和落实素质教育,更有效地提高人们的音乐素质和能力。目前,市场上的电子琴可谓琳琅满目,功能也是越来越完备。以单片机作为主控核心,设计并制作的电子琴系统运行稳定,其优点是硬件电路简单、软件功能完善、控制系统可靠、性价比较高等,具有一定的实用与参考价值。这就为电子琴的普及提供了方便。 二、电子琴设计要求本设计主要是用AT89C51单片机为核心控制元件,设计一台电子琴。以单片机作为主控核心,与键盘、扬声器等模块组成核心主控制模块,在主控模块上设有7个按键和1个复位按键。本系统主要是完成2大功能:音乐自动播放、电子琴弹奏。关于声音的处理,使用单片机C语言,利用定时器来控制频率,而每个音符的符号只是存在自定义的表中。

51单片机教程

原作:平凡的单片机

1、何谓单片机一台能够工作的计算机要有这样几个部份构成:CPU(进行运算、控制)、RAM(数据存储)、ROM(程序存储)、输入/输出设备(例如:串行口、并行输出口等)。在个人计算机上这些部份被分成若干块芯片,安装一个称之为主板的印刷线路板上。而在单片机中,这些部份,全部被做到一块集成电路芯片中了,所以就称为单片(单芯片)机,而且有一些单片机中除了上述部份外,还集成了其它部份如A/D,D/A等。 天!PC中的CPU一块就要卖几千块钱,这么多东西做在一起,还不得买个天价!再说这块芯片也得非常大了。不,价格并不高,从几元人民币到几十元人民币,体积也不大,一般用40脚封装,当然功能多一些单片机也有引脚比较多的,如68引脚,功能少的只有10多个或20多个引脚,有的甚至只8只引脚。为什么会这样呢?功能有强弱,打个比方,市场上面有的组合音响一套才卖几百块钱,可是有的一台功放机就要卖好几千。另外这种芯片的生产量很大,技术也很成熟,51系列的单片机已经做了十几年,所以价格就低了。既然如此,单片机的功能肯定不强,干吗要学它呢?话不能这样说,实际工作中并不是任何需要计算机的场合都要求计算机有很高的性能,一个控制电冰箱温度的计算机难道要用PIII?应用的关键是看是否够用,是否有很好的性能价格比。所以8051出来十多年,依然没有被淘汰,还在不断的发展中。 2、MCS51单片机和8051、8031、89C51等的关系我们平常老是讲8051,又有什么8031,现在又有89C51,它们之间究竟是什么关系? MCS51是指由美国INTEL公司(对了,就是大名鼎鼎的INTEL)生产的一系列单片机的总称,这一系列单片机包括了好些品种,如8031,8051,8751,8032,8052,8752等,其中8051是最早最典型的产品,该系列其它单片机都是在8051的基础上进行功能的增、减、改变而来的,所以人们习惯于用8051来称呼MCS51系列单片机,而8031是前些年在我国最流行的单片机,所以很多场合会看到8031的名称。INTEL 公司将MCS51的核心技术授权给了很多其它公司,所以有很多公司在做以8051为核心的单片机,当然,功能或多或少有些改变,以满足不同的需求,其中89C51就是这几年在我国非常流行的单片机,它是由美国ATMEL 公司开发生产的。以后我们将用89C51来完成一系列的实验。 一、单片机的外部结构 拿到一块芯片,想要使用它,首先必须要知道怎样连线,我们用的一块称之为89C51的芯片,下面我们就看一下如何给它连线。1、电源:这当然是必不可少的了。单片机使用的是5V电源,其中正极接40引脚,负极(地)接20引脚。2、振蒎电路:单片机是一种时序电路,必须提供脉冲信号才能正常工作,在单片机内部已集成了振荡器,使用晶体振荡器,接18、19脚。只要买来晶振,电容,连上就可以了,按图1接上即可。3、复位引脚:按图1中画法连好,至于复位是何含义及为何需要复要复位,在单片机功能中介绍。4、EA引脚:EA引脚接到正电源端。至此,一个单片机就接好,通上电,单片机就开始工作了。 我们的第一个任务是要用单片机点亮一只发光二极管LED,显然,这个LED必须要和单片机的某个引脚相连,否则单片机就没法控制它了,那么和哪个引脚相连呢?单片机上除了刚才用掉的5个引脚,还有35个,我们将这个LED和1脚相连。(见图1,其中R1是限流电阻) 按照这个图的接法,当1脚是高电平时,LED不亮,只有1脚是低电平时,LED才发亮。因此要1脚我们要能够控制,也就是说,我们要能够让1引脚按要求变为高或低电平。即然我们要控制1脚,就得给它起个名字,总不能就叫它一脚吧?叫它什么名字呢?设计51芯片的INTEL公司已经起好了,就叫它P1.0,这是规定,不可以由我们来更改。

基于51单片机电子闹钟的设计(1)

单片机原理与接口技术课程设计题目:多功能电子闹钟 院系:电气与电子工程系 专业:电气工程及其自动化 班级:电气工程1503 姓名: 学号: 指导教师: 二零一七年十二月

多功能电子闹钟 摘要 单片机自20世纪70年代问世以来,以其极高的性能价格比,受到人们的重视和关注,应用很广、发展很快。而51单片机是各单片机中最为典型和最有代表性的一种。 本设计以AT89C51芯片为核心,辅以必要的外围电路,设计了一个结构简单,功能齐全的电子时钟,它由5V直流电源供电。在硬件方面,除了CPU外,使用八个七段LED数码管来进行显示,LED采用的是动态扫描显示,使用74LS245芯片进行驱动。通过LED能够较为准确地显示时、分、秒。四个简单的按键实现对时间的调整。软件方面采用C语言编程。整个电子钟系统能完成时间的显示、调时、校时和三组定时闹钟的功能。 选用单片机最小系统应用程序,添加比较程序、时间调整程序及蜂鸣程序,通过时间比较程序触发蜂鸣,实现闹钟功能,完成设计所需求的软件环境。介绍并使用Keil 单片机模拟调试软件,测试程序的可行性并用Proteus进行仿真。 关键词:单片机定时器中断闹钟 LED

目录 第1章方案的选择和论证 (1) 1.1单片机型号的选择 (1) 1.2按键的选择 (1) 1.3显示器的选择 (1) 1.4计时部分的选择 (1) 1.5发音部分的设计 (2) 1.6显示器驱动电路 (2) 1.7电源的选择 (2) 第2章数字电子钟的设计原理和方法 (3) 2.1设计原理 (3) 2.2硬件电路的设计 (3) 2.2.1 AT89C51单片机简介 (3) 2.2.2 键盘电路的设计 (3) 2.2.3 段码驱动电路 (4) 2.2.4 蜂鸣器驱动电路 (4) 2.3软件部分的设计 (5) 2.3.1 主程序部分的设计 (5) 2.3.2 中断定时器的设置 (5) 2.3.3 闹钟子函数 (6) 2.3.4 计时函数 (6) 2.3.5 键盘扫描函数 (8) 2.3.6 时间和闹钟的设置 (8) 第3章实验结果 (10) 总结 (11) 致谢 (12) 参考文献 (13) 附录 (14)

AT89C51单片机C实现简易计算器

AT89C51单片机简易计算器的设计 一、总体设计 根据功能和指标要求,本系统选用MCS-51系列单片机为主控机。通过扩展必要的外围接口电路,实现对计算器的设计。具体设计如下:(1)由于要设计的是简单的计算器,可以进行四则运算,为了得到较好的显示效果,采用LCD 显示数据和结果。 (2)另外键盘包括数字键(0~9)、符号键(+、-、×、÷)、清除键和等号键,故只需要16 个按键即可,设计中采用集成的计算键盘。 (3)执行过程:开机显示零,等待键入数值,当键入数字,通过LCD显示出来,当键入+、-、*、/运算符,计算器在内部执行数值转换和存储,并等待再次键入数值,当再键入数值后将显示键入的数值,按等号就会在LCD上输出运算结果。 (4)错误提示:当计算器执行过程中有错误时,会在LCD上显示相应的提示,如:当输入的数值或计算得到的结果大于计算器的表示范围时,计算器会在LCD上提示溢出;当除数为0时,计算器会在LCD 上提示错误。 系统模块图:

二、硬件设计 (一)、总体硬件设计 本设计选用AT89C51单片机为主控单元。显示部分:采用LCD 静态显示。按键部分:采用4*4键盘;利用MM74C922为4*4的键盘扫描IC,读取输入的键值。 总体设计效果如下图:

(二)、键盘接口电路 计算器输入数字和其他功能按键要用到很多按键,如果采用独立按键的方式,在这种情况下,编程会很简单,但是会占用大量的I/O 口资源,因此在很多情况下都不采用这种方式,而是采用矩阵键盘的方案。矩阵键盘采用四条I/O 线作为行线,四条I/O 线作为列线组成键盘,在行线和列线的每个交叉点上设置一个按键。这样键盘上按键的个数就为4×4个。这种行列式键盘结构能有效地提高单片机系统中I/O 口的利用率。 矩阵键盘的工作原理: 计算器的键盘布局如图2所示:一般有16个键组成,在单片机中正好可以用一个P口实现16个按键功能,这种形式在单片机系统中也最常用。 图 2 矩阵键盘布局图 矩阵键盘内部电路图如图3所示:

单片机课程设计——基于51单片机的温度监控系统设计

单片机课程设计报告 题目:温度监控系统设计 学院:能源与动力工程学院 专业:测控技术与仪器专业 班级: 2班 成员:魏振杰 二〇一五年十二月

一、引言 温度是工业控制中主要的被控参数之一,特别是在冶金、化工、建材、食品、机械、石油等工业中,具有举足重轻的作用。对于不同场所、不同工艺、所需温度高低范围不同、精度不同,则采用的测温元件、测方法以及对温度的控制方法也将不同;产品工艺不同、控制温度的精度不同、时效不同,则对数据采集的精度和采用的控制算法也不同,因而,对温度的测控方法多种多样。 随着电子技术和微型计算机的迅速发展,微机测量和控制技术也得到了迅速的发展和广泛的应用。利用微机对温度进行测控的技术,也便随之而生,并得到日益发展和完善,越来越显示出其优越性。 作为获取信息的手段——传感器技术得到了显著的进步,其应用领域较广泛。传感器技术已成为衡量一个国家科学技术发展水平的重要标志之一。因此,了解并掌握各类传感器的基本结构、工作原理及特性是非常重要的。 为了提高对传感器的认识和了解,尤其是对温度传感器的深入研究以及其用法与用途,基于实用、广泛和典型的原则而设计了本系统。本系统利用传感器与单片机相结合,应用性比较强,本系统可以作为仓库温度监控系统,如果稍微改装可以做热水器温度调节系统、实验室温度监控系统,以及构成智能电饭煲等等。课题主要任务是完成环境温度监测,利用单片机实现温度监测并通过报警信号提示温度异常。本设计具有操作方便,控制灵活等优点。 本设计系统包括单片机,温度采集模块,显示模块,按键控制模块,报警和指示模块五个部分。文中对每个部分功能、实现过程作了详细介绍。整个系统的核心是进行温度监控,完成了课题所有要求。 二、实验目的和要求 2.1学习DS18B20温度传感芯片的结构和工作原理。 2.2掌握LED数码管显示的原理及编程方法。 2.3掌握独立式键盘的原理及使用方法。 2.4掌握51系列单片机数据采集及处理的方法。 三、方案设计

基于51单片机的电子表设计

1 绪论 电子表是20世纪50年代才开始出现的新型计时器。最早的一款电子表被称做“摆轮游丝电子表”,它诞生于1955年。这种手表用电磁摆轮代替发条驱动,以摆轮游丝作为振荡器,微型电池为能源,通过电子线路驱动摆轮工作。它的走时部分与机械手表完全相同,被称为第一代电子手表。1960年,美国布洛瓦公司最早开始出售“音叉电子手表”。这种手表以金属音叉作为振荡器,用电子线路输出脉冲电流,使机械音叉振动。它比摆轮式电子手表结构简单,走时更精确,被称为第二代电子手表。1969年,日本精工舍公司推出了世界上最早的石英电子表。石英电子表的出现,立刻成为了钟表界主流产品,它走时精确,结构简单,轻松地将一、二代电子表,甚至机械表淘汰出局。石英表又称“水晶振动式电子表”,因为它是利用水晶片的“发振现象”来计时的。当水晶受到外部的加力电压,就会产生变形和伸缩反应;如果压缩水晶,便会使水晶两端产生电力。这样的性质在很多结晶体上也可见到,称为“压电效果”。石英表就是利用周期性持续“发振”的水晶,为我们带来准确的时间。 单片机是一种集成电路芯片,是采用超大规模集成电路技术把具有数据处理能力的中央处理器CPU随机存储器RAM、只读存储器ROM、多种I/O口和中断系统、定时器/计时器等功能(可能还包括显示驱动电路、脉宽调制电路、模拟多路转换器、A/D转换器等电路)集成到一块硅片上构成的一个小而完善的微型计算机系统,在工业控制领域的广泛应用。从上世纪80年代,由当时的4位、8为单片机,发展到现在的32位300M的高速单片机。 1.1 单片机的介绍 单片微型计算机简称单片机,是典型的嵌入式微控制器(Microcontroller Unit),常用英文字母的缩写MCU表示单片机,单片机又称单片微控制器,它不是完成某一个逻辑功能的芯片,而是把一个计算机系统集成到一个芯片上。相当于一个微型的计算机,和计算机相比,单片机只缺少了I/O设备。概括的讲:一块芯片就成了一台计算机。它的体积小、质量轻、价格便宜、为学习、应用和开发提

单片机课程设计——基于C51简易计算器

单片机双字节十六进制减法实验设计 摘要 本设计是基于51系列的单片机进行的双字节十六进制减法设计,可以完成计 算器的键盘输入,进行加、减、3位无符号数字的简单运算,并在LED上相应的显示结果。 设计过程在硬件与软件方面进行同步设计。硬件方面从功能考虑,首先选择内部存储资源丰富的AT89C51单片机,输入采用5个键盘。显示采用3位7段共阴极LED动态显示。软件方面从分析计算器功能、流程图设计,再到程序的编写进行系统设计。编程语言方面从程序总体设计以及高效性和功能性对C语言和汇编语言进行比较分析,针对计算器四则运算算法特别是乘法和除法运算的实现,最终选用KEIL公司的μVision3软件,采用汇编语言进行编程,并用proteus 仿真。 引言 十六进制减法计算器的原理与设计是单片机课程设计课题中的一个。在完成理论学习和必要的实验后,我们掌握了单片机的基本原理以及编程和各种基本功能的应用,但对单片机的硬件实际应用设计和单片机完整的用户程序设计还不清楚,实际动手能力不够,因此对该课程进行一次课程设计是有必要的。 单片机课程设计既要让学生巩固课本学到的理论,还要让学生学习单片机硬件电路设计和用户程序设计,使所学的知识更深一层的理解,十进制加法计算器原理与硬软件的课程设计主要是通过学生独立设计方案并自己动手用计算机电路设计软件,编写和调试,最后仿真用户程序,来加深对单片机的认识,充分发挥学生的个人创新能力,并提高学生对单片机的兴趣,同时学习查阅资料、参考资料的方法。 关键词:单片机、计算器、AT89C51芯片、汇编语言、数码管、加减

目录 摘要 (01) 引言 (01) 一、设计任务和要求............................. 1、1 设计要求 1、2 性能指标 1、3 设计方案的确定 二、单片机简要原理............................. 2、1 AT89C51的介绍 2、2 单片机最小系统 2、3 七段共阴极数码管 三、硬件设计................................... 3、1 键盘电路的设计 3、2 显示电路的设计 四、软件设计................................... 4、1 系统设计 4、2 显示电路的设计 五、调试与仿真................................. 5、1 Keil C51单片机软件开发系统 5、2 proteus的操作 六、心得体会.................................... 参考文献......................................... 附录1 系统硬件电路图............................ 附录2 程序清单.................................. 一、设计任务和要求

#基于51单片机简易电子琴

1 课题背景 单片微型计算机室大规模集成电路技术发展的产物,属于第四代电子计算机它具有高性能、高速度、体积小、价格低廉、稳定可靠、应用广泛的特点。他的应用必定导致传统的控制技术从根本上发生变革。因此,单片机的开发应用已成为高科技和工程领域的一项重大课题。 电子琴是现代电子科技与音乐结合的产物,是一种新型的键盘乐器。它在现代音乐扮演重要的角色,单片机具有强大的控制功能和灵活的编程实现特性,它已经溶入现代人们的生活中,成为不可替代的一部分。本文的主要内容是用AT89S52单片机为核心控制元件,设计一个电子琴。以单片机作为主控核心,与键盘扬声器等模块组成核心主控制模块,在主控模块上设有8个按键,和一个复位按键。 主要对使用单片机设计简易电子琴进行了分析,并介绍了基于单片机电子琴硬件的组成。利用单片机产生不同频率来获得我们要求的音阶,最终可随意弹奏要表达的音符。并且分别从原理图,主要芯片,个模块原理及各莫奎的程序的调试来详细阐述。 一首音乐是许多不同的音阶组成的,而每个音阶对应着不同的频率,这样我们就可以利用不同的频率的组合,构成我们想演奏的那首曲目。当然对于单片机来产生不同的频率非常方便,我们可以利用单片机的定时/计数器T0来产生这样的方波频率信号,因此,我们只要把一首歌曲的音阶对应频率关系编写正确就可以达到我们想要的曲目。 2 任务要求与总体设计方案 2.1 设计任务与要求 利用所给键盘的1,2,3,4,5,6,7,8八个键,能够发出7个不同的音调,而且有一个按键可以自动播放歌曲,要求按键按下时发声,松开延时一小段时间,中间再按别的键则发另外一音调的声音,当系统扫描到键盘按下,则快速检测出是哪一个按键被按下,然后单片机的定时器启动,发出一定频率的脉冲,该频率的脉冲经喇叭驱动电路放大滤波后,就会发出相应的音调。如果在前一个按下的键发声的同时有另一个按键被按下,则启动中断系统。前面的发音停止,转到后按的键的发音程序。发出后按的键的音调。 2.2 设计方案 2.2.1 播放模块 播放模块是由喇叭构成,它几乎不存在噪声,音响效果较好,而且由于所需驱动功率较小,且价格低廉,所以,被广泛应用。 2.2.2 按键控制模块 电子琴设有8个按键,其中7个作为音符输入,另外一个作为模式转换按键,实现用户存放的自动播放歌曲。7个按键分别代表7个音符,包括中音段的全部音符,通过软硬件设计,模式转换按键触发外部中断,中断使程序跳转,实现模式转换,启动电子琴。然后通过查询电子琴所按下的按键,读取电子琴输入状态,跳转到对应的程序入口,实

51单片机简易计算器代码

#include"reg52.h" #define uchar unsigned char #define uint unsigned int sbit busy=P0^7; void delay(uint z) { uint x,y; for(x=z;x>0;x--) for(y=110;y>0;y--); } char i,j,temp,num; long a,b,c; //a,第一个数b,第二个数c,得数 uchar flag,fuhao;//flag表示是否有符号键按下,fuhao表征按下的是哪个符号uchar code table[]={7,8,9,0,4,5,6,0,1,2,3,0,0,0,0,0}; uchar code table1[]={7,8,9,0x2f-0x30,4,5,6,0x2a-0x30,1,2,3,0x2d-0x30,0x01-0x30,0,0x3d-0x30,0 x2b-0x30}; //按键显示编码表 sbit lcden=P2^2; sbit lcdwrite=P2^1; sbit lcdrs=P2^0; //lcd的写指令 void write_com(uchar com) { lcdrs=0; lcden=0; P0=com; delay(1); lcden=1; delay(1); lcden=0; } //lcd的写数据 void write_date(uchar da) { lcdrs=1; lcden=0; P0=da; delay(1); lcden=1; delay(1); lcden=0; } //初始化

void init() //初始化 { uchar num; num=-1; lcdwrite=0; lcden=0; write_com(0x38); write_com(0x0c); write_com(0x06); write_com(0x01); delay(500);//延时0.5s write_com(0x01); i=0; j=0; a=0; //第一个参与运算的数 b=0; //第二个参与运算的数 c=0; flag=0; //flag表示是否有符号键按下, fuhao=0; // fuhao表征按下的是哪个符号 } void keyscan() // 键盘扫描程序 { P3=0xfe; if(P3!=0xfe) { delay(10); //延迟20ms if(P3!=0xfe) { temp=P3&0xf0; switch(temp) { case 0xe0:num=0; break; case 0xd0:num=1; break; case 0xb0:num=2; break; case 0x70:num=3; break; } } while(P3!=0xfe); if(num==0||num==1||num==2)//如果按下的是'7','8'或'9 { if(j==1)//确认一次计算完毕,清屏 { write_com(0x01);

(完整版)基于51单片机的4人抢答器课程设计

基于51单片机的4人抢答器设计 设计要求: 以单片机为核心,设计一个4位竞赛抢答器:同时供4名选手或4个代表队比赛,分别用4个按钮S0~S3表示。 设置一个系统清除和抢答控制开关S,开关由主持人控制。 抢答器具有锁存与显示功能。即选手按按钮,锁存相应的编号,并在优先抢答选手的编号一直保持到主持人将系统清除为止。 抢答器具有定时抢答功能,且一次抢答的时间由主持人设定(如30秒)。 当主持人启动“开始”键后,定时器进行减计时,同时扬声器发出短暂的声响,声响持续的时间为0.5s左右。 参赛选手在设定的时间内进行抢答,抢答有效,定时器停止工作,显示器上显示选手的编号和抢答的时间,并保持到主持人将系统清除为止。 如果定时时间已到,无人抢答,本次抢答无效,系统报警并禁止抢答,定时显示器上显示00。 工作原理: 通过键盘改变抢答的时间,原理与闹钟时间的设定相同,将定时时间的变量置为全局变量后,通过键盘扫描程序使每按下一次按键,时间加1(超过30时置0)。同时单片机不断进行按键扫描,当参赛选手的按键按下时,用于产生时钟信号的定时计数器停止计数,同时将选手编号(按键号)和抢答时间分别显示在LED上。

#include #define uchar unsigned char #define uint unsigned int uchar num; //定义中断变量,num计满20表示1秒时间到uchar num1; //十秒倒计时显示初始值 uchar flag1,flag2; //清零键及开始键按下标志位 uchar flag3,flag4=0; //定义键盘按下标志位 uchar code table[]={ 0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07, 0x7f,0x6f}; //数码管编码

51单片机电子密码锁

目录 第1节引言 (1) 1.1 电子密码锁述 (1) 1.2 本设计主要任务 (1) 1.3 系统主要功能 (2) 第2节系统硬件设计 (3) 2.1 系统的硬件构成及功能 (3) 2.2 AT89C2051单片机及其引脚说明 (3) 第3节系统软件设计 (5) 3.1 系统主程序设计(流程图) (5) 3.2 软件设计思想 (5) 3.3 储单元的分配 (5) 3.4 系统源程序 (6) 3.5 系统应用说明 (9) 3.6 小结 (9) 结束语 (10) 参考文献 (11) 附录 (12)

电子密码锁 第1节引言 1.1 电子密码锁概述 随着社会物质财富的日益增长和人们生活水平的提高,安全成为现代居民最关心的问题之一。而锁自古以来就是把守门的铁将军,人们对它要求甚高,即要求可靠地防盗,又要使用方便,这也是制锁者长期以来研制的主题。传统的门锁既要备有大量的钥匙,又要担心钥匙丢失后的麻烦。另外,如:宾馆、办公大楼、仓库、保险柜等,由于装修施工等人住时也要把原有的锁胆更换,况且钥匙随身携带也诸多便。随着单片机的问世,出现了带微处理器的密码锁,它除具有电子密码锁的功能外,还引入了智能化、科技化等功能。从而使密码锁具有很高的安全性、可靠性。目前西方发达国家已经大量应用智能门禁系统,可以通过多种的更加安全更加方便可靠的方法来实现大门的管理。但电子密码锁在我国的应用还不广泛,成本还很高,希望通过不断地努力使电子密码锁能够在我国及居民日常生活中得到广泛应用,这也是一个国家生活水平的体现。 很多行业的许多地方都要用到密码锁,随着人们生活水平的提高,如何实现家庭或公司的防盗这一问题也变的尤其突出,传统的机械锁由于其构造简单,被撬的事件屡见不鲜,再者,普通密码锁的密码容易被多次试探而破译,所以,考虑到单片机的优越性,一种基于单片机的电子密码锁应运而生。电子密码锁由于其保密性高,使用灵活性好,安全系数高,受到了广大用户的亲睐。 设计本课题时构思的方案:采用以AT89C2051为核心的单片机控制方案;能防止多次试探而不被破译,从而有效地克服了现实生活中存在的许多缺点。 1.2 本设计主要任务 (1)共8位密码,每位的取值范围为1~8。 (2)用户可以自行设定和修改密码。 (3)按每个密码键时都有声、光提示。 (4)若键入的8位开锁密码不完全正确,则报警5秒钟,以提醒他人注意。

51单片机 实现计算器功能

51单片机多为计算器汇编程序 此程序并不仅仅局限于255以内操作 FIR0 EQU 30H FIR1 EQU 31H FIR2 EQU 32H FIR3 EQU 33H ;第一个操作数 SEC0 EQU 34H SEC1 EQU 35H SEC2 EQU 36H SEC3 EQU 37H ; 第二个操作数 LIN0 EQU 38H LIN1 EQU 39H LIN2 EQU 40H LIN3 EQU 41H ; 数据暂存 RES0 EQU 42H RES1 EQU 43H RES2 EQU 44H RES3 EQU 45H ;结果暂存区 XLINE EQU 46H YLINE EQU 47H ;记录按键按键位置 SYMBLE EQU 48H ;操作符存储 DDE0 EQU 49H DDE1 EQU 50H DDE2 EQU 51H ;用于延时 FLEL4 EQU 52H FLEL5 EQU 53H FLEL6 EQU 54H BEFOR EQU 55H HH BIT 01H ;比较大 EE BIT 02H ;比较相等 FIL BIT 03H ;溢出标记 FLAG BIT 04H ;有无按键标记 ERR BIT 05H ;错误标记 YESY BIT 06H ; 有无操作符按键标记

NUM BIT 07H ;按键个数标记 YESN BIT 08H ;有无数字按键标记 ORG 0000H LJMP MAIN ORG 0003H LJMP INTERUPT MAIN: MOV IE,#01H ;初始化 MOV SP,#6FH LCALL CLRI SETB IT0 SETB EA DISPLAY: ;数码管显示函数 CJNE R3,#00H,TT1 MOV R3,#0AH TT1: CJNE R3,#0AH,STARTD CJNE R2,#00H,TT2 MOV R2,#0AH TT2: CJNE R2,#0AH,STARTD CJNE R1,#00H,STARTD MOV R1,#0AH STARTD: MOV A,R0 LCALL TRANS ;将所要显示的值转化为数码管对应的数据 MOV P2,A MOV P1,#10H LCALL DELAY10ms MOV A,R1 LCALL TRANS MOV P2,A MOV P1,#20H LCALL DELAY10ms MOV A,R2 LCALL TRANS MOV P2,A MOV P1,#40H LCALL DELAY10ms

相关主题
文本预览
相关文档 最新文档