浙江大学宁波理工学院单片机短学期报告

更新时间:2023-06-02 08:50:01 阅读量: 实用文档 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

浙江大学宁波理工学院单片机短学期报告 忽悠老师必备

宁波理工学院

专业综合课程设计报告

姓 名 和谐

专业班级 自动化091

指导教师

分 院

完成日期

浙江大学宁波理工学院单片机短学期报告 忽悠老师必备

目 录

1.课程设计目的和要求 2 2.硬件原理图 2 3.课程设计报告内容(软件部分) 6 3.1 电子时钟程序 11 3.1.1 程序流程图 13 3.1.2 源程序 14 3.2 电子密码锁程序 22 3.2.1 程序流程图 24 3.2.2 源程序 25 4.自我总结 29 5.参考文献 30

浙江大学宁波理工学院单片机短学期报告 忽悠老师必备

2.硬件原理图:

1.课程设计目的和要求

序和电子密码锁程序,并在实验板上或仿真图上调试通过。

控制技术的必要一课。课程设计是提高同学们深入理解课堂内容的重要环节。本

单片机是现代控制领域中不可缺少的核心部件,是掌握电子应用技术和自动

生分析问题和解决问题的能力以及实践动手能力。要求每位学生编写电子时钟程

课程设计的任务是巩固和加深学生对单片机原理和知识的理解,目的在于培养学

专业综合课程设计报告

浙江大学宁波理工学院单片机短学期报告 忽悠老师必备

R38

R37

R36

R35

R34

R33

R32

R31

VCC

2

R12

3

R20

2 K 3

2

2

2

2

2

2

2

P1.7

2

2

2

2

2

2

2

2

0

0

0

0

0

0

0

0

0

L16

DPY

e

f

1 1

1 2

d a

W 4

g

a

7

b

c

e b

2

R11

3

R19

f P1.6 4

K

3

0

9 d

c

W 3 g

L15

a

2

d

c

e

b

f

e

8

1

d

W 2

g

2

R10

3

R18

a K 0 P1.5

1

3

0

f

LED0

L14

c

e

b

5

f

6

g

W 1

d

g

a

3

d p

c

2

R

3

R17

b

K 9 P1.4

3

LN3461

DS1

0

L13

LED 显示电路Jed_dp Jed_g Jed_f Jed_e Jed_d Jed_c Jed_b Jed_a DPY e

彩灯电路原理图

3f 1 1 1 2 d a W 4 g a 7 b c e b f 4 9 d c W 3 g a 2 d c e b f

e 8 1 d W 2 g a 1 0 f c e b 5 f 6 g W 1 d g a 3 d p c b LN3461 DS2

Res2

R

3

R16

P1.3

8

3

0

L12

2

R

3

R15

K 7 P1.2

3

0

L11

2

R

3

R14

K 6 P1.1

3

0

L10

2

R

3

R13

K 5 P1.0

3

0

L

9

浙江大学宁波理工学院单片机短学期报告 忽悠老师必备

3.课程设计报告内容(软件部分)

3.1 电子时钟程序

3.1.1 程序流程图

主程序流程图 T0中断程序流程图 3.1.2 源程序

#include<reg52.h> #include<stdio.h>

#define uchar unsigned char #define uint unsigned int

void delay(uint k ); //延时子程序 void time_pro( ); //时间处理子程序 void display( ); //显示子程序 void keyscan( );//键盘扫描子程序

uchar code dispcode[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40}; // 0 1 2 3 4 5 6 7 8 9 10

int p2_tab[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};

浙江大学宁波理工学院单片机短学期报告 忽悠老师必备

// 0 1 2 3 4 5 6 7 uchar seconde=0;//秒 uchar minite=0;//分 uchar hour=0; //时

uchar mstcnt=0;//定时器计数,定时50ms,mstcnt满20,秒加1 uchar shi=0;//闹铃功能 uchar fen=0; uchar miao=0; sbit P1_0=P1^0; sbit P1_1=P1^1; sbit P1_2=P1^2; sbit P1_6=P1^6; sbit P3_1=P3^1; sbit P3_2=P3^2; sbit P3_3=P3^3; sbit P3_4=P3^4; sbit P3_5=P3^5; sbit P3_6=P3^6; sbit P3_7=P3^7; /*延时子程序*/

void delay (uint k) { uchar j;

while((k--)!=0)

{for(j=0;j<125;j++) {; } }} /*时间处理子程序*/ void time_pro(void) { if(seconde==60) { seconde=0; minite++;

if(minite==60) { minite=0; hour++;

if(hour==24)

{ hour=0;} } }}

void timer0(void) interrupt 1 //定时器0方式1,50ms中断一次 {

TH0=0x3c; //手动加载计数脉冲次数 TL0=0xb0; TMOD=0x11;

mstcnt++; //用于计算时间,每隔50ms加1 if(mstcnt==20)//mstcnt满20即为一秒 { seconde++;//秒+1

time_pro( ); //时间处理

浙江大学宁波理工学院单片机短学期报告 忽悠老师必备

mstcnt=0; //对计数单元的清零,重新开始计数 } }

/*显示子程序*/ void display(void) { if(P3_4==1)

{ P2=p2_tab[7];

P0=dispcode[seconde%10];//秒个位 delay(1);

P2=p2_tab[6];

P0=dispcode[seconde/10];//秒十位 delay(1);

P2=p2_tab[5];

P0=dispcode[10];//间隔符 - delay(1);

P2=p2_tab[4];

P0=dispcode[minite%10];//分个位 delay(1);

P2=p2_tab[3];

P0=dispcode[minite/10];//分十位 delay(1);

P2=p2_tab[2];

P0=dispcode[10];//间隔符 - delay(1);

P2=p2_tab[1];

P0=dispcode[hour%10];//时个位 delay(1);

P2=p2_tab[0];

P0=dispcode[hour/10];//时十位 delay(1); } } /*键盘扫描子程序*/ void keyscan(void)

{ if(P1_0==0)//秒位的调整 { delay(30); if(P1_0==0) { seconde++;

if(seconde==60)

{ seconde=0; } } delay(250); }

if(P1_1==0)//分位的调整 { delay(30); if(P1_1==0) { minite++; if(minite==60)

{ minite=0; } }

浙江大学宁波理工学院单片机短学期报告 忽悠老师必备

delay(250); } if(P1_2==0)//时位的调整 { delay(30); if(P1_2==0) { hour++; if(hour==24)

{ hour=0; } } delay(250); } } /*定时闹钟*/ void dingshi(void) { if(P3_4==0)

{ P2=p2_tab[7];

P0=dispcode[miao%10];//秒个位 delay(1);

P2=p2_tab[6];

P0=dispcode[miao/10];//秒十位 delay(1);

P2=p2_tab[5];

P0=dispcode[10];//间隔符 - delay(1);

P2=p2_tab[4];

P0=dispcode[fen%10];//分个位 delay(1);

P2=p2_tab[3];

P0=dispcode[fen/10];//分十位 delay(1);

P2=p2_tab[2];

P0=dispcode[10];//LED 3.6两管符号“-” delay(1);

P2=p2_tab[1];

P0=dispcode[shi%10];//时个位 delay(1);

P2=p2_tab[0];

P0=dispcode[shi/10];//时十位 delay(1); }

if(P3_5==0)//闹钟时位加 {delay(30); if(P3_5==0) { shi++; if(shi==24) { shi=0; } } delay(250); }

if(P3_1==0)//闹钟时位减 { delay(30);

浙江大学宁波理工学院单片机短学期报告 忽悠老师必备

if(P3_1==0) { shi--;

if(shi==24) { shi=0;} } delay(250); }

if(P3_6==0)//闹钟分位加 { delay(30); if(P3_6==0) {

fen++;

if(fen==60)

{ fen=0; } } delay(250); }

if(P3_2==0)//闹钟分位减 { delay(30); if(P3_2==0) {fen--;

if(fen==60) {fen=0; } }

delay(250);}

if(P3_7==0)//闹钟秒位加 {

delay(30); if(P3_7==0) {miao++;

if(miao==60) { miao=0; } } delay(250); }

if(P3_3==0)//闹钟秒位减 {delay(30); if(P3_3==0) { miao--; if(miao==60) { miao=0; } } delay(250); }

if((hour==shi)&(minite==fen)&(seconde==miao))//闹铃时间到,报警2s。 { P1_6=0;

delay(1500); P1_6=1;}} /*主函数*/

void main(void) { P1=0XFF;

TMOD=0x11; //time0为定时器,方式1

浙江大学宁波理工学院单片机短学期报告 忽悠老师必备

TH0=0x3c;//预置计数初值,50ms TL0=0xb0;

EA=1; //总中断开

ET0=1; //允许定时器0中断 TR0=1; //开启定时器0 while (1)

{ keyscan();//按键扫描 dingshi();//定时闹钟

display();//显示时间 } } 3.1 数字时钟仿真图

3.2 电子密码锁程序

3.2.1 程序流程图

主程序流程图 扫描键盘流程图

3.2.2 源程序

浙江大学宁波理工学院单片机短学期报告 忽悠老师必备

#include"reg51.h" #include"stdio.h"

#define uchar unsigned char #define uint unsigned int void dly_ms(int ms); int keyscan(); void show(); void show1(); sbit P3_1=P3^1;

int ok=0;//,esc=0,change=0,re=0; int t[6]={3,2,1,4,5,6},

s[6]={13,13,13,13,13,13},

p[8]={13,13,13,13,13,13,13,13}; int

table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x76,0x08,0x79,0x00};

// 0 1 2 3 4 5 6 7 8 9 10 11 12 13

int p2_tab[]={0xf7,0xfb,0xfd,0xfe,0x7f,0xbf,0xdf,0xef}; void main()

{int i=0,n=0,k=-1,x=0,m=0; while(1)

{k=keyscan(); if(k!=-1) {if(n<6)

switch(k) {case 0: case 1: case 2: case 3: case 4: case 5: case 6: case 7: case 8:

case 9:p[n]=10;s[n]=k;n++;break; } switch(k) {case 12: {ok=1;

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

if(s[i]!=t[i]||n<6) ok=0; if(ok==0)

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

浙江大学宁波理工学院单片机短学期报告 忽悠老师必备

p[i]=12; P1=0x0f; } else

{for(i=0;i<6;i++) p[i]=s[i]; p[6]=13; p[7]=13;

P1=0x00; } } };break; case 13: {if(m!=1) {break;} else

{for(i=0;i<6;i++) {t[i]=13;} for(i=0;i<6;) {x=keyscan(); if(x!=-1&&x<10) {t[i]=x;

dly_ms(150); i++;} show1(); m=0;} } }

case 15:

for(i=0;i<8;i++)p[i]=13; for(i=0;i<6;i++)s[i]=13; n=0;

P1=0XFF; }

k=-1;

dly_ms(200); } show(); } for(;;);}

void dly_ms(int ms) {

int ii,jj;

if (ms<1) ms=1;

for(ii=0;ii<ms;ii++)

for(jj=0;jj<112;jj++); //busclk:12MHz--1ms }

int keyscan()//键盘扫描函数,用于识别哪一个键按下,并读取键值

浙江大学宁波理工学院单片机短学期报告 忽悠老师必备

{

uchar i,temp,temp1=0xfe; int k=-1;

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

P3=temp1;

temp=P3&0xf0; if(temp!=0xf0) {

dly_ms(10); temp=P3&0xf0; if(temp!=0xf0)

{ //消抖 while((P3&0Xf0)!=0xf0); switch(temp) {

case 0xe0:k=4*i+0;break; case 0xd0:k=4*i+1;break; case 0xb0:k=4*i+2;break; case 0x70:k=4*i+3;break; default:k=-1; } } }

temp1=(temp1<<1)|0x01;//左移一位 }

return k; }

void show() { int i;

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

P2=p2_tab[i]; P0=table[p[i]]; dly_ms(2); } }

void show1() { int i;

for(i=0;i<6;i++) p[i]=11; for(i=0;i<8;i++) {

P2=p2_tab[i];//数码管的位选

浙江大学宁波理工学院单片机短学期报告 忽悠老师必备

P0=table[p[i]];//数码管显示的数据 dly_ms(2); }}

4.自我总结

在漫长的大三即将结束之际,学校给我们安排了短学期,本以为在宁波理工这么多年终于有一次机会可以在七月前回到家里,然而短学期的开使得我这个梦想破灭。于是,三年了,我没一次是在七月前回家的。

这次短学期,为期十天,在上学期学习了单片机的汇编编程方法后,这次短学期我们学习了c语言 的编程方法,在此提个意见,希望学校能把单片机这门课安排在第六学期,因为单片机这门课和短学期相差了一个学期,本来我们就对单片机这门课有点头疼,而短学期和单片机主课相隔时间大,回忆起来有点困难。

接下来说一下收获,这次虽然说真的学到的东西对我个人而言不是很多,但是收获还是有的,比如说我重新回忆起了c语言的循环语句,case,break等。也让我重新回忆了单片机。

本人自己单片机c语言学的都不好,程序也不是自己写的,自己写对我而言要求太高,所以我只能试着在同学的帮助下试着理解程序的代码及其含义。我觉得每个人都有各自的特点,写程序厉害的同学可以自己写,写不好的同学只能自己看,看多了,也就会写了,古语有云:熟读唐诗三百首,不会吟诗也会吟。

总之感谢老师在这个炎烈的夏天还和我们一起短学期,相信我们有所收获,就是老师最最欣慰的事情,在此,我告诉老师,我有收获,感谢您的付出。

5.参考文献

《C语言程序设计》----唐云延 主编 <科学出版社>

《单片机原理与应用》----吴飞青、李林功、王兵、丁晓 编著 <机械工业出版社>

本文来源:https://www.bwwdw.com/article/ctz1.html

Top