文档库 最新最全的文档下载
当前位置:文档库 › 51单片机在12864上玩起来贪吃蛇

51单片机在12864上玩起来贪吃蛇

51单片机在12864上玩起来贪吃蛇
51单片机在12864上玩起来贪吃蛇

/*用你身边的51单片机玩起贪吃蛇,哈哈仅仅是玩玩就好。。大家注意管脚可能不同请根据实际情况改写。。。*/

//主程序

#include

#include

#define up 0x21

#define down 0x24

#define left 0x12

#define right 0x42

#define quit 0x81

unsigned char bdata snake_flag;

uchar xdata snake[256][2];

uchar idata snake_len;

uchar idata snake_food[2];

sbit gameover=snake_flag^3;

sbit food=snake_flag^2;

uint marker;

uchar no_counter;

void timer0_init(void);

void snake_init(void)

{

marker=0;

no_counter=0;

snake_len=3;

fill_point(31,30);

fill_point(32,30);

fill_point(33,30);

snake[0][0]=33;

snake[1][0]=32;

snake[2][0]=31;

snake[0][1]=30;

snake[1][1]=30;

snake[2][1]=30;

snake_flag=0x10;

line_horizon(0,63,0);

line_horizon(0,63,63);

line_vertical(0,0,127);

line_vertical(63,0,127);

timer0_init();

xprintf(64,0,"分数");

printf_number(64,2,0);

xprintf(64,4,"按退出键");

xprintf(64,6,"退出");

}

void snake_refresh()

{

uchar k;

for(k=snake_len;k>0;k--)

{

snake[k][0]=snake[k-1][0];

snake[k][1]=snake[k-1][1];

}

}

void snake_run(void)

{

uchar i;

snake_refresh();

switch(snake_flag>>4)

{

case(0x08):

if(snake[0][1]==1) gameover=1;

else snake[0][1]--;

break;

case(0x04):

if(snake[0][1]==62) gameover=1;

else snake[0][1]++;

break;

case(0x02):

if(snake[0][0]==1) gameover=1;

else snake[0][0]--;

break;

case(0x01):

if(snake[0][0]==62) gameover=1;

else snake[0][0]++;

break;

default:

break;

}

for(i=(snake_len);i>0;i--)

{

if((snake[0][0]==snake[i][0])&&(snake[0][1]==snake[i][1]))

{

gameover=1;

break;

}

}

if(!gameover)

{

if((snake[0][0]==snake_food[0])&&(snake[0][1]==snake_food[1]))

{

food=0;

snake_len++;

no_counter++;

marker=no_counter*100;

printf_number(64,2,marker);

}

else

{

clear_point(snake[snake_len][0],snake[snake_len][1]);

fill_point(snake[0][0],snake[0][1]);

}

}

if(no_counter>9)

gameover=1;

}

uchar getkey(void)

{

uchar col_code,row_code;

P1=0xf0;

if(P1!=0xf0)

{

delayms(5);

if(P1!=0xf0)

{

row_code=0xfe;

while(row_code&0x10)

{

P1=row_code;

if(P1!=row_code)

{

col_code=(P1&0xf0)|0x0f;

return((~row_code)|(~col_code));

}

else row_code=(row_code<<1)|0x01;

}

}

}

return(0);

}

bit compare(uchar x,uchar y)

{

uchar counter;

for (counter=0;counter

{

if((snake[counter][0]==x)&&(snake[counter][1]==y)) return(0);

}

return(1);

}

void set_food(void)

{

uchar i,j;

bit compare_flag;

i=TL0&0x3f;

j=TH0&0x3f;

if(i==0) i++;

if(i==0x4f) i--;

if(j==0x4f) j--;

if(j==0) j++;

do{

compare_flag=compare(i,j);

if(!compare_flag)

{

i++;

j++;

if(i>63) i=1;

if(j>63) j=1;

}

}

while(!compare_flag );

fill_point(i,j);

snake_food[0]=i;

snake_food[1]=j;

food=1;

}

void timer0(void) interrupt 1 using 3 {

TH0=0x00;

TL0=0x00;

TR0=1;

}

void timer0_init(void)

{

TMOD=0x01;

TH0=0x00;

TL0=0x00;

TR0=1;

ET0=1;

EA=1;

}

void delay()

{

unsigned int i;

for(i=0;i<15000;i++);

}

void longdelay(uchar i)

{

uchar x;

for(x=0;x

delay();

}

void snake_game(void)

{

uchar key_code;

cls();

xprintf(24,0,"贪吃蛇游戏");

xprintf(50,2,"ver 0.1");

xprintf(50,4,"by无业游民");

xprintf(16,6,"按任意键开始");

while (getkey()==0);

cls();

snake_init();

if(!food) set_food();

key_code=getkey();

switch(key_code)

{

case 0:

break;

case up:

if((snake_flag&0xf0)==0x40)

break;

snake_flag=(snake_flag&0x0f)|0x80;

break;

case down:

if((snake_flag&0xf0)==0x80)

break;

snake_flag=(snake_flag&0x0f)|0x40;

break;

case left:

if((snake_flag&0xf0)==0x10)

break;

snake_flag=(snake_flag&0x0f)|0x20;

break;

case right:

if((snake_flag&0xf0)==0x20)

break;

snake_flag=(snake_flag&0x0f)|0x10;

break;

case quit:

cls();

return;

default:

break;

}

snake_run();

delay();

if(gameover&&(no_counter!=10))

{

cls();

xprintf(24,3,"GAME OVER");

xprintf(0,5,"按任意键重新开始");

while(getkey()==0);

return;

}

if(gameover&&(no_counter==10))

cls();

xprintf(4,3,"Congratulation!");

xprintf(0,5,"按任意键重新开始");

while(getkey()==0);

return;

}

}

while(1);

}

void main(void)

{

lcm_init();

draw_graph(graph1);

longdelay(10);

while(1)

snake_game();

}

其他的

graphcode.h

unsigned char code graph1[]=

{

0x01,0x01,0x02,0x02,0x04,0x04,0x08,0x08,0xd0,0x30,0x30,0x30,0x50,0x60,0xdc,0xb2,0x3a,0xdc, 0x20,0xa0,0xa0,0xc0,0x0e,0x30,0x7e,0x00,0x40,0x80,0x00,0x00,0x00,0x00,0x60,0x80,0x80,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,0x00,0x40,0xa0,0x90,0x88,0xd4,0xe4,0x70,0x72,0xbc,0x78,0x38,0x38,0x3e,0x7c,0xf8,0xf8,0xf8, 0xf0,0xf0,0xf0,0xe0,0xc0,0xc0,0x40,0x20,0x00,0x00,0x00,0x00,0xfe,0xfa,0xfe,0xfe,0xfe,0xfe,0xfe, 0xfe,0xfe,0xfc,0xfe,0xfe,0x1e,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x 00,0x00,0x00,0x00,0x80,0x80,0x40,0x40,0x20,0x20,0x10,0x10,0x08,0x08,0x04,0x04,0x02,0x02,0 x01,

0x00,0x00,0x80,0x4e,0x31,0x21,0x21,0x21,0x27,0xf8,0x90,0xd4,0xf2,0xe8,0x47,0x41,0x41,0xd1, 0x23,0x1f,0x85,0x44,0x28,0x98,0x14,0x93,0x3c,0xb0,0xf1,0x7e,0xce,0xf7,0x63,0xc3,0xc3,0x27,0x 3f,0xfe,0xfe,0xfc,0xf0,0xc0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,0x00,0x00,0x0e,0x07,0xf1,0xfc,0xfe,0xff,0xff,0xfc,0xf8,0x98,0x98,0xe4,0xe7,0xff,0xdc,0xfc,0xcf,0x cf,0xff,0xbf,0xff,0xef,0x1e,0xf8,0x10,0x00,0x40,0x3f,0x8f,0x43,0x71,0x49,0x49,0x89,0x01,0x03,0x 0f,0xf3,0x00,0x00,0x88,0x80,0xea,0x40,0x20,0x20,0x10,0x10,0x08,0x08,0x04,0x04,0x02,0x02,0x 01,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

0xc0,0xc0,0xe3,0xd4,0x48,0x88,0x0a,0x05,0x3e,0xc1,0x45,0xd1,0xe1,0xff,0xf8,0xf0,0xf0,0xf8,0x7 7,0xd1,0x30,0x90,0x00,0xaa,0x00,0x88,0x00,0x21,0x8e,0x70,0x1f,0xfe,0xff,0xff,0xff,0x3f,0x3f,0x3 f,0x7f,0x9f,0xff,0x3f,0x20,0x20,0xc0,0xc0,0x80,0x80,0x80,0x80,0x80,0x40,0x40,0x40,0x40,0x40,0

x40,0xc0,0x00,0x03,0x0f,0x3f,0x7f,0x7f,0xff,0xbf,0x3f,0x1f,0x0f,0x0f,0x0f,0x8f,0x8f,0xcf,0xe3,0xf7, 0x79,0x1f,0x07,0x00,0x00,0x80,0x80,0x60,0xc0,0xa7,0x24,0x11,0x10,0x8c,0x8b,0x44,0x34,0x8e, 0x03,0xa9,0x01,0x88,0x00,0xaa,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

0xe2,0xd5,0xf7,0xfb,0x6f,0x7a,0x77,0x7c,0x7a,0xff,0x72,0x75,0x77,0x77,0x77,0x65,0xe3,0xea,0x c1,0xca,0x00,0x88,0x00,0xaa,0x00,0x88,0x00,0xa0,0x0f,0xb0,0x40,0x82,0x11,0x2b,0x4a,0x4a,0x7 2,0x0a,0x13,0x01,0x00,0x00,0x00,0x00,0x01,0x06,0x1e,0xfe,0xff,0xff,0xfe,0xff,0x7f,0x7f,0x7f,0x3f ,0x3f,0xff,0x20,0x20,0x40,0x40,0x81,0x81,0x03,0x83,0x9b,0x63,0x63,0x23,0x23,0x33,0x35,0x1d, 0x0c,0x84,0x84,0x42,0x22,0x71,0x29,0x46,0x81,0xca,0x40,0x28,0x21,0x39,0x45,0x82,0x82,0x82, 0x44,0x78,0x40,0x4a,0x40,0x88,0x00,0xca,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,

0x2f,0x16,0xfd,0x6d,0xfd,0xfa,0xea,0x62,0x63,0x6a,0xfd,0xfa,0x66,0x62,0x9a,0x9d,0x65,0x65,0x 1a,0x2d,0x00,0x88,0x00,0x2a,0x00,0x88,0x00,0x22,0x00,0x88,0x00,0x2a,0x01,0x8a,0x02,0x24,0 x04,0x88,0x08,0x10,0x10,0x10,0x20,0xa0,0xa0,0x60,0x40,0x20,0x21,0xa3,0xa5,0x64,0x64,0x24,0 x64,0x54,0x52,0xc9,0xa8,0xa4,0x64,0x22,0x22,0x31,0x11,0x11,0x12,0x1a,0x1c,0x1c,0x1c,0x1c,0x 12,0x32,0x21,0x60,0x40,0x40,0x80,0x80,0x80,0x80,0x00,0x03,0x04,0x04,0x3c,0xc4,0x82,0x83,0x 83,0x47,0xf8,0x08,0x08,0x08,0x18,0x27,0xc0,0x29,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x 00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0 x00,0x00,

0x08,0x08,0x0f,0x37,0x6f,0x7f,0x7f,0x5f,0x40,0x57,0x7b,0x7d,0x7e,0x7e,0x7f,0x7f,0x3e,0x0e,0x0 8,0x0a,0x00,0x08,0x08,0x08,0x08,0x08,0x08,0x0a,0x08,0x08,0x08,0x08,0x08,0x88,0x88,0x4a,0x 48,0x2c,0x2c,0x1a,0x1a,0x09,0x0d,0x0c,0x14,0x12,0x22,0x21,0x21,0x40,0x40,0x40,0x40,0x40,0x 40,0x20,0x20,0x1e,0x21,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x20,0x20,0x20,0 x10,0x08,0x0c,0x08,0x08,0x08,0x08,0x08,0x09,0x09,0x0b,0x0b,0x0d,0x0e,0x0a,0x0d,0x18,0x18, 0x28,0x28,0x49,0x4e,0x88,0x88,0x08,0x08,0x08,0x09,0x0a,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0 0,0x00,0x00,

0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80 ,0x80,0x40,0x40,0x20,0x20,0x10,0x10,0x08,0x08,0x04,0x04,0x02,0x02,0x01,0x01,0x00,0x00,0x0 0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x 00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0 x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x02,0x02,0x04,0x04,0x08,0x08,0x10,0x10,0x20 ,0x20,0x40,0x40,0x80,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0 0,0x00,0x00,0x00,

0x00,0x80,0x80,0x40,0x40,0x20,0x20,0x10,0x10,0x08,0x08,0x04,0x04,0x02,0x02,0x01,0x01,0x00 ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0 0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x 00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0 x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x02,0x02,0x04,0x04,0x08,0x08,0x10,0x10,0x20,0x20,0x4 0,0x40,0x80,0x80};

lcddriver.h

//用心看看

#include

#include

#include

#define uchar unsigned char

#define uint unsigned int

#define wrcmdl_add XBYTE[0x8001] #define wrcmdr_add XBYTE[0x8002] #define wrdatal_add XBYTE[0x8005] #define wrdatar_add XBYTE[0x8006] #define rddatal_add XBYTE[0x800d]

#define rddatar_add XBYTE[0x800e]

#define rdbusyl_add XBYTE[0x8009]

#define rdbusyr_add XBYTE[0x800a]

#define dispon 0x3F

#define disoff 0x3E

#define disfirst 0xc0

#define sety 0xb8

#define setx 0x40

#define lcmlimit 0x80

void delayms(uchar);

void wait_lcm(bit lr)

{

uchar xdata *rdbusy;

uchar x;

if(lr) rdbusy=&rdbusyr_add;

else rdbusy=&rdbusyl_add;

do{

x=*rdbusy;

}

while (x&0x80);

}

void wrcmd(bit lr,uchar cmd)

{

wait_lcm(lr);

if(lr) wrcmdr_add=cmd;

else wrcmdl_add=cmd;

}

void wrdata(bit lr,uchar lcm_data) {

wait_lcm(lr);

if(lr) wrdatar_add=lcm_data;

else wrdatal_add=lcm_data;

}

uchar rddata(bit lr)

{

uchar lcm_data;

wait_lcm(lr);

if(lr) lcm_data=rddatar_add;

else lcm_data=rddatal_add;

return(lcm_data);

}

bit locatexy(uchar col,uchar row) {

uchar x;

uchar y;

bit lr;

x=col&0xc0;

if(x==0x00) lr=0;

else lr=1;

x=(col&0x3f)|setx;

wait_lcm(lr);

wrcmd(lr,x);

y=(row&0x07)|sety;

wait_lcm(lr);

wrcmd(lr,y);

return(lr);

}

void cls(void)

{

uchar col;

uchar row;

for(row=0;row<8;row++)

{

col=0;

wrcmd(0,row|sety);

wrcmd(1,row|sety);

wrcmd(0,col|setx);

wrcmd(1,col|setx);

for(col=0;col<64;col++)

{

wrdata(0,0x00);

wrdata(1,0x00);

}

}

}

void delayms(uchar i)

{

uchar j;

while(i>0)

{

i--;

j=122;

while(j>0)

{

j--;

}

}

}

void lcm_init(void)

{

uchar cmd;

delayms(40);

cmd=disoff;

wrcmd(0,cmd);

wrcmd(1,cmd);

cmd=dispon;

wrcmd(0,cmd);

wrcmd(1,cmd);

cmd=disfirst;

wrcmd(0,cmd);

wrcmd(1,cmd);

cls();

rddata(0);

rddata(1);

}

void putedot (uchar col,uchar row,uchar order) {

bit lr;

uint x;

uchar j;

uchar baker_x,baker_y;

baker_x=col;

baker_y=row;

x=order*0x10;

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

{

lr=locatexy(col,row);

wrdata(lr,ezk[x]);

x++;

col++;

if(col>lcmlimit)

{

col=0;

row++;

row++;

}

}

row=baker_y+1;

col=baker_x;

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

{

lr=locatexy(col,row);

wrdata(lr,ezk[x]);

x++;

col++;

if(col>lcmlimit)

{

col=0;

row++;

row++;

}

}

}

void putcdot(uchar col,uchar row,uchar *order) {

uchar lr;

uchar baker_x,baker_y;

uint x=0;

uchar j;

baker_x=col;

baker_y=row;

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

{

lr=locatexy(col,row);

wrdata(lr,order[x]);

x++;

col++;

if(col>lcmlimit)

{

col=0;

row++;

row++;

}

}

col=baker_x;

row=baker_y+1;

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

{

lr=locatexy(col,row);

wrdata(lr,order[x]);

x++;

col++;

if(col>lcmlimit)

{

col=0;

row++;

row++;

}

}

}

void putestr(uchar col,uchar row,uchar *str,uchar no) {

uchar x;

uchar k;

uchar j;

x=0;

for(j=0;j

{

k=str[x]-0x20;

putedot(col,row,k);

col=col+8;

x++;

if(col>lcmlimit)

{

col=0;

row++;

row++;

}

}

}

/*void putcstr(col,row,uchar *str,uchar no) {

uchar x;

uchar j;

x=0;

for(j=0;j

{

putedot(col,row,str[x]);

col=col+16;

x++;

if(col>lcmlimit)

{

col=0;

row++;

row++;

}

}

}*/

void xprintf(uchar col,uchar row,uchar *str) {

uchar c1;

uchar c2;

uchar i;

while(*str!='\0')

{

c1=*str;

c2=*(str+1);

if(c1<0x80)

{

putedot(col,row,c1-0x20);

col=col+8;

str++;

}

else

{

for(i=0;i

{

if((GB_16[i].index[0]==c1)&&(GB_16[i].index[1])==c2)

break;

}

putcdot(col,row,GB_16[i].msk);

str++;

str++;

col+=16;

}

}

}

void printf_number(uchar col,uchar row,uint no)

{

uchar a[5];

uchar i,j,k,l;

i=no/1000;

j=no/100-i*10;

k=no/10-i*100-j*10;

l=no-i*1000-j*100-k*10;

a[0]=i+0x30;

a[1]=j+0x30;

a[2]=k+0x30;

a[3]=l+0x30;

a[4]='\0';

putestr(col,row,a,4);

}

void draw_graph(uchar *graph_ram)

{

//uchar i=0;

uchar row,col;

for(row=0;row<8;row++)

{

col=0;

wrcmd(0,sety|row);

wrcmd(0,setx|col);

wrcmd(1,sety|row);

wrcmd(1,setx|col);

for(col=0;col<64;col++)

{

wrdata(0,graph_ram[col+128*row]);

wrdata(1,graph_ram[col+64+128*row]);

}

}

}

void fill_point(uchar x,uchar y)

{

bit lr=0;

uchar lcd_data;

uchar y1;

y1=y;

y1=y>>3;

y1=y1&0x07;

if(x>63)

{

lr=1;

x=x-64;

}

wait_lcm(lr);

wrcmd(lr,setx|(x));

wrcmd(lr,sety|y1);

lcd_data=rddata(lr);

wrcmd(lr,setx|(x));

wrcmd(lr,sety|y1);

lcd_data=rddata(lr);

wrcmd(lr,setx|(x));

wrcmd(lr,sety|y1);

lcd_data=lcd_data|(0x01<<(y&0x07));

wrdata(lr,lcd_data);

}

void clear_point(uchar x,uchar y)

{

bit lr=0;

uchar lcd_data;

uchar y1;

y1=y;

y1=y>>3;

y1=y1&0x07;

if(x>64)

{

lr=1;

x=x-63;

}

wait_lcm(lr);

wrcmd(lr,setx|(x));

wrcmd(lr,sety|y1);

lcd_data=rddata(lr);

wrcmd(lr,setx|(x));

wrcmd(lr,sety|y1);

lcd_data=rddata(lr);

wrcmd(lr,setx|(x));

wrcmd(lr,sety|y1);

lcd_data=lcd_data&(~(0x01<<(y&0x07)));

wrdata(lr,lcd_data);

}

void line_horizon(uchar x1,uchar x2,uchar y) {

uchar counter;

for(counter=x1;counter

{

fill_point(counter,y);

}

}

void line_vertical(uchar x,uchar y1,uchar y2) {

uchar counter;

for(counter=y1;counter

{

fill_point(x,counter);

}

}

lcddriver.c

#include

#include

#include

#define uchar unsigned char

#define uint unsigned int

#define wrcmdl_add XBYTE[0x8001] #define wrcmdr_add XBYTE[0x8002] #define wrdatal_add XBYTE[0x8005] #define wrdatar_add XBYTE[0x8006] #define rddatal_add XBYTE[0x800d]

#define rddatar_add XBYTE[0x800e]

#define rdbusyl_add XBYTE[0x8009]

#define rdbusyr_add XBYTE[0x800a]

#define dispon 0x3F

#define disoff 0x3E

#define disfirst 0xc0

#define sety 0xb8

#define setx 0x40

#define lcmlimit 0x80

void wait_lcm(bit lr)

{

uchar xdata *rdbusy;

uchar x;

if(lr) rdbusy=&rdbusyr_add;

else rdbusy=&rdbusyl_add;

do{

x=*rdbusy;

}

while (x&0x80);

}

void wrcmd(bit lr,uchar cmd)

{

wait_lcm(lr);

if(lr) wrcmdr_add=cmd;

else wrcmdl_add=cmd;

}

void wrdata(bit lr,uchar lcm_data) {

wait_lcm(lr);

if(lr) wrdatar_add=lcm_data;

else wrdatal_add=lcm_data;

}

uchar rddata(bit lr)

{

uchar lcm_data;

wait_lcm(lr);

if(lr) lcm_data=rddatar_add;

else lcm_data=rddatal_add;

wait_lcm(lr);

if(lr) lcm_data=rddatar_add;

else lcm_data=rddatal_add;

return(lcm_data);

}

bit locatexy(uchar col,uchar row) {

uchar x;

uchar y;

bit lr;

x=col&0xc0;

if(x==0x00) lr=0;

else lr=1;

x=(col&0x3f)|setx;

wait_lcm(lr);

wrcmd(lr,x);

y=(row&0x07)|sety;

wait_lcm(lr);

wrcmd(lr,y);

return(lr);

}

void cls(void)

{

uchar col;

uchar row;

for(row=0;row<8;row++)

{

wrcmd(0,row|sety);

wrcmd(1,row|sety);

wrcmd(0,col|setx);

wrcmd(1,col|setx);

for(col=0;col<64;col++)

{

wrdata(0,0x00);

wrdata(1,0x00);

}

}

}

void delayms(uchar i)

{

uchar j;

while(i>0)

{

i--;

j=122;

while(j>0)

{

j--;

}

}

}

void lcm_init(void)

{

uchar cmd;

delayms(40);

cmd=disoff;

wrcmd(0,cmd);

wrcmd(1,cmd);

cmd=dispon;

wrcmd(0,cmd);

wrcmd(1,cmd);

cmd=disfirst;

wrcmd(0,cmd);

wrcmd(1,cmd);

cls();

}

void putedot (col,row,order) {

bit lr;

uint x;

uchar j;

uchar baker_x,baker_y;

baker_x=col;

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单片机常用子程序汇总

目录 1、通过串口连续发送n个字节的数据 /*************************************************************** 模块功能:通过串口连续发送n个字节的数据 参数说明: s:待发送数据的首地址 n:要发送数据的字节数 ***************************************************************/ void SendD(unsigned char *s,unsigned char n) { unsigned char unX; if(n>0) { ES=0; // 关闭串口中断 for(unX=0;unX #include #define Nop() _nop_() //空指令

sbit SDA=P1^3; sbit SCL=P1^2; bit ACK; void Start_I2c() { SDA=1; Nop(); SCL=1; Nop(); Nop(); Nop(); Nop(); Nop(); SDA=0; Nop(); Nop(); Nop(); Nop(); Nop(); SCL=0; //钳住I2C总线,准备发送或接受数据Nop(); Nop(); } (2)结束总线函数 /*************************************************************** 模块功能:发送I2C总线结束条件 ***************************************************************/ void Stop_I2c() { SDA=0; Nop(); SCL=1; Nop(); Nop(); Nop(); Nop(); Nop(); SDA=1; Nop(); Nop(); Nop(); Nop();

基于51单片机的秒表设计

江西理工大学应用科学学院信息工程系单片机原理与应用课程设计报告 设计题目:基于51单片机的秒表设计 专业:电子信息工程 班级:电信121 学号: 08060312109 参与人员:贺佳、周代元、周昶旭、张浥中 指导老师:王苏敏 完成日期: 2015年1月20日

目录 1 设计任务和性能指标 (1) 1.1 课题内容 ....................... 错误!未定义书签。 1.2 课题要求 ........................ 错误!未定义书签。 2 设计方案............................. 错误!未定义书签。 2.1 需求分析 (3) 2.2 方案论证 (3) 3系统软件设计 (5) 4.1 系统软件流程图................... 错误!未定义书签。 4.2 实验程序清单 .................... 错误!未定义书签。 4 系统硬件设计 (10) 5.1 调试步骤 (11) 5.2 性能分析 ........................ 错误!未定义书签。5系统硬件设计.......................... 错误!未定义书签。参考文献.. (14)

1 设计任务和性能指标 1 课题内容要求及目的 1.1课题内容 用AT89C51设计一个秒表,该秒表课可显示0.0~99.9秒的时间,进行相应的单片机硬件电路的设计并进行软件编程利用单片机定时 器/计数器中断设计秒表,从而实现秒、十分之一秒的计时。综合运用所学的《单片机原理与应用》理论知识,通过实践加强对所学知识的理解,具备设计单片机应用系统的能力。通过本次系统设计加深对单片机掌握定时器、外部中断的设置和编程原理的全面认识复习和掌握。本系统利用单片机的定时器/计数器定时和记数的原理,通过采用proteus仿真软件来模拟实现。模拟利用AT89C51单片机、LED 数码管以及控件来控制秒表的计数以及计位!其中有三位数码管用来显示数据,显示秒(两位)和十分之一秒,十分之一秒的数码管计数从0~9,满十进一后显示秒的数码管的数字加一,并且十分之一秒显示清零重新从零计数。计秒数码管采用三位的数码管,当计数超过范围是所有数码管全部清零重新计数。 1.2课题要求 本课题是基于单片机的秒表系统设计,它的具体要求有以下几点: (1)用单片机AT89C51实现; (2)以0.1秒为最小单位进行显示; (3)秒表量程为0.0-99.9秒,用 LED显示;

基于单片机的贪吃蛇设计

基于单片机的贪吃蛇设计 本篇论文主要是设计并且着手致力于实现一种基于51单片机的经典的贪吃蛇游戏,主要是研究该游戏的硬件电路和软件编程的设计,同时也简单介绍了应该如何使用Proteus软件进行仿真。借助仿真软件进行实验测试,可以基本实现游戏一些简单的基本功能。直至现在,大家都知道且明白了51系列的单片机技术相对而言比较成熟,功能也十分强大,应用较为广泛。将单片机作为本设计的控制核心,能够使硬件电路大大地简化,用软件来编程控制单片机,来加以实现硬件电路的功能,可以降低能耗,同时也节约成本。选用C语言编程,比较方便灵活,极大地加快了软件开发的速度,使开发周期缩短了,同时方便移植。本篇论文比较详细的的介绍了各种硬件的基本特性,贪吃蛇游戏实现的基本功能与详细设计,软件设计的具体说明,每一个模块的细节要求,还有一些功能模块的程序流程图和关键部分代码的详细讲解等。 关键词:Proteus软件仿真;51单片机;Keil;贪吃蛇;LED点阵屏

目录 1 绪论 (1) 1.1研究背景及意义 (1) 1.2单片机发展状况 (1) 1.3 LED发展状况 (2) 1.4 设计特点 (3) 2 系统总体设计 (3) 2.1设计要求 (3) 2.2 系统设计方案 (4) 2.2.1硬件设计 (4) 2.2.2软件设计 (4) 3系统硬件设计 (4) 3.18*8LED点阵的原理说明 (4) 3.2 LED阵列驱动电路 (4) 4系统软件设计 (5) 4.1系统主要模块介绍 (5) 4.1.1 主函数模块 (6) 4.1.2 按键模块 (6) 4.1.3 蛇运动控制模块 (6) 4.2主程序工作流程 (6) 4.3 游戏设计思想 (7) 4.4 LED点阵初始化 (8) 4.5 贪吃蛇的移动 (9) 4.6 食物的随机出现 (9) 5联调与测试 (9)

基于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单片机汇编程序范例

16位二进制数转换成BCD码的的快速算法-51单片机2010-02-18 00:43在做而论道上篇博文中,回答了一个16位二进制数转换成BCD码的问题,给出了一个网上广泛流传的经典转换程序。 程序可见: http: 32.html中的HEX2BCD子程序。 .说它经典,不仅是因为它已经流传已久,重要的是它的编程思路十分清晰,十分易于延伸推广。做而论道曾经利用它的思路,很容易的编写出了48位二进制数变换成16位BCD码的程序。 但是这个程序有个明显的缺点,就是执行时间太长,转换16位二进制数,就必须循环16遍,转换48位二进制数,就必须循环48遍。 上述的HEX2BCD子程序,虽然长度仅仅为26字节,执行时间却要用331个机器周期。.单片机系统多半是用于各种类型的控制场合,很多时候都是需要“争分夺秒”的,在低功耗系统设计中,也必须考虑因为运算时间长而增加系统耗电量的问题。 为了提高整机运行的速度,在多年前,做而论道就另外编写了一个转换程序,程序的长度为81字节,执行时间是81个机器周期,(这两个数字怎么这么巧!)执行时间仅仅是经典程序的!.近来,在网上发现了一个链接: ,也对这个经典转换程序进行了改进,话是说了不少,只是没有实质性的东西。这篇文章提到的程序,一直也没有找到,也难辩真假。 这篇文章好像是选自某个著名杂志,但是在术语的使用上,有着明显的漏洞,不像是专业人员的手笔。比如说文中提到的:

“使用51条指令代码,但执行这段程序却要耗费312个指令周期”,就是败笔。51条指令代码,真不知道说的是什么,指令周期是因各种机型和指令而异的,也不能表示确切的时间。 .下面说说做而论道的编程思路。;----------------------------------------------------------------------- ;已知16位二进制整数n以b15~b0表示,取值范围为0~65535。 ;那么可以写成: ; n = [b15 ~ b0] ;把16位数分解成高8位、低8位来写,也是常见的形式: ; n = [b15~b8] * 256 + [b7~b0] ;那么,写成下列形式,也就可以理解了: ; n = [b15~b12] * 4096 + [b11~b0] ;式中高4位[b15~b12]取值范围为0~15,代表了4096的个数; ;上式可以变形为: ; n = [b15~b12] * 4000 + {[b15~b12] * (100 - 4) + [b11~b0]} ;用x代表[b15~b12],有: ; n =x * 4000 + {x * (100 - 4) + [b11~b0]} ;即: ; n =4*x (千位) + x (百位) + [b11~b0] - 4*x ;写到这里,就可以看出一点BCD码变换的意思来了。 ;;上式中后面的位:

51单片机实验 秒表设计

实验报告 一、实验名称 10秒计时的秒表设计 二、实验内容 精确到0.1秒的秒表 三、相关模块 led数码管、usb、独立键盘 四、实验代码 #include "reg52.h" typedef unsigned int u16; //对数据类型进行声明定义 typedef unsigned char u8; sbit LSA=P2^2; sbit LSB=P2^3; sbit LSC=P2^4; sbit k1=P3^1; sbit k2=P3^0; sbit k3=P3^2; sbit k4=P3^3; u8 code smgduan[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; u16 s,sec; unsigned int i; unsigned int j; unsigned int a,b,c,d; u8 mb[2]; void Timer0Init() { TMOD|=0X01;//选择为定时器0模式,工作方式1,仅用TR0打开启动。 TH0=0XFC; //给定时器赋初值,定时1ms TL0=0X18; TR0=0;//打开定时器 } void delay(u16 n) { while(n--); } void DigDisplay1(u16 i)

{ switch(i) { case(0): LSA=0;LSB=0;LSC=0; break; case(1): LSA=1;LSB=0;LSC=0; break; case(2): LSA=0;LSB=1;LSC=0; break; case(3): LSA=1;LSB=1;LSC=0; break; case(4): LSA=0;LSB=0;LSC=1; break; case(5): LSA=1;LSB=0;LSC=1; break; case(6): LSA=0;LSB=1;LSC=1; break; case(7): LSA=1;LSB=1;LSC=1; break; } if (i==1) { P0=smgduan[mb[i]]+0x80;//发送段码 } else { P0=smgduan[mb[i]]; } delay(1); //间隔一段时间扫描 P0=0x00;//消隐 } void DigDisplay2(u16 i) { i=i+3; switch(i) { case(0): LSA=0;LSB=0;LSC=0; break; case(1): LSA=1;LSB=0;LSC=0; break; case(2): LSA=0;LSB=1;LSC=0; break; case(3): LSA=1;LSB=1;LSC=0; break;

51单片机中断系统详解

的定时器中断后便认为是1s,这样便可精确控制定时时间啦。要计50000个数时,TH0和TL0中应该装入的总数是65536-50000=15536.,把15536对256求模:15536/256=60装入TH0中,把15536对256求余:15536/256=176装入TL0中。 以上就是定时器初值的计算法,总结后得出如下结论:当用定时器的方式1时,设机器周期为T CY,定时器产生一次中断的时间为t,那么需要计数的个数为N=t/T CY ,装入THX和TLX中的数分别为: THX=(65536-N)/256 , TLX=(65536-N)%256 中断服务程序的写法 void 函数名()interrupt 中断号using 工作组 { 中断服务程序内容 } 在写单片机的定时器程序时,在程序开始处需要对定时器及中断寄存器做初始化设置,通常定时器初始化过程如下: (1)对TMOD赋值,以确定T0和 T1的工作方式。 (2)计算初值,并将初值写入TH0、TL0或TH1、TL1。 (3)中断方式时,则对IE赋值,开放中断。 (4)使TR0和TR1置位,启动定时器/计数器定时或计数。 例:利用定时器0工作方式1,实现一个发光管以1s亮灭闪烁。 程序代码如下: #include #define uchar unsigned char #define uint unsigned int sbit led1=P1^0; uchar num; void main() { TMOD=0x01; //设置定时器0位工作模式1(M1,M0位0,1) TH0=(65536-45872)/256; //装初值11.0592M晶振定时50ms数为45872 TL0=(65536-45872)%256; EA=1; //开总中断 ET0=1; //开定时器0中断 TR0=1; //启动定时器0 while(1) { if(num==20) //如果到了20次,说明1秒时间 { led1=~led1; //让发光管状态取反 num=0; } } } void T0_time()interrupt 1

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单片机实用子程序(汇编)

《MCS-51单片机实用子程序库(96年版)》 周航慈 目前已有若干版本的子程序库公开发表,它们各有特色。笔者在1988年也编制了两个子程序库(定点子程序库和浮点子程序库),并在相容性、透明性、容错性和算法优化方 面作了一些工作。本程序库中的开平方算法为笔者研究的快速逼近算法,它能达到牛顿迭代法同样的精度,而速度加快二十倍左右,超过双字节定点除法的速度。经过八年来全国广大用户的实际使用,反馈了不少信息,陆续扩充了一些新的子程序,纠正了一些隐含错误,成为现在这个最新版本。 本子程序库对《单片机应用程序设计技术》一书附录中的子程序库作了重大修订:(1)按当前流行的以 IBM PC 为主机的开发系统对汇编语言的规定,将原子程序库的标号和位地址进行了调整,读者不必再进行修改,便可直接使用。 (2)对浮点运算子程序库进行了进一步的测试和优化,对十进制浮点数和二进制浮点数的相互转换子程序进行了彻底改写,提高了运算精度和可靠性。 (3)新增添了若干个浮点子程序(传送、比较、清零、判零等),使编写数据处理 程序的工作变得更简单直观。 在使用说明中开列了最主要的几项:标号、入口条件、出口信息、影响资源、堆栈 需求,各项目的意义请参阅《单片机应用程序设计技术》第六章 6.3.7 节的内容。程序 清单中开列了四个栏目:标号、指令、操作数、注释。为方便读者理解,注释尽力详细。 子程序库的使用方法如下: 1.将子程序库全部内容链接在应用程序之后,统一编译即可。优点是简单方便,缺点是程序太长,大量无关子程序也包含在其中。 2.仅将子程序库中的有关部分内容链接在应用程序之后,统一编译即可。有些子程序需要调用一些低级子程序,这些低级子程序也应该包含在内。优点是程序紧凑,缺点是需要对子程序库进行仔细删节。 (一)MCS-51定点运算子程序库及其使用说明 定点运算子程序库文件名为DQ51.ASM,为便于使用,先将有关约定说明如下: 1.多字节定点操作数:用[R0]或[R1]来表示存放在由R0或R1指示的连续单元中的数据。地址小的单元存放数据的高字节。例如:[R0]=123456H,若(R0)=30H,则(30H)=12H,(31H)=34H,(32H)=56H。 2.运算精度:单次定点运算精度为结果最低位的当量值。 3.工作区:数据工作区固定在PSW、A、B、R2~R7,用户只要不在工作区中存放无 关的或非消耗性的信息,程序就具有较好的透明性。

基于51单片机的跑表,秒表程序c语言程序

基于51单片机的跑表,秒表程序c语言程序#include #define uchar unsigned char #define uint unsigned int uchar table[]=" 00:00:00:00 "; bit flag=0; sbit en=P2^0; sbit rs=P2^1; sbit s1=P1^0; sbit s2=P1^1; sbit bb=P1^2; uchar shi,fen,miao,biao,tt,num1,aa; void delay(uint z) { uint i,j; for(i=z;i>0;i--) for(j=110;j>0;j--); } void write_com(uchar com) { rs=0; P0=com;

delay(10); en=1; delay(10); en=0; } void write_date(uchar date) { rs=1; P0=date; delay(10); en=1; delay(10); en=0; } void display(uchar com1,uchar date1) { uchar aa,bb; aa=date1/10; bb=date1%10; write_com(0x80+com1); write_date(0x30+aa);

write_date(0x30+bb); } void init() { TMOD=0x01; ET0=1; TR0=0; EA=1; TH0=(65536-10000)/256; TL0=(65536-10000)%256; en=0; write_com(0x38); write_com(0x0c); write_com(0x06); write_com(0x01); write_com(0x80+0x40); for(num1=0;num1<17;num1++) { write_date(table[num1]); delay(5); }

基于51单片机与点阵的贪食蛇游戏机开发

基于51单片机与8*8点阵的贪吃蛇游戏机开发

目录

一、硬件设计 1、8*8LED点阵的原理说明 本设计采用的点阵显示模块是ARK-SZ411288K,其原理 结构图如图1所示。ARK-SZ411288K显示模块是8*8点阵的 显示模块,从图1中可以看出,8*8点阵共需要64个发光二 极管组成,且每个发光二极管是放置在行线和列线的交叉点 上,当对应的某一列置1电平,某一行置0电平,则相应的图18*8LED点阵的原理图二极管就亮。ARK-SZ411288K可与CPU直接连接,根据引脚说明,将其各个引脚与相应的I/O 口连接。 2、LED阵列驱动电路 正向点亮一颗LED,至少也得10~20毫安,若电流不够大,则LED不够亮。而不管是8051的输入/输出口,还是TTL、CMOS的输出端,其高态输出电流都不是很高,不过1~2毫安而已,因此,很难直接高态驱动LED。这时候就需要额外的驱动电路,本设计采用的是74HC595,用74HC595芯片驱动LED有以下特点:速度较快,功耗较小,LED的数目多少随意,既可以控制共阴极的LED显示器,也可以控制共阳极的LED显示器,可以软件控制LED的亮度,还可以在必要的时候关断显示 (数据保留),以减小功耗,并可随时唤醒显示。用它设计的电路,不仅软硬件设计简单,而且功耗低,驱动能力强,占用的I/O口线较少,是一种造价低廉,应用灵活的设计方案。

图274HC595管脚图 74HC595内含8位串入、串/并出移位寄存器和8位三态输出锁存器。寄存器和锁存器分别有各自的时钟输入(SCLK和SLCK),都是上升沿有效。当SCLK从低到高电平跳变时,串行输入数据(SDA)移入寄存器;当SLCK从低到高电平跳变时,寄存器的数据置入锁存器。清除端(CLR)的低电平只对寄存器复位(QS为低电平),而对锁存器无影响。当输出允许控制(EN)为高电平时, 并行输出(Q0~Q7)为高阻态,而串行输出(QS)不受影响。74HC595最多需要5根控制线,即SDA、SCLK、SLCK、CLR和EN。其中CLR可以直接接到高电平,用软件来实现寄存器清零;如果不需要软件改变亮度,EN可以直接接到低电平,而用硬件来改变亮度。把其余三根线和单片机的I/O口相接,即可实现对LED的控制。 数据SDA口送入74HC595,在每个SCLK的上升沿,SDA口上的数据移入寄存器,在SCLK 的第9个上升沿,数据开始从QS移出。如果把第一个74HC595的QS和第二个74HC595的SDA 相接,数据即移入第二个74HC595中,照此一个一个接下去,可接任意多个。数据全部送完后,给SLCK一个上升沿,寄存器中的数据即置入锁存器。此时如果EN为低电平,数据即从并口Q0~Q7输出,把Q0~Q7与LED的8段相接,LED就可以实现显示了。要想软件改变LED的亮度,只需改变EN的占空比就行了[1]。 二、软件设计 1、主程序工作流程

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所示:

基于单片机的秒表设计单片机课程设计

基于单片机的秒表设计单片机课程设计

单片机课程设计 项目名称基于单片机的秒表设计 专业班级通信102班 学生姓名青瓜 指导教师… 2012年11 月20日

摘要 本课程设计的数字电子秒表系统采用AT89C51单片机为中心器件,利用其定时器/计数器定时和记数的原理,结合显示电路、LED数码管以及外部中断电路来设计计时器。将软、硬件有机地结合起来,使得系统能够实现五位LED显示,显示时间为0~99.99秒,计时精度为0.01秒,能精确地进行计时,并可以随时暂停和开始。软件系统采用C语言编写,包括显示程序,定时中断服务,外部中断服务程序,延时程序等,硬件系统利用PROTEUS强大的功能来实现,简单且易于观察,在仿真中就可以观察到系统实际的工作状态。 关键词:AT89C51单片机;数字秒表;数码管

Abstract This course is designed digital electronic stopwatch system uses the AT89C51 microcontroller devices, the use of timer / counter timing and counting principle, combined with the display circuit LED digital tube as well as the external interrupt circuit designed timer. The hardware and software combine to enable the system to achieve five LED display, the display time of 99.99 seconds, the timing accuracy of 0.01 seconds, the correct timing, and the right to suspend and start. Software system using C language, including the display program, the timer interrupt service external interrupt service routine, delay procedures, hardware system to implement the use of the PROTEUS powerful functionality, simple cut easily observed in the simulation to the actual work can be observed status. Keywords: AT89C51 Microcontroller; Digital stopwatch; Digital tubes

基于单片机的微型游戏机—贪吃的蛇

北京理工大学珠海学院毕业论文 基于单片机的微型游戏机—贪吃的蛇 摘要 单片微型机简称单片机,它是在一片芯片上集成了中央处理部件,存储器、定时器/计数器和各种输入输出设备等接口部件。单片机是微机发展的一个重要的分支,自问世以来,性能不断地改善和提高,加之单片机具有集成度高、功能强、速度快、体积小、功耗小、使用方便、性能可靠、价格便宜等优点,故在工业控制、数据采集和处理、通信系统、家用电器等领域的应用日益广泛。国内虽然起步较晚,但单片机的潜力越来越被人们所重视,尤其在工业控制、自动化仪器仪表、计算机系统接口、智能化外设等应用领域发展很快。它的应用对于产品升级换代、机电一体化都具有重要的意义,在工业生产中,电流、电压、温度、压力、流量、流速和开关量都是常用的主要被控参数,被用于各种不同产品的生产。在通信行业更为广泛利用,手机从只能基本通话,到现在一台手机拥有各种不同的功能,单片机得到了广泛的应用。手机可以听音乐,听收音机,玩游戏,照相片等等,比较流行的手机游戏贪吃蛇就能用单片机实现。 关键词:51单片机贪吃蛇游戏

Based on single chip micro-game - greedy snake ABSTRACT Single-chip microprocessor referred to as microcontrollers, which is integrated on a chip, a central processing unit, memory, timer / counters and a variety of input and output devices such as Interface Unit. SCM is a microprocessor development, an important branch, since its inception, performance, continuous improvement and increase, coupled with microcontroller with an integrated high, strong function, high speed, small size, power consumption, easy to use, reliable, cheap, etc. advantages, so in the industrial control, data acquisition and processing, communication systems, home appliances and other fields increasingly wide range of applications. Although the domestic late start, but the potential of SCM has been growing attention, especially in industrial control, automation instruments and meters, computer system interface, intelligent peripherals and other applications developed rapidly. Its application for the upgrading of products, mechanical and electrical integration, have important significance in industrial production, current, voltage, temperature, pressure, flow, flow rate and switching capacity are commonly used parameters of the main accused, was used for a variety production of different products. More extensive use of the communications industry, cell phone calls from can only be basic to the present, mobile phones have a variety of functions, single-chip has been widely used. Phone can listen to music, listening to the radio, play games, according to photos, etc., the more popular cell phone game Snake will be able to use SCM. Keyword:51singlechip snake game

51单片机浮点运算子程序库

51单片机浮点运算子程序库 时间:2007-11-14 来源: 作者: 点击:4020 字体大小:【大中小】 1: FSDT 功能:浮点数格式化 2: FADD 功能:浮点数加法 3: FSUB 功能:浮点数减法 4: FMUL 功能:浮点数乘法 5: FDIV 功能:浮点数除法 6: FCLR 功能:浮点数清零 7: FZER 功能:浮点数判零 8: FMOV 功能:浮点数传送 9: FPUS 功能:浮点数压栈 10: FPOP 功能:浮点数出栈 11: FCMP 功能:浮点数代数值比较不影响待比较操作数 12: FABS 功能:浮点绝对值函数 13: FSGN 功能:浮点符号函数 14: FINT 功能:浮点取整函数 15: FRCP 功能:浮点倒数函数 16: FSQU 功能:浮点数平方 17: FSQR 功能:浮点数开平方快速逼近算法 18: FPLN 功能:浮点数多项式计算 19: FLOG 功能:以10为底的浮点对数函数 20: FLN 功能:以e为底的浮点对数函数 21: FE10 功能:以10为底的浮点指数函数 22: FEXP 功能:以e为底的浮点指数函数 23: FE2 功能:以2为底的浮点指数函数 24: DTOF 功能:双字节十六进制定点数转换成格式化浮点数 25: FTOD 功能:格式化浮点数转换成双字节定点数 26: BTOF 功能:浮点BCD码转换成格式化浮点数 27: FTOB 功能:格式化浮点数转换成浮点BCD码 28: FCOS 功能:浮点余弦函数 29: FSIN 功能:浮点正弦函数 30: FATN 功能:浮点反正切函数 31: RTOD 功能:浮点弧度数转换成浮点度数 32: DTOR 功能:浮点度数转换成浮点弧度数 为便于读者使用本程序库,先将有关约定说明如下: 1.双字节定点操作数:用[R0]或[R1]来表示存放在由R0或R1指示的连续单元中的数据,地址小的单元存放高字节?如果[R0]=1234H,若(R0)=30H,则(30H)=12H,(31H)=34H? 2.二进制浮点操作数:用三个字节表示,第一个字节的最高位为数符,其余七位为阶码(补码形式),第二字节为尾数的高字节,第三字节为尾数的低字节,尾数用双字节纯小数(原码)来表示?当尾数的最高位为1时,便称为规格化浮点数,简称操作数?在程序说明中,也用[R0]或[R1]来表示R0或R1指示的浮点操作数,例如:当[R0]=-6.000时,则二进制浮点数表示为83C000H?若(R0)=30H,则 (30H)=83H,(31H)=0C0H,(32H)=00H? 3.十进制浮点操作数:用三个字节表示,第一个字节的最高位为数符,其余七位为阶码(二进制补码形式),第二字节为尾数的高字节,第三字节

基于51单片机秒表的程序设计[1]

基于51单片机秒表的程序设计 1.设计目的: (1)利用单片机定时器中断和定时器计数方式实现秒、分定时。 (2)通过LED显示程序的调整,熟悉8155与8051,8155与LED的接口技术,熟悉LED动态显示的控制过程。 (3)通过键盘程序的调整,熟悉8155与矩阵式键盘的接口技术,熟悉键盘扫描原理。 (4)通过阅读和调试简易秒表整体程序,学会如何编制含LED动态显示、键盘扫描和定时器中断等多种功能的综合程序,初步体会大型程序的编制和调试技巧。 2.设计步骤与要求 (1)要求:以8位LED右边2位显示秒,左边6位显示0,实现秒表计时显示。以4×4矩阵键盘的KE0、KE1、KE2等3键分别实现启动、停止、清零等功能。 (2)方法:用单片机定时器T0中断方式,实现1秒定时;利用单片机定时器1方式3计数,实现60秒计数。用动态显示方式实现秒表计时显示,用键盘扫描方式取得KE0、KE1、KE2的键值,用键盘处理程序实现秒表的启动、停止、清零等功能。 (3)软件设计:软件整体设计思路是以键盘扫描和键盘处理作为主程序,LED动态显示作为子程序。二者间的联系是:主程序查询有无按键,无按键时,调用二次LED动态显示子程序(约延时8ms)后再回到按键查询状态,不断循环;有按键时,LED动态显示子程序作为按键防抖延时被连续调用二次(约延时16ms),待按键处理程序执行完后,再回到按键查询状态,同时兼顾了按键扫描取值的准确性和LED动态显示的稳定性。秒定时采用定时器T0中断方式进行,60秒计数由定时器1采用方式3完成,中断及计数的开启与关闭受控于按键处理程序。由上述设计思路可设计出软件流程图如图1.1所示。 (5)程序编制:编程时置KE0键为“启动”,置KE1键为“停止”,置KE2键为“清零”,因按键较少,在处理按键值时未采用散转指令“JMP”,而是采用条件转移指令“CJNE”,每条指令后紧跟着一条无条件跳转指令“AJMP”,转至相应的按键处理程序,如不是上述3个按键值则

相关文档
相关文档 最新文档