步遥情感网
您的当前位置:首页单片机程序设计报告

单片机程序设计报告

来源:步遥情感网
一、整屏移动

LCD1602: 原理图:

程序:

#include//头文件 #define uchar unsigned char//宏定义 #define uint unsigned int uchar i;

uchar code table1[]=\"LCD1602 test 0k!\";//定义数组 uchar code table2[]=\"MY QQ:413830262\"; sbit rw=P2^1;//位定义 sbit rs=P2^0;

sbit e=P2^2; uchar num;

void delay(uint z)//延时 { }

void write_com(uchar com)//写指令函数 { }

void write_data(uchar dat)//写数据函数 { rs=0; rw=0; e=0; P0=com; delay(1); e=1; delay(1); e=0; uint x,y; for(x=z;x>0;x--)

for(y=110;y>0;y--);

}

rs=1; rw=0; e=0; P0=dat; delay(1); e=1; delay(1); e=0;

void init()//1602初始化 {

delay(15); write_com(0x38); delay(5); write_com(0x38); delay(5); write_com(0x38); delay(5); write_com(0x38); write_com(0x08); write_com(0x06); write_com(0x01);

}

write_com(0x0c);

void main()//主函数 {

write_com(0x80+0x40+0x10);//写地址 for(num=0;num<16;num++) { }

for(i=0;i<32;i++) {

write_com(0x1c);//整屏右移 delay(200);

write_data(table2[num]);//送数据 delay(20); init(); //初始化

write_com(0x80+0x10);//写地址 for(num=0;num<16;num++) { }

write_data(table1[num]);//送数据 delay(20);

}

} delay(200);

二、秒表

原理图:

程序流程图:

1、 主程序流程图 2、 加一子程序流程图

程序开始 R1=R1+1 程序初始化 开各中断 R1=?#0ahP1.0=?1 R1=#00H 关定时器0,1 调用显示子程序 R2=R2+1 R2=?#0ah P1.0=?0 R2=#00H 开定时器0,1 14H=R1 13H=R2

程序:

#include #define uchar unsigned char #define uint unsigned int uchar bai,shi,ge,a; uint num; uchar flag; uchar

code

table1[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//数码

管段选

uchar code table2[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};//数码管位选 sbit k1 = P1^0; sbit k2 = P1^1; sbit k3 = P1^2; void init(); void delay(uint x); void main() { init(); while(1) { if(k1==0) {

flag=0;

TR0=1; }

else if(k2==0) { TR0=0;

} //K1按下,定时器启动

//K2按下 ,暂停

else if(k3==0) {

flag=1; //标志位直一

} if(flag!=1) { P2=0; P0=table1[bai]; P2=table2[0]; delay(5); P2=0; P0=table1[shi]; P2=table2[1]; delay(5);

P2=0;

P0=table1[ge]; P2=table2[2]; delay(5);

} else { init();

}

bai=0; shi=0; ge=0;

}

}

void init() //初始化各变量及寄存器 { a=0; num=0; P0=table1[0]; P2=0x07; TMOD=0x01;

TH0=(65535-10000)/256; TL0=(65535-10000)%256; EA=1; ET0=1; }

void delay(uint x) //延时

{ uchar y; for(;x>0;x--) for(y=110;y>0;y--); }

void timer0()interrupt 1 //定时器中断函数 {

TH0=(65535-10000)/256; TL0=(65535-10000)%256; a++; if(a==1) {

a=0; num++; if(num==1000) num=0; bai=num/100; shi=num%100/10; ge=num%10;

} }

三、按键显示

原理图:

程序流程图:

程序:

#include #define uchar unsigned char #define uint unsigned int uchar num,shi,ge; uchar

code table1[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; uchar code table2[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80}; void delay_50us(uint t) { uchar j;

for(;t>0;t--) }

void main() {

uchar keyl,keyh,key; P2=0; while(1) { P1=0xf0; keyl=P1; keyl=keyl&0xf0; if(keyl!=0xf0) { delay_50us(100) ; if(keyl!=0xf0) { keyl=P1&0xf0; keyl=keyl|0x0f;

P1=keyl; keyh=P1; keyh=keyh&0x0f; keyl=keyl&0xf0; for(j=19;j>0;j--) ;

key=keyl+keyh;

} }

switch(key)

{ case 0xee:num=1;break; case 0xde:num=2 ;break; case 0xbe:num=3 ;break; case 0x7e:num=4 ;break; case 0xed:num=5 ;break; case 0xdd:num=6 ;break; case 0xbd:num=7 ;break; case 0x7d:num=8 ;break; case 0xeb:num=9 ;break; case 0xdb:num=10 ;break; case 0xbb:num=11 ;break; case 0x7b:num=12 ;break; case 0xe7:num=13 ;break; case 0xd7:num=14 ;break; case 0xb7:num=15 ;break; case 0x77:num=16 ;break;

}

shi=num/10; ge=num%10; P2=0; P0=table1[shi]; P2=table2[0]; delay_50us(100); P2=0; P0=table1[ge]; P2=table2[1]; delay_50us(100);

} }

因篇幅问题不能全部显示,请点此查看更多更全内容