我的单片机电子钟实训报告

物理与机电工程学院课程设计报告

课程名称:     单片机课程设计  

系    部:   物理与机电工程学院

专业班级:   09电子信息工程2

学生姓名:               

指导教师:        王清辉       

完成时间:   20##年3月16日   

报告成绩:                      

         

 

《单片机原理》课程设计

一、设计任务与要求

1、具有小时分秒时间显示。

2、能够设置闹钟至少5次闹钟时间。

3、可利用按键修改时间,具有上午下午的提示信息。

二、方案设计与论证

方案一:采用实时时钟芯片

实时时钟芯片具备年、月、日、时、分、秒计时功能和多点定时功能,计时数据的更新每秒自动进行一次,不需程序干预。计算机可通过中断或查询方式读取计时数据进行显示,因此计时功能的实现无需占用CPU的时间,程序简单。此外,实时时钟芯片多数带有锂电池做后备电源,具备永不停止的计时功能;具有可编程方波输出功能,可用做实时测控系统的采样信号等;有的实时时钟芯片内部还带有非易失性RAM,可用来存放需长期保存但有时也需变更的数据。由于功能完善,精度高,软件程序设计相对简单,且计时不占用CPU时间,因此,在工业实时测控系统中多采用这一类专用芯片来实现实时时钟功能。

方案二: 软件控制

利用单片机内部的定时/计数器进行中断定时,配合软件延时实现时、分、秒的计时及秒表计时。该方案节省硬件成本,且能使设计者对单片机的指令系统能有更深入的了解,从而掌握单片机应用技术MCS-51汇编语言程序设计方法,因此,本系统设计采用此种软件控制方法来实现计时。而由于ATMEL公司的STC89C52单片机是低功耗的具有4KB在线可编程Flash存储器的单片机。它与通用80C52系列单片机的指令系和引脚兼容。片内的Flash可允许在线重新编程,也可使用通用非易失性存储器编程。它将通用CPU和在线可编程Flash集成在一个芯片上,形成了功能强大、使用灵活和具有较高性能价格比的微控制器。它的功能强大,而且也较容易购买,故本设计中所选的单片机为STC89C52单片机。

其中该电子钟主要由单片机,4个独立按键,显示接口电路和复位电路构成。设计课题的总体方案图如图1.1所示。

图1.1 总体方案图

本电子钟采用ATMEL公司的STC89C52单片机为核心,使用11.0592MHZ 晶振与单片机STC89C52 相连接,通过软件编程的方法实现以24小时为一个周期,同时以LCD显示年、月、日、星期、小时、分钟和秒的要求。该电子钟设有四个按键S1、S2、S3和RESET键,进行相应的操作就可实现校时、复位功能。

STC89C52单片机简介

STC89C52是一种低功耗、高性能CMOS8位微控制器,具有 8K 在系统可编程Flash 存储器。在单芯片上,拥有灵巧的8 位CPU 和在系统可编程Flash,使得STC89C52为众多嵌入式控制应用系统提供高灵活、超有效的解决方案。 具有以下标准功能: 8k字节Flash,512字节RAM, 32 位I/O 口线,看门狗定时器,内置4KB EEPROM,MAX810复位电路,三个16 位 定时器/计数器,一个6向量2级中断结构,全双工串行口。另外 STC89X52 可降至0Hz 静态逻辑操作,支持2种软件可选择节电模式。空闲模式下,CPU 停止工作,允许RAM、定时器/计数器、串口、中断继续工作。掉电保护方式下,RAM内容被保存,振荡器被冻结,单片机一切工作停止,直到下一个中断或硬件复位为止。最高运作频率35Mhz,6T/12T可选。

三、硬件电路设计

多功能电子表单元电路工作原理介绍

1、电源电路工作原理

    图5.1所示为集成直流稳压电源电路的原理图,本电源电路是由集成稳压器构成的。电路可分成三部分:电源变压器部分、整流滤波部分和稳压部分。

变压器原边为工频交流220V电压,经过变压后,变压器副边的电压变为交流11V,11V交流电压经过桥式整流电路整流后变为直流10V电压,直流10V电压作为CW7805的输入电压,CW7805输出+5V电压。图中D2为整流桥,它由四个整流二极管接成电桥形式。C3为滤波电容,C1用于抵消输入端较长接线的电感效应,以防止自激振荡,还可抑制电源的高频脉冲干扰。一般取0.1——1μF。CW7805为三端固定输出集成稳压器,其输入和输出电压都为固定值,它的输入电压为+10V,输出电压为+5V。C2和C4用以改善负载的瞬态响应,消除电路的高频噪声,同时也具有消振作用。

2、时钟电路工作原理

    图5.2所示为时钟电路原理图,在STC89C52芯片内部有一个高增益反相放大器,其输入端为芯片引脚XTAL1,输出端为引脚XTAL2。而在芯片内部,XTAL1和XTAL2之间跨接晶体振荡器和微调电容,从而构成一个稳定的自激振荡器。时钟电路产生的振荡脉冲经过触发器进行二分频之后,才成为单片机的时钟脉冲信号。    

3、复位电路工作原理

    图5.3所示为复位电路原理图,复位是单片机的初始化操作,其主要功能是把PC初始化为0000H,使单片机从0000H单元开始执行程序,并使其它功能单元处于一个确定的初始状态。本复位电路采用的是按键复位,它是通过复位端经电阻与VCC电源接通而实现的,它兼具上电复位功能。因本系统的晶振的频率为12MHz,所以,复位信号持续时间应当超过2μS才能完成复位操作。

4、键盘工作原理

    图5.4所示为键盘原理图,本系统采用的是独立式键盘结构,每个按键单独占用一根I/O口线,每个按键的工作不会影响其它I/O口线的状态。它软件是采用查询式结构,首先逐位查询每根I/O口线的输入状态,如某一根I/O口线输入为低电平,则可确认该I/O口线所对应的按键已按下,然后,再转向该键的功能处理程序。                    

5、显示电路工作原理

图3

本设计采用LCD1602液晶显示模块,具有很低的功耗,正常工作室电流仅2.0mA/5.0V。通过编程实现总动关闭屏幕能够更有效地降低功耗。

电子钟原理图如下所示

图5

元件清单:

电子钟PCB如下:

四、软件设计

1、主程序框图:

开始

定义堆栈区

 

8155、T0、数据缓冲区、标志位初始化

 

调用键盘扫描程序

 

                     否

是C/R键?      

 

                                 是

地址指针指向计时缓冲区

 

                             调用时间设置程序

 

                             主程序流程图

2、时间设置模块

该模块由键盘输入相应的数据来设置当前时间。程序通过调用一个键盘设置子程序通过键盘扫描将键入的6位时间值送入显示缓冲区。

设置时间后,时钟要从这个时间开始计时,而时分秒单元各占一个字节,键盘占6个字节。因此程序中要调用一个合字子程序将显示缓冲区中的6位BCD码合并为3位压缩BCD码,并送入计时缓冲区,作为当前计时起始时间。

该程序同时要检测输入时间值的合法性,若键盘输入的小时值大于23,分、秒值大于59,则不合法,将取消本次设置,清零重新开始计时。

时间设置和键盘设置子程序的流程图如下图所示。

保护现场

 


调用键盘设置子程序KETIN

 


调用合字子程序COMB

 


恢复现场

 


返回

时间设置流程图

保护现场

 


显示缓冲区首地址送R0键盘输入次数送R7

 


调用键盘扫描程序KEYSCAN

 


键号送@R0

 


显示缓冲区地址加1

 


循环次数减1

 


循环结束?

恢复现场

 


返回

键盘设置子程序流程图

2、设计程序如下:


#include <reg52.h>

#define uchar unsigned char

#define uint unsigned int

sbit lcden=P2^0;

sbit rs=P3^5;

sbit s4=P1^3;

sbit s1=P1^1;

sbit s2=P1^2;

sbit s3=P1^0;

uchar count,date,s1num,temp,csnum,RCAP2H,RCAP2L;

uint nian=2009;

char yue,ri,xq=1,shi,fen,miao,shi_c,fen_c,s_c[5],f_c[5],num_c=1,ri_c;

bit flag,setpage,shuaxin;

uchar code table[]=" 20##-00-00 MON";

uchar code table1[]="    21:00:00";//初始化要在这里改数值

void keyscan();

void delay(uint z);

void write_com(uchar com);

void write_date(uchar date);

void write_sfm(uchar add,uchar date);

void word(uchar add,unsigned char *str) ;//写字符串

void write_nyr(uchar add,uchar date);

void write_nian();

void init();

void clock();#include <reg52.h>

#define uchar unsigned char

#define uint unsigned int

sbit lcden=P3^4;

sbit rs=P3^5;

sbit s4=P1^0;

sbit s1=P1^3;

sbit s2=P1^2;

sbit s3=P2^1;

uchar count,date,s1num,temp,csnum;

uint nian=2009;

char yue,ri,xq=1,shi,fen,miao,shi_c,fen_c,s_c[5],f_c[5],num_c=1,ri_c;

bit flag,setpage,shuaxin;

uchar code table[]=" 20##-00-00 MON";

uchar code table1[]="    00:00:00";//初始化要在这里改数值

void keyscan();

void delay(uint z);

void write_com(uchar com);

void write_date(uchar date);

void write_sfm(uchar add,uchar date);

void word(uchar add,unsigned char *str) ;//写字符串

void write_nyr(uchar add,uchar date);

void write_nian();

void init();

void clock();

void main()

{  

    init();

    while(1)

    {

   

    keyscan();

    clock();//执行闹钟程序  

    //以下为时钟程序

   

    if(count>=20)

    {

       count=0;

       miao++;

       if(miao==60)//如果秒不到60,则只刷新秒

           {

              miao=0;

              fen++;

              if(fen==60)

                  {fen=0;

                   shi++;

                     if(shi==24)

                     {

                    

                                shi=0;

                                 xq++;

                                write_com(0x80+12);

                                if(xq==8)xq=1;                               

                                if(xq==1)word(12,"Mon");

                                if(xq==2)word(12,"Tue");

                                if(xq==3)word(12,"Wed");

                                if(xq==4)word(12,"Thu");

                                if(xq==5)word(12,"Fri");

                                if(xq==6)word(12,"Sat");

                                if(xq==7)word(12,"Sun");

                               

                         ri++;//接下来要大小月,在二月时要判断是否闰年

                            //  如果是闰年,则为29天

                         if(yue<=7)

                         {

                         temp=yue%2;

                         switch(temp)

                             {

                            case 0://0为小月

                            if(yue==2)//如果为二月,则判断是不是闰年,是为29天,不是为28天

                                {

                                    if((nian%4==0)&&nian%100!=0||(nian%400==0))

                                   {

                                       if(ri==30)

                                       {

                                       ri=1;

                                       yue++;

                                       write_nyr(6,yue);

                                       }

                                   }

                                   else

                                   {

                                       if(ri==29)

                                       {

                                       ri=1;

                                       yue++;

                                       write_nyr(6,yue);

                                       }

                                   }

                                }// if(yue==2)

                            if(ri==31)

                                {

                                ri=1;//yue++

                                yue++;

                                if(yue==13)

                                   {

                                       yue=1;

                                       nian++;

                                       write_nian();

                                   }                              

                                write_nyr(6,yue);

                                }

                            break;

                            case 1://1为大月

                           

                           if(ri==32)

                                {

                                ri=1;

                                yue++;

                                if(yue==13)

                                   {

                                       yue=1;

                                       nian++;

                                       write_nian();       

                                   }

                                write_nyr(6,yue);

                                }

                            break;    

                             } 

                         }//if(yue<=7)

                         if(yue>7)

                         {

                         temp=yue%2;

                         switch(temp)

                            {

                            case 0://0为大月

                            if(ri==32)

                                {

                                ri=1;//yue++

                                yue++;

                                if(yue==13)

                                   {

                                       yue=1;

                                       nian++;

                                       write_nian();

                                   }                              

                                write_nyr(6,yue);

                                }  

                            break;

                            case 1://1为小月

                            if(ri==31)

                                {

                                ri=1;//yue++

                                yue++;

                                if(yue==13)

                                   {

                                       yue=1;

                                       nian++;

                                       write_nian();

                                   }                              

                                write_nyr(6,yue);

                                }     

                            break;

                            }

                         }//if(yue>7)

                  write_nyr(9,ri);

                      }//if(shi==24)

           if(shuaxin==0)write_sfm(4,shi);

                  }//if(fen==60)

       if(shuaxin==0)write_sfm(7,fen);

           }// if(miao==60)

    if(shuaxin==0)write_sfm(10,miao); 

      }//  if(count==20)

   

    }//    while(1)

}

void delay(uint z)

{

    int x,y;

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

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

}

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

{

   rs=0;

    lcden=0;

    P0=com;

    delay(2);

    lcden=1;

   delay(2);

    lcden=0;

}

void write_date(uchar date)//写数据函数

{  

    rs=1;

    lcden=0;

    P0=date;

    delay(2);

    lcden=1;

    delay(2);

    lcden=0;

}

void init()

{  

    uchar num;

    write_com(0x38);//显示模式设置

    write_com(0x0c);//光标设置

    write_com(0x06);//光标指针设置

    write_com(0x01);//显示清屏

    write_com(0x80);//从第一行开始写

    for(num=0;num<15;num++)

           {

              write_date(table[num]);

              delay(2);

           }

    write_com(0x80+0x40);//从第二行开始写

    for(num=0;num<12;num++)

           {

              write_date(table1[num]);

              delay(2);

           }

    for(num=0;num<5;num++)//初始化闹钟存放数组

           {

              s_c[num]=0;

              f_c[num]=0;  

           }

    RCAP2H=(65536-50000)/256;

    RCAP2L=(65536-50000)%256;//设置自动重装初值

    T2CON=0x04;//启动定时器

    EA=1;//总中断

   ET2=1;//开定时器中断

   

    TH0=(65536-50000)/256;

    TL0=(65536-50000)%256;

    TR0=0;

    ET0=1;    

}

void write_sfm(uchar add,uchar date)//写时分秒

{

    uchar shi,ge;

    shi=date/10;

    ge=date%10;

    write_com(0x80+0x40+add);

    write_date(0x30+shi);

    write_date(0x30+ge);

}

void write_nyr(uchar add,uchar date)//写月日

{

    uchar shi,ge;

    shi=date/10;

    ge=date%10;

    write_com(0x80+add);

    write_date(0x30+shi);

    write_date(0x30+ge);

}

void write_nian()

{

    uchar shi,ge;

    shi=nian%100/10;

    ge=nian%10;

    write_com(0x80+1);

    write_date(0x30+2);

    write_date(0x30);

    write_date(0x30+shi);

    write_date(0x30+ge);

}

void word(uchar add,unsigned char *str)//写字符串,如"MON"

{

       while(*str != '\0')

    {

       write_date(*str++);

    }

       *str = 0;

       write_com(0x80+add);

}

void keyscan()

{

    if(s1==0)//ok

       {  

           delay(5);

           if(s1==0)

           {  

              shuaxin=1;

              s1num++;

              while(!s1);//为假就退出,松手后即为假

              if(csnum==0)//刚开始一定要执行的

              {

                    

                     write_com(0x01);

                     write_com(0x0f);

                     write_com(0x80+4);

                     word(4,"1.time");

                     write_com(0xc0+4);

                     word(0x44,"2.clock");

                     write_com(0x84);//光标停在时间那里

                     csnum=1;

                     flag=1;                        

                  }

           if(csnum==2)//调时间

           {

           //************************//调时间画面初始化

      

           while(setpage==0)

           {

           uchar num;

           flag=0;   

           write_com(0x01);//显示清屏

           write_com(0x80);//从第一行开始写

           for(num=0;num<15;num++)

           {                                        

              write_date(table[num]);

             

           }

           write_com(0x80+0x40);//从第二行开始写

           for(num=0;num<12;num++)

           {

              write_date(table1[num]);

          

           }

           setpage=1;//setpage为1,则不用再次初始化调时画面

           }// while(setpage==0)

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

              if(s1num==1)//调秒

                  {

                  TR2=0;

                  shuaxin=1;

                  write_com(0x80+0x40+10);

                  write_com(0x0f);//光标闪烁

                  }

              if(s1num==2)//调时

                  {

                  write_com(0x80+0x40+7);

                  }

              if(s1num==3)//调分

                  {

                  write_com(0x80+0x40+4);

                  }

              if(s1num==4)//调星期

                  {     

                     write_com(0x80+12);               

                  }

              if(s1num==5)//调日

                  {     

                     write_com(0x80+9);                

                  }

              if(s1num==6)//调月份

                  {

                  write_com(0x80+6);

                  }  

              if(s1num==7)//调年

                  {

                  write_com(0x80+3);             

                  }

              if(s1num==8)

                  {

                  TR2=1;

                  s1num=0;

                  csnum=0;//调完会到初始状态

                  setpage=0;

                  flag=0;

                  shuaxin=0;//调完退出时要回到刷新状态

                  write_com(0x0c);//关闪烁

                  }

              }// if(csnum==2)//调时间

           if(csnum==3)//调闹钟

              {

                  if(setpage==0)

                  {  

                     uchar i=0;

                     flag=0;

                     write_com(0x80);

                     write_com(0x0c);

                     write_com(0x01);

                    

                     word(0,"you can set 32");

                     write_com(0xc0);

                     word(0,"clocks one day");

                     delay(500);

                                    //把闹钟存放数组设置一个数,以免

                    

                     write_com(0x01);                                

                     word(6,"clock 01  00:00");

                     write_com(0x0f);                  

                     setpage=1;                 

                  }//if(setpage==0)

                  if(s1num==1)//调闹钟数

                  {                

                  write_com(0x80+6);

                  write_com(0x0f);//光标闪烁

                  }

                  if(s1num==2)//调时

                  {                

                  write_com(0x80+10);

             

                  }

                  if(s1num==3)//调分

                  {                

                  write_com(0x80+13);

             

                  }

                  if(s1num==4)//全部回到初始状态

                  {

                  uchar num;

                  s1num=0;

                  csnum=0;//调完会到初始状态

                  setpage=0;

                  flag=0;

                  shuaxin=0;

                  write_com(0x0c);//关闪烁;

                  write_com(0x80);//从第一行开始写

                     for(num=0;num<15;num++)

                         {

                         write_date(table[num]);

                         delay(2);

                         }

                     write_com(0x80+0x40);//从第二行开始写

                     for(num=0;num<12;num++)

                         {

                         write_date(table1[num]);

                         delay(2);

                         }

                  write_nyr(6,yue);

                  write_nyr(9,ri);               

                  write_sfm(4,shi);

                  write_sfm(7,fen);//写回值

                 

                  }

                 

                        

              }//if(csnum==3)//调闹钟                         

           }//if(s1==0) 

       }//if(s1==0)OK键处理完毕

    if(flag==1)//flag为进入设置时间或闹钟画面标志,为1则进入设置

       {

       if(csnum!=0)

           {

              if(s2==0)

                  {

                     delay(5);

                     if(s2==0)

                         {

                            while(!s2);

                           

                            csnum=2;//调时间标志

                            s1num=0;

                            write_com(0x84);

                         }

                  }

              if(s3==0)

                  {

                     delay(5);

                     if(s3==0)

                         {

                            while(!s3);

                            csnum=3;//调闹钟标志

                            s1num=0;

                            write_com(0xc4);

                         }

                  }

           }

       }//if(flag==1)

       if(s1num!=0)//OKNUM=1

           {

              if(s2==0)

                  {

                     delay(5);//延时,消抖

                     if(s2==0)//确实按下了,再做下面的处理

                         {   while(!s2);

                         if(csnum==2)//shijian

                         {

                            if(s1num==1)//miao

                            {

                            miao++;

                            if(miao==60)

                                miao=0;

                            write_sfm(10,miao);

                            write_com(0x80+0x40+10);

                            }

                            if(s1num==2)//fen

                            {

                                fen++;

                                if(fen==60)

                                   fen=0;

                                write_sfm(7,fen);

                                write_com(0x80+0x40+7);

                            }

                            if(s1num==3)//shi

                            {  

                                shi++;

                                if(shi==24)

                                   shi=0;

                                write_sfm(4,shi);

                                write_com(0x80+0x40+4);

                            }

                                if(s1num==4)//xingqi

                            {  

                                xq++;

                                if(xq==8)

                                   xq=1;

                                if(xq==1)word(12,"Mon");

                                if(xq==2)word(12,"Tue");

                                if(xq==3)word(12,"Wed");

                                if(xq==4)word(12,"Thu");

                                if(xq==5)word(12,"Fri");

                                if(xq==6)word(12,"Sat");

                                if(xq==7)word(12,"Sun");

                                write_com(0x80+12);

                               

                            }

                                if(s1num==5)//ri

                            {  

                                ri++;

                                if(ri==31)

                                   ri=0;

                                write_nyr(9,ri);

                                write_com(0x80+9);

                            }

                                if(s1num==6)//yue

                            {  

                                yue++;

                                if(yue==13)

                                   yue=0;

                                write_nyr(6,yue);

                                write_com(0x80+6);

                            }

                                if(s1num==7)//nian

                            {  

                                nian++;

                                if(nian==2100)

                                   nian=2009;

                                write_nian();

                                write_com(0x80+1);

                            }

                             }//if(csnum==2)//shijian

                         if(csnum==3)//naozhong

                            {

                                if(s1num==1)

                                {

                                   num_c++;

                                   if(num_c==33)num_c=1;

                                   write_nyr(6,num_c);

                                   write_com(0x80+6);  

                                }

                                if(s1num==2)

                                {

                                   shi_c++;

                                   if(shi_c==24)shi_c=0;

                                   s_c[num_c-1]=shi_c;

                                   write_nyr(10,shi_c);

                                   write_com(0x80+10); 

                                   

                                }

                                if(s1num==3)

                                {

                                   fen_c++;

                                   if(fen_c==60)fen_c=0;

                                   f_c[num_c-1]=fen_c;

                                   write_nyr(13,fen_c);

                                   write_com(0x80+13); 

                                                                     

                                }                                                          

                               

                            }

                           }//if(s2==0)

                    } //if(s2==0)

              if(s3==0)

                  {

                     delay(5);

                     if(s3==0)

                         {

                            while(!s3);

                           if(csnum==2)//shijian

                            {

                            if(s1num==1)//miao

                                {

                                   miao--;

                                   if(miao==-1)

                                       miao=59;

                                   write_sfm(10,miao);

                                   write_com(0x80+0x40+10);

                                }

                            if(s1num==2)//fen

                                {

                                   fen--;

                                   if(fen==-1)

                                       fen=59;

                                   write_sfm(7,fen);

                                   write_com(0x80+0x40+7);

                                }

                            if(s1num==3)//shi

                                {

                                   shi--;

                                   if(shi==-1)

                                   shi=23;

                                   write_sfm(4,shi);

                                   write_com(0x80+0x40+4);

                                }

                            if(s1num==4)//xingqi

                                {

                                xq--;

                                if(xq==0)

                                   xq=7;

                                if(xq==1)word(12,"Mon");

                                if(xq==2)word(12,"Tue");

                                if(xq==3)word(12,"Wed");

                                if(xq==4)word(12,"Thu");

                                if(xq==5)word(12,"Fri");

                                if(xq==6)word(12,"Sat");

                                if(xq==7)word(12,"Sun");

                                write_com(0x80+12);

                                }

                            if(s1num==5)//ri

                                {

                                   ri--;

                                   if(ri==-1)

                                   ri=31;

                                   write_nyr(9,ri);

                                   write_com(0x80+9);

                                }

                             if(s1num==6)//yue

                                {

                                   yue--;

                                   if(yue==-1)

                                   yue=12;

                                   write_nyr(6,yue);

                                   write_com(0x80+6);

                                }

                            if(s1num==7)//nian

                                {

                                   nian--;   

                                   if(nian==2008)

                                   nian=2099;                                                               

                                   write_nian();

                                   write_com(0x80+1);

                                }

                            }//if(csnum==2)//shijian

                            if(csnum==3)//naozhong

                            {

                              if(s1num==1)

                                {

                                   num_c--;

                                   if(num_c==0)num_c=32;

                                   write_nyr(6,num_c);

                                   write_com(0x80+6);  

                                }

                                if(s1num==2)

                                {

                                   shi_c--;

                                   if(shi_c==-1)shi_c=23;

                                s_c[num_c-1]=shi_c;

                                   write_nyr(10,shi_c);

                                   write_com(0x80+10); 

                                }

                                if(s1num==3)

                                {

                                   fen_c--;

                                   if(fen_c==-1)fen_c=59;

                                   f_c[num_c-1]=fen_c;

                                   write_nyr(13,fen_c);

                                   write_com(0x80+13);

                                      

                                }         

                            }//if(csnum==2)//naozhong

                         }//if(s3==0)

                  }//if(s3==0)

           if(s4==0)

                  {

                     delay(5);

                     if(s4==0)

                         {

                            while(!s4);

                         if(csnum==1)

                            {

                            uchar num;

                            shuaxin=0;

                            flag=0;

                            s1num=0;

                            csnum=0;

                         write_com(0x0c);//关掉光标

                         write_com(0x80);

                         for(num=0;num<15;num++)

                                   {                                        

                                       write_date(table[num]);

             

                                   }

                         write_com(0x80+0x40);//从第二行开始写

                         for(num=0;num<12;num++)

                            {

                            write_date(table1[num]);

          

                            }

                               

                            }

                         if(csnum==2)//shijian

                         {

                            if(s1num==1)//miao

                                {

                                   s1num=0;

                                   csnum=0;

                                   TR2=1;

                                   shuaxin=0;//退出时回到刷新状态

                                   setpage=0;

                                   flag=0;

                                   write_com(0x0c);

                                }

                            if(s1num==2)//fen

                                {

                                   s1num=1;

                                   write_com(0xc0+10); 

                                }

                            if(s1num==3)//shi

                                {

                                s1num=2;

                                write_com(0x80+0x40+7);

                                }

                            if(s1num==4)//xingqi

                                {

                                s1num=3;                              

                                write_com(0x80+0x40+4);

                                }

                            if(s1num==5)//ri

                                {

                                s1num=4;  

                                write_com(0x80+12);

                                }

                            if(s1num==6)//yue

                                {

                                   s1num=5;

                                   write_com(0x80+9);

                                }

                            if(s1num==7)//nian

                                {

                                   s1num=6;                                 

                                   write_com(0x80+6);

                                }

                            }//shijian

                         if(csnum==3)

                            {

                                if(s1num==1)

                                {

                                   uchar num;

                                   s1num=0;

                                   shuaxin=0;

                                   csnum=0;                              

                                    setpage=0;

                                   flag=0;

                                  

                                   write_com(0x0c);

                                   write_com(0x80);//从第一行开始写

                                   for(num=0;num<15;num++)

                                       {

                                       write_date(table[num]);

                                       delay(2);

                                       }

                                   write_com(0x80+0x40);//从第二行开始写

                                   for(num=0;num<12;num++)

                                       {

                                       write_date(table1[num]);

                                       delay(2);

                                       }

                                }

                                if(s1num==2)

                                {

                                   s1num=1;

                                   write_com(0x80+6);  

                                }

                                if(s1num==3)

                                {

                                s1num=2;

                                write_com(0x80+10);

                                }

                            }

                         }//if(s4==0)

                  }//if(s4==0)                      

    }//if(s1num!=0)

}

void clock()

{

    uchar i;

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

       {

       if(shi==s_c[i]&&fen+1==f_c[i]&&miao==59)//

       {

           TR0=1;//启动音乐播放

       }

       }

}

void timer0() interrupt 1

  {

     TH0=(65536-50000)/256;

     TL0=(65536-50000)%256;

     TR0=0;   

     write_com(0xc0);

     write_date(0x30+num_c);

     write_com(0xca);

  }

void timer2() interrupt 5

    {

       TF2=0;

       count++;

    }  


五、仿真过程与仿真结果

六、安装与调试

在本次课程设计中,我用Keil uVision3 软件和STC89C52单片机开发系统调试程序,经过多次调试,了解了如何进行编译、连接,还读懂了单片机的相关电路原理图,但是在下载程序运行后并没有显示理想的效果。在检查了多次之后,还是没有找出错误。在一个星期的日子里,不断查阅资料,虚心请教同学和老师,不断对程序进行分析,拆合,修改,调试。经过努力,虽然编写的程序比较简单,单片机试验的功能不是出众,但基本把老师布置的内容,按时完成。以后会再加强程序调试和硬件方面的能力,希望能在这个基础上加以改进。

七、结论与心得

一周的实训到今天就结束了,经过一周的实训让我对以前不懂的知识,不能运用的知识都得到了很大的提高。

在这一周中,,由浅入深,让我们自己动手,自己编写程序,而不是像以前上课一样照本宣科,对程序一点都不了解,也不知道它这程序是怎样来的,有什么作用,根本就是一窍不通。

而现在我们学会了编写一些简单的程序。在实训过程中我们的仿真经常出现不能正常显示我们所想的数字,我们就得检查时哪一个程序出现了问题,是主程序,还是延时子程序,还是在汇编过程中有的符号出现了错误……

现在知道P0口一般很少用,如果要用就要接上拉电阻。通过这次实训知道我们不管在什么情况下都有耐心,比如在做电子时钟的时候出现显示不跳转,就要耐心的检查,越心急越不能解决问题,不是说心急吃不了热豆腐吗?我像就是这个理儿了。同时也要细心,在汇编的时候我把“#”给忘了,最后数码管什么都不显示。汇编是一个要很细心和耐心的过程,一个符号就能让你的程序出错。在这次实训中我学会了对中断程序的运用,在上课的时候老师讲中断的时候,脑子里就是模糊的,不知道怎么运用,在单片机里中断程序经常都会用到。

通过这次使我对汇编语言有了更进一步的认识和了解,要想学好它要重在实践,要通过不断的上机操作才能更好地学习它,我也发现我的好多不足之处。对汇编语言的一些标准库函数不太了解,还有对函数调用的正确使用不够熟悉,还有对汇编语言中经常出现的错误也不了解,通过实践的学习,我认识到学好计算机要重视实践操作,不仅仅是学习汇编语言,还是其它的语言,以及其它的计算机方面的知识都要重在实践,所以后在学习过程中,我会更加注视实践操作,使自己便好地学好计算机。

说起课程设计,我认为最重要的就是做好设计的预习,认真的研究老师给的题目,选一个自己有兴趣的题目。其次,老师对实验的讲解要一丝不苟的去听去想,因为只有都明白了,做起设计就会事半功倍,如果没弄明白,就迷迷糊糊的去选题目做设计,到头来一点收获也没有。最后,要重视程序的模块化,修改的方便,也要注重程序的调试,掌握其方法。

硬件的设计跟焊接都要我们自己动手去焊,软件的编程也要我们不断的调试,最终一个能完成课程设计的劳动成果出来了,很高兴它能按着设计的思想与要求运动起来。

当然,这其中也有很多问题,第一、不够细心比如由于粗心大意焊错了线,由于对课本理论的不熟悉导致编程出现错误。第二,是在学习态度上,这次课设是对我的学习态度的一次检验。对于这次单片机综合课程实习,我的第一大心得体会就是作为一名工程技术人员,要求具备的首要素质绝对应该是严谨。我们这次实习所遇到的多半问题多数都是由于我们不够严谨。第三,在做人上,我认识到,无论做什么事情,只要你足够坚强,有足够的毅力与决心,有足够的挑战困难的勇气,就没有什么办不到的。

八、参考文献

[1]、张洪润,兰清华,单片机应用技术教程[M],北京:清华大学出版社,1997.11。

[2]、李华,MCS-51系列单片机实用接口技术[M],北京:北京航空航天大学出版社,1993.8。

[3]、C编写组编  常用C语言速查手册  龙门书局 1995

[4] 冯博琴.吴宁.《微型计算机原理与接口技术》清华大学出版社.

[5] 牛昱光.《单片机原理与接口技术》.电子工业出版社.

相关推荐