单片机实训报告

时间:2024.4.14

《多模式彩灯控制器》

课程设计报告

设计题目: 基于80C51单片机制作的彩灯控制器

         电气工程学院           

    业:      应用电子技术          

    者:  王亚飞     号:  11022108

指导老师:       黄京老师           

                        日期:20##-01-22
       

1. 引  言………………………………………………………4

2. 设计要求……………………………………………………4

3. 电路图………………………………………………………5

4. 工作原理说明………………………………………………9

5. 程序框图……………………………………………………10

6. 调试过程,解决问题的方法………………………………10

7. 总结…………………………………………………………11

8. 源程序………………………………………………………12

参考文献

附录

源程序下载地址


基于80C51单片机制作的彩灯控制器与程序设计

引 言

单片微型计算机简称单片机,又称微控制器(MCU),它的出现是计算机发展史上的一个重要的里程碑,它以体积小、功能全、性价比高等诸多优点独具特色,在工业控制、尖端武器、通信设备、信息处理、家用电器等嵌入式应用领域中独占鳌头。本次课设采用的AT89C51单片机是51系列单片机的一种代表,目前51系列单片机是国内目前应用最广泛的一种单片机之一。单片机以其系统硬件构架完整、价格低廉、学生能动手等特点,成为工科学生硬件设计的基础课。

基于80C51单片机制作的彩灯控制器概述:

本次课设所使用的单片机最小系统板包括以下器件:电源端子(DC +5V),可以USB供电,也可独立电源供电。AT89C51单片机。LED发光二极管共9个,其中8个接于P1口做LED显示,还有一个做电源灯显示。还有其他电阻电容若干,系统板一个,按键开关9个,其中复位开关一个,按键控制开关8个,

要求

本设计以单片机STC89S52为控制核心,由八路LED模块、八路按钮模块等部分组成。可实现花样流水灯,要求在将硬件电路准确无误地安装后进行调试,用单片机实现按钮控制LED灯的状态,由P1端口控制8个LED灯,P2端口接8个按钮开关(本学期只用前3个)至少完成以下三个功能

1、按下第一个按钮,8个灯全部闪烁

2、按下第二个按钮,8个灯从P0-----P7流水

3、按下第三个按钮,8个灯从P7-----P0流水

上面的功能可适度改变,供自由发挥,只要求第一次按键有效,复位后为全灭且可以上电复位,接通电源后电源指示灯亮。

所需元件清单:
1)AT89s52
2)9个LED灯
3)9个按键
4)12M晶振

5)上拉电阻与限流电阻

6)33pf的瓷片电容2个

7)排针4*20+3

8)杜邦线11根

9)锡线若干

电路原理图:

PCB板效果图

LED 灯电路

一般发光二极管的工作电流是十几毫安至几十毫安,正向压降为1.3V-2.5V。有一些低电流的发光二极管的工作电流可以降至2MA,而亮度与正常发光二极相同,当然价格会高一些。所有发光二极管在电路中一般都要串一个电阻用来限流。发光二极管的电流不同,亮度也不同,并且寿命也会受到影响,这个电流通常就是由接入的电阻来调整。
  发光二极管串联了一个1kΩ的电阻后接在5V 的电压上。LED 灯电路接在单片机的P1口上。LED灯的阳极接电源,阴级接单片机的I/0 口,因此是低电平驱动,只要单片机在相应引脚给出低电平,LED 就会发光。

按键电路

通过电阻接电源负极,并将按键所接的单片机的I/O口作为输出端。为使读取的按键信息可靠,每次读取按键状态时向P2端口写入一个高电平,这样,当按键没有按下时,当前I/O输出低电平,代表按键按下。由于按键属于机械开关,按动过程不可避免存在抖动的现象。因此必须去抖动才能避免误判断。可以在程序中采用软件延时的办法,即每次检测到有键按下时延时20ms 再判断是否按键还是处于按下状态,是则表示确实有键按下,不是则表示是按键误动作。用户按下按键的时间可以稍微长一点。

源程序:

#include<reg52.h>

 unsigned char keyvalue;

 unsigned int CYCLE=300,PWM_LOW=0;

/*------------------------------------------------

                  花样表格

------------------------------------------------*/

unsigned char code seg[]={0x7f,0xbf,0xdf,0xef,

                          0xf7,0xfb,0xfd,0xfe,

                          0xff,0xff,0x00,0x00,

                          0x55,0x55,0xaa,0xaa};//rom允许情况可以无限添加

unsigned char swscan(void);

void Delay(unsigned int t);          //延时函数声明

//------------------------------------------------

main()

{

unsigned char i;

 while(1)

      {

          i=swscan();

          if(i==1)

          {

            while(1)

            {

             P1=0xff;

             Delay(60000);

             for(PWM_LOW=1;PWM_LOW<CYCLE;PWM_LOW++)

             {

                   P1=0x00;        //点亮LED 

                   Delay(PWM_LOW);//延时长度,600次循环中从1加至599

                   P1=0xff;        //熄灭LED

                    Delay(CYCLE-PWM_LOW);

               }

            P1=0x00;

             for(PWM_LOW=CYCLE-1;PWM_LOW>0;PWM_LOW--){           

                   P1=0x00;

                   Delay(PWM_LOW);

                   P1=0xff;

                    Delay(CYCLE-PWM_LOW);

            }  }

          }

          if(i==2)

          {

            while(1)

            {

                P1=0xFF;

                 Delay(20000);

                 P1=0xFE;           //第1个LED亮

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

                   {

                    Delay(20000);

                    P1 <<=1;

                   }

            }  

          }

          if(i==3)

          {

            while(1)

            {

                P1=0xFF;

                 Delay(20000);

                 P1=0x7F;           //第1个LED亮

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

                  {

                    Delay(20000);

                    P1 >>=1;

                    P1|=0x80;

                  }

            }

          }

          if(i==4)

          {

            while(1)

            {

                for(i=0;i<16;i++)    //查表可以简单的显示各种花样 实用性更强

                {

                  Delay(20000);

                  P1=seg[i];

                }

            }

          }

      }

}

void Delay(unsigned int t)

{

 while(--t);

}

 //         按键扫描函数,返回扫描键值

unsigned char swscan(void)

{

 P2=0xff;

 if(P2!=0xff)

   {

    Delay(100);

    if(P2!=0xff)

       {

        keyvalue=P2;

        switch(keyvalue)

        {

         case 0xfe:return 1;break;

         case 0xfd:return 2;break;

         case 0xfb:return 3;break;

         case 0xf7:return 4;break;

         case 0xef:return 5;break;

         case 0xdf:return 6;break;

         case 0xbf:return 7;break;

         case 0x7f:return 8;break;

         default:return 0;break;

        }

      }

   }

   return 0;

}

工作原理说明:

通过12M的晶振和复位电路加上电源给组成了一个最小系统,12M晶振给单片机提供了“心跳”,电源提供了动力,复位电路确保了单片机的正确执行。

通上电,首先电解电容充电,rst引脚有电压且能持续一段时间,给单片机提供可靠的复位,通电后晶振也开始产生12M的方波,等待点解电容充电完成后,单片机遍开始工作。从源程序中我们可以看到,通电后,单片机进入一个while死循环,不断调用按键扫描程序,按键扫描程序中将P2口的状态存储在一个变量中,在switch语句中进行比较,我们假设第一个按键按下,则P2口的电平情况应该是01111111,即是0xfe;这时switch语句返回数值1,返回后,在主函数中,用if语句进行对比,如果是1,则进入按键一的程序,按键一中有一条while语句以便使单片机不停的工作,知道电源断开。在P1中,我定义的功能是PWM调光,也就是呼吸灯,8盏LED慢慢的亮后再慢慢的暗。

按键2、按键3、按键4…………,原理一样,改变的只是功能部分

这样我们就实现了控制彩灯的功能

程序框图:

调试过程及解决问题的方法:

在这次实训中还算顺利,没有遇到太多的问题

用开发板将自己写好的程序刷如单片机中,将单片机插入插槽。

一开始接上电源,接上LED灯,发现电源指示灯闪了下就不亮了,经过检查发现没有节220的限流电阻,指示灯已经烧毁,只好换一个,这样给了我一个教训,LED一定需要接限流电阻,在以后的制作中要仔细检查后再上电测试,这次是一个LED,下次可能是很贵的其他元器件,吸取教训。

依次测试了4个按键的功能,没有发现问题,算是调试完成了。  ^-^


总结:

首先在做本次实习的过程中,我感触最深的是查阅大量的设计资料。为了让自己的设计更加完善,查阅这方面的设计资料是十分必要的,同时也是必不可少的。通过查资料,和同学们讨论,听老师讲解,最后按实训要求编写程序。程序循环输出到单片机P1口,控制LED灯从LED1向LED8依次亮,到全部亮然后LED 灯从LED1向LED8依次前进单个亮,类似跑马情形。

其次,在这次课程设计中,我们运用到了以前所学的专业课知识,硬件的设计和焊接都要我们自己动手去焊,软件的编程也要我们不断的调试,最终按要求完成课程的设计,很高兴它能按着设计的思想运行起来。

 最后,在实习之前,我们要对所用单片机的内部结构有一个系统的了解,知道该单片机内有哪些资源;要有一个清晰的思路和一个完整的的软件流程图;在设计程序时,不能妄想一次就将整个程序设计好,反复修改、不断改进是程序设计的必经之路;要养成注释程序的好习惯,一个程序的完美与否不仅仅是实现功能,而应该让人一看就能明白你的思路,这样也为资料的保存和交流提供了方便;在实习过程中遇到问题是很正常的,但我们应该将每次遇到的问题记录下来,并分析清楚,以免下次再碰到同样的问题。但是从中学到的知识会让我受益终身。发现、提出、分析、解决问题和实践能力提高都会受益于我在以后的学习、工作和生活中。同时也感谢蔡卫平老师得指导使得这次少走许多弯路。

参考文献

[1] 张伟,《单片机原理及应用》,机械工业出版社,2005

[2] 张鑫,《单片机原理及应用》,电子工业出版社,2005

[3] 曹国清,《数学电路与逻辑设计》,中国矿业大学出版社,2004

[4] 任致程,《经典集成电路400例》,机械工业出版社,2002

[5] 薛栋梁,《单片机原理及应用》,中国水利水电出版社,2001

[6] 吴金戎,沈庆阳等,《8051单片机实践与应用》,清华大学出版社,2001

[7] 谢筑森,张辉等,《单片机开发与典型应用设计》,中国科学技术大学出版社,1997

附录

(贴出实验板正面及背面图片)

 

C语言源文件+仿真图下载

文件名称:  课程设计.rar  
文件大小: 17.87 KB  
上传用户:  liuenming 
文件校验: F985101E9A214BF45B40D593A359F823

下载地址: http://www.vdisk.cn/down/index/9325732A6216

                                                                            机电工程学院

                                                                            机电11301班

                                                                            王亚飞

                                                                           

                                                                            20##-01-22


第二篇:单片机实训报告模板


项目一 万年历

班级:   学号:    姓名:

一、任务目的

   通过对万年历的设计和制作,应用了单片机的数码管、键盘接口技术,以及定时/计数器、中断等程序设计技术,进一步训练了单片机并行I/O端口的应用能力、循环程序设计、键盘查询程序设计和调试能力,让同学们初步了解了作为单片机的重要输入设备——键盘接口技术和程序设计方法。

二、设计要求

    用单片机设计一个在数码管能同时显示年月日时分秒,具体要求:根据提供的单片机,设计出万年历的硬件电路,编写软件,用Proteus进行仿真实验,然后进行实物的软硬件调试,并撰写符合要求的实训报告。

三、系统硬件电路设计

   可分为最小系统、数码管显示、按键三个单元电路,要求画出各部分电路图,写出工作原理。

最小系统:

数码管显示:

按键:

                                                                    

四、软件设计

主流程图:

                                                                     流程图:

 软件设计有三部分:计时(区分大小月与平月)、显示、校时(使用按键)。

#include <reg51.h>

unsigned char msec,sec,min,hou,day=20,mon=3,ci;/*定义msec50ms计数变量,sec为秒变量,min为分变量,hou为时变量,day为天变量,mon为月变量,ci为循环次数 */

int year=2013;/*定义year为年变量,定义起始年为20##*/

sbit P30=P3^0;/*通过sbit定义可位寻址变量*/

sbit P32=P3^2;

sbit P33=P3^3;

sbit P34=P3^4;

void delay(unsigned char i)/*延时函数,当i=1时,延时255微秒*/

  { unsigned char j,k;

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

    for(j=0;j<255;j++);}   

 //函数名:T0_INT

 //函数功能:定时器0中断函数,50ms定时时间到,自动执行该函数,判断是否中断20

 //形式参数:无

 //返回值:无

void T0_INT() interrupt 1//定时器0中断类型号为1                           

{TH0=0x3c;                   //50ms定时初值

TL0=0xb0;

msec++;                       //中断次数增1

  if(msec==20)            //中断次数为20次么?

  {msec=0;                  //是,1s计时到,50ms计数变量清零

  sec++;                 //秒变量加1

  if(sec==60)         //60s么?

  {sec=0;               //是,1分计时到,秒变量清零

  min++;              //分变量加1

  if(min==60)             //60分么?

 { min=0;               //是,1小时计时到,分变量清零

  hou++;               //时变量加1

  if(hou==24)             //24时么?

 { hou=0;               //是,1天计时到,时变量清零

  day++;               //天变量加1

  if(mon==1||mon==3||mon==5||mon==7||mon==8||mon==10||mon==12)//月是为1,3,5,7,8,10,12么?

{if(day==32){day=1;mon++;} }     //是,天到32么?是,天变量复位为1,月变量加1

 else if( mon==2)                      //月是为2么?

 {if(day==29){day=1;mon++;}}         //是,天到29么?是,天变量复位为1,月变量加1

  else                                                    //月是为4,6,9,11么?

 {if(day==31){day=1;mon++;}}    //是,天到31么?是,天变量复位为1,月变量加1

  if(mon==13)                                           //月到13么?

 { mon=1;                                 //是,1年计时到,月变量复位到1

  year++;}}}}}}                                                    //年变量加1

void main()                                                             //主函数

{unsignedcharled[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//定义数字0~9字型显示码,数码管共阴

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

TR0=1;                                                                         //启动定时器

TH0=0x3c;                                                                 //50ms定时初值

TL0=0xb0;

EA=1;                                                                         //开总中断

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

while(1)                                                                                              

{if(P30==1)                                     //P3.0=1么?(开关是开启的么?)

{ for(ci=1;ci<=10;ci++)                      //for循环,ci的初值为1,判断ci<=10,若小于等于10循环,ci+1,若大于10跳出循环

{P2=0x00;P0=led[sec%10];delay(2); //选中P20x00时控制的数码管,显示秒个位

P2=0x01;P0=led[sec/10];delay(2);  //选中P20x01时控制的数码管,显示秒十位

P2=0x02;P0=led[min%10];delay(2); //选中P20x02时控制的数码管,显示分个位

P2=0x03;P0=led[min/10];delay(2);     //选中P20x03时控制的数码管,显示分十位

P2=0x04;P0=led[hou%10];delay(2); //选中P20x04时控制的数码管,显示时个位

P2=0x05;P0=led[hou/10];delay(2);} //选中P20x05时控制的数码管,显示时十位                                                                                                

if(P32==0)                                                  //P3.2=0么?按钮按下么?

{delay(55);if(P32==0) {sec++;}if(sec==60) {sec=0;}} //是,延时55*255um;P3.2=0么?是,秒变量加1;秒到60么?是,秒变量清零

if(P33==0)                                                  //P3.3=0么?按钮按下么?

{delay(55);if(P33==0) {min++;}if(min==60) {min=0;}} //是,延时55*255um;P3.3=0么?是,分变量加1;分到60么?是,分变量清零

if(P34==0)                                            //P3.4=0么?按钮按下么?

{delay(55);if(P34==0) {hou++;}if(hou==24) {hou=0;}}} //是,延时55*255um;P3.4=0么?是,时变量加1;时到24么?是,时变量清零

else if(P30==0)                         //P3.0=0么?(开关是闭合的么?)

 {for(ci=1;ci<=10;ci++) //for循环,ci的初值为1,判断ci<=10,若小于等于10循环,ci+1,若大于10跳出循环

{P2=0x00;P0=led[day%10];delay(2);       //选中P20x00时控制的数码管,显示天个位

P2=0x01;P0=led[day/10];delay(2);      //选中P20x01时控制的数码管,显示天十位

P2=0x02;P0=led[mon%10];delay(2);  //选中P20x02时控制的数码管,显示月个位

P2=0x03;P0=led[mon/10];delay(2);    //选中P20x03时控制的数码管,显示月十位

P2=0x04;P0=led[year%10];delay(2); //选中P20x04时控制的数码管,显示年个位

P2=0x05;P0=led[year/10%10];delay(2); //选中P20x05时控制的数码管,显示年十位

P2=0x06;P0=led[year/100%10];delay(2); //选中P20x06时控制的数码管,显示年百位

P2=0x07;P0=led[year/1000];delay(2);} //选中P20x07时控制的数码管,显示年千位

if(P32==0)                      //P3.2=0么?按钮按下么?

{delay(50);if(P32==0) {day++;}if(mon==1||mon==3||mon==5||mon==7||mon==8||mon==10||mon==12)  //是,延时50*255um;P3.2=0么?是,天变量加1;月是为1,3,5,7,8,10,12么?

  {if(day==32){day=1;} }  //是,天到32么?是,天变量复位为1

    else if( mon==2)                                            //月是为2么?

     {if(day==29){day=1;}} //是,天到29么?是,天变量复位为1

       else                                                //月是为4,6,9,11么?

        {if(day==31){day=1;}}} //是,天到31么?是,天变量复位为1

if(P33==0)                                                  //P3.3=0么?按钮按下么?

{delay(50);if(P33==0) {mon++;}if(mon==13) {mon=1;}}   //是,延时50*255um;P3.3=0么?是,月变量加1;月到13么?是,月变量复位为1

if(P34==0)                                       //P3.4=0么?按钮按下么?

{delay(50);if(P34==0) {year++;}}} //是,延时50*255um;P3.3=0么?是,年变量加1

 else {;}}}

五、系统调试

   画proteus图,了解单片机最小系统,选用的元件有AT89C51,共阴的蓝色的8位数码管(7SEG-MPX8-CC-BLUE),三八译码器(74HC138),按钮(BUTTON),普通电容(CAP),极性电容(CAP-ELEC),晶体管(CRYSTAL),10K电阻(RES),排阻(RESPACK-8),单刀单匝开关(SWITCH),将电路连接完整。

编写程序。

编译程序并导入画好的proteus中,查看情况,调试。

在调试过程中,我们先编写的是时分秒的数字钟的显示,在最开始的时候数码管全部显示8,经后来查程序发现程序内少了计时器开启的命令,所以数码管没有时间跳动。在时分秒显示后,我们开始将年月日加进去,在P3.0口接入单刀单匝开关,当开关断开时显示的是时分秒,开关闭合时是显示年月日。然后调试时发现开关没用,后来问同学知道,P3.0是不能直接用的,所以要用sbit来定义可位寻址变量的,改正后可以变换了。最后编写校时的程序,在调试校时这部分时当我们按下按键的时候会跳掉好几个数,后来经老师解答知道那是抖动,所以要消抖,消抖后虽然好了点,但是还是会有数字跳动的,后来在课堂上知道了是所有的程序运作是要时间的,之前占用的时间太多会让后面的校时有错的,所以在显示的部分用了for的循环语句。最后是区分大小月和平月,这程序是在放在计时和校时的部分的。

六、心得体会

   经过这次练习,我对单片机的应用有了更深的认识了,而且还记住了以前总是记不住的单片机的最小系统。从最开始的觉得C语言编万年历太难了,到后来觉得这个万年历也不是很难的。在编程序的时候必须要认真仔细,防止不必要的错误。

更多相关推荐:
单片机实习报告总结

这次实习我们使用控制电路的单片机是at89s51型号的。通过它实现对八盏双色灯发光二极管的控制p0和p2口控制四盏灯。在at89s51的9引脚接复位电路,对电路实现复位控制。在电路中接入74s164译码器和共阴…

单片机实训报告模板

单片机实训设计报告单片机实训设计报告题目可调电子时钟的设计学院交通信息学院专业电气自动化技术班级电气091姓名学号长号指导老师1单片机实训设计报告一实验内容利用CPU的定时器和实验仪上提供的数码显示电路设计一个...

单片机实训报告模板

苏州市职业大学实习实训任务书名称起讫时间学院部机电工程学院班级12机电一体化2指导教师学院部负责人陈洁苏州市职业大学校内实习实训报告名称20xx年9月1日至20xx年9月12日共2周学院部机电工程学院班级12机...

单片机实训报告样板

广西科技大学筹课程设计说明书课题名称单片机电子时钟的设计系别职业技术教育学院专业电子信息工程班级学号姓名报告样板指导教师I摘要单片机自20世纪70年代问世以来以其极高的性能价格比受到人们的重视和关注应用很广发展...

单片机实习报告

单片机实习报告题目姓名学院专业班级学号指导教师交通灯控制系统职称讲师20xx年5月27日内容提要本系统采用AT89S52作为交通灯控制系统的核心控制器件利用单片机的定时器产生秒级信号控制十字路口的红绿黄灯交替点...

《单片机实习报告温控系统

学院单片机课程设计报告书题目温度控制系统设计院系名称学生姓名专业名称班级时间学院自动化自动20xx年6月7日至6月17日温度控制系统设计一设计目的在现代化的工业生产中电流电压温度压力流量流速和开关量都是常用的主...

单片机实训报告

单片机实训报告姓名学号班级指导老师实训时间前言一周的单片机实训很快就结束咯在这一周的时间里我学到了很多关于单片机各方面的知识老师在实训课中也教会咯我们很多关于单片机软件编程与硬件设施的知识一周的实训中我们一共实...

单片机实训报告模板

项目一万年历班级学号姓名一任务目的通过对万年历的设计和制作应用了单片机的数码管键盘接口技术以及定时计数器中断等程序设计技术进一步训练了单片机并行IO端口的应用能力循环程序设计键盘查询程序设计和调试能力让同学们初...

单片机实习报告

淮阴工学院计算机工程学院单片机项目开发实习报告课题名称简易计算器的设计指导教师金鹰张粤刘虎孙成富胡荣林班级通信1122学号1121302115姓名鲍茜提交日期20xx119目录目录I1引言12简易计算器的系统总...

单片机应用实习报告

实习执行大纲一实习目的1巩固单片机原理与应用理论课的理论知识2熟悉单片机应用系统的硬件设计及软件设计的基本方法3将单片机原理与应用理论课的理论知识应用于实际的应用系统中4训练单片机应用技术锻炼实际动手能力二实习...

单片机实训报告

单片机实训报告实验题目电子时钟设计姓名孙志敏学号20xx043535指导老师王宇松实验地点福煤实验楼B40520xx年6月5日一绪论11电子时钟简介19xx年Ventura发明了世界上第一个电子表从而奠定了电子...

单片机实训报告

单片机原理及应用A07课程实训报告12微电子2班胡国南目录绪论2第1部分单片机选型412AT89C51简介4第2部分电子时钟设计方案7第3部分电子时钟硬件设计8第4部分电子时钟软件设计1141软件设计流程图11...

单片机实训报告(38篇)