物理与机电工程学院课程设计报告
课程名称: 单片机课程设计
系 部: 物理与机电工程学院
专业班级: 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] 牛昱光.《单片机原理与接口技术》.电子工业出版社.
课程设计报告设计题目:电子时钟设计指导教师:姓名:学号:班级:专业:日期:20**-1-5控制电路的C语言源程序10单片机电子时钟…
单片机实训报告题目:电子时钟设计姓名:***学号:**专业:计算机控制0902班所属系部:电子工程系指导老师:**20XX年6月2…
物理与机电工程学院课程设计报告课程名称单片机课程设计系部物理与机电工程学院专业班级09电子信息工程2班学生姓名指导教师完成时间20…
数字时钟实验报告一、实验目的1、熟悉单片机的结构和各引脚的的功能以及如何用程序控制。2、学习用单片机对数字时钟控制、按键扫描及LE…
12目录第一章前沿1第二章数字时钟221数字时钟方案222数码管显示方案2第三章单片机331数码管显示工作原理332AT89C51…
绪论单片机应用简述电子时钟简介电子时钟的基本特点任务要求设计方案控制系统的硬件设计芯片的选择AT89S51的功能概述AT89S51…
12目录第一章前沿1第二章数字时钟221数字时钟方案222数码管显示方案2第三章单片机331数码管显示工作原理332AT89C51…
单片机课程设计题目电子万年历姓名所在学院所学专业班级学号指导教师完成时间20xx1222单片机课程设计任务书一基本情况二课程设计的…
数字时钟实验报告一、实验目的1、熟悉单片机的结构和各引脚的的功能以及如何用程序控制。2、学习用单片机对数字时钟控制、按键扫描及LE…
单片机电子钟实训报告学院:河南工程学院系别:电气信息工程系专业班级:通信技术1032姓名:学号:前言单片机自20世纪70年代问世以…
天津电子信息职业技术学院电子报警器装配报告课题名称电子报警器的组装姓名学号班级所在系指导教师完成日期一工作原理1电子报警系统组成探…