基于定时计数器的C语言开发拓展.docx

上传人:b****5 文档编号:6892585 上传时间:2023-01-12 格式:DOCX 页数:13 大小:115.46KB
下载 相关 举报
基于定时计数器的C语言开发拓展.docx_第1页
第1页 / 共13页
基于定时计数器的C语言开发拓展.docx_第2页
第2页 / 共13页
基于定时计数器的C语言开发拓展.docx_第3页
第3页 / 共13页
基于定时计数器的C语言开发拓展.docx_第4页
第4页 / 共13页
基于定时计数器的C语言开发拓展.docx_第5页
第5页 / 共13页
点击查看更多>>
下载资源
资源描述

基于定时计数器的C语言开发拓展.docx

《基于定时计数器的C语言开发拓展.docx》由会员分享,可在线阅读,更多相关《基于定时计数器的C语言开发拓展.docx(13页珍藏版)》请在冰豆网上搜索。

基于定时计数器的C语言开发拓展.docx

基于定时计数器的C语言开发拓展

课程设计任务书

学生姓名:

专业班级:

电信0804

指导教师:

工作单位:

信息工程学院

题目:

基于定时器的单片机仿真和C语言开发

初始条件:

本课程设计,要求用使用Proteus仿真软件进行系统设计与仿真。

要求完成的主要任务:

(包括课程设计工作量及其技术要求,以及说明书撰写等具体要求)

1、课程设计工作量:

1周内完成对系统的设计、仿真。

2、技术要求:

1)试用定时器中断方式或查询定时器溢出标志方式从P口输出给定周期的方波。

要求进行电路仿真实验,并使用C语言进行程序的开发。

2)要求学生主动思考,自主发挥,实现系统的特色功能。

3、查阅至少5篇参考文献。

按《武汉理工大学课程设计工作规范》要求撰写设计报告书。

全文用A4纸打印,图纸应符合绘图规范。

提交报告的主要内容:

(使用Proteus7.5sp3)

1)题目

2)仿真所完成的主要功能和特色简介——摘要(特别是自己扩展的功能,根据特色功能评优)

3)Proteus仿真的基本流程

4)所使用芯片以及引脚功能简介(需要提供对应芯片DataSheet的下载链接)

5)设计方案与工作原理,给出仿真电路图

6)实验记录与结果分析

时间安排:

1)2011年7月9~10日,查阅相关资料,学习设计原理。

2)2011年7月11~12日,方案选择和电路设计仿真。

3)2011年7月13日,设计说明书撰写。

4)2011年7月14日上交报告,同时进行答辩。

指导教师签名:

年月日

系主任(或责任教师)签名:

年月日

目录

1摘要···················································

2Proteus软件和Keil软件简介······························

2.1Proteus软件简介····················································

2.2Keil软件简介······················································

3设计过程···············································

3.1设计原理及拓展内容说明············································

3.2所用主要元器件····················································

3.3设计仿真电路······················································

3.4C语言代码·························································

4仿真结果及分析·········································

5心得体会···············································

6参考文献···············································

7本科生课程设计成绩评定表·······························

 

1摘要

基本要求:

1)本课设的主要目的是应用Proteus软件和嵌入式C语言编程工具,结合单片机原理及应用、微机原理与接口技术等专业课程,强化和巩固专业理论基础,掌握Proteus仿真的技巧和嵌入式C语言编程工具,提高单片机开发能力,并为嵌入式开发打下基础。

2)本次课设我做的第五套题的题目是基于定时器/计数器的单片机仿真和C语言开发,其主要内容是试用定时器中断方式或查询定时器溢出标志方式从P口输出给定周期的方波。

要求进行电路仿真实验,并使用C语言进行程序的开发。

特色功能,本人在基本要求的基础上,增添了两个特色功能:

1)增加了led显示的功能,8个led循环显示。

2)增加了对输出方波可调整的功能。

 

2Proteus软件和Keil软件简介

2.1Proteus软件简介

PROTEUS是英国LabCenterElectronics公司开发的电路分析与实物仿真软件。

PROTEUS不仅是模拟电路、数字电路、模/数混合电路的设计与仿真平台,更是目前世界上最先进的、最完整的多种型号微控制器系统的设计与仿真平台。

它真正实现了在计算机上完成从原理图设计、电路分析与仿真、单片机代码及调试与仿真、系统测试与功能验证到形成PCB的完整的电子设计、研发过程。

PROTEUS从1989年问世至今。

经过了近20年的使用、发展和完善,功能越来越强,性能越来越好。

PROTEUS该软件具有以下特点:

实现了单片机仿真和SPICE电路仿真相结合。

具有模拟电路仿真、数字电路仿真、单片机及其外围电路组成的系统的仿真、RS232动态仿真、I2C调试器、SPI调试器、键盘和LCD系统仿真的功能;有各种虚拟仪器,如示波器、逻辑分析仪、信号发生器等。

支持主流单片机系统的仿真。

目前支持的单片机类型有:

68000系列、8051系列、AVR系列、PIC系列、Z80系列以及各种外围芯片。

提供软件调试功能。

在硬件仿真系统中具有全速、单步、设置断点等调试功能,同时可以观察各个变量、寄存器等的当前状态,因此在该软件仿真系统中,也必须具有这些功能;同时支持第三方的软件编译和调试环境,如KeilC51等软件。

具有强大的原理图绘制功能。

总之,该软件是一款集单片机和SPICE分析于一身的仿真软件,功能极其强大。

 

2.2Keil软件简介

本次编程所用到的C编译器为KeilC51。

KeilC51是美国KeilSoftware公司出品的51系列兼容单片机C语言软件开发系统,与汇编相比,C语言在功能上、结构性、可读性、可维护性上有明显的优势,因而易学易用。

Keil提供了包括C编译器、宏汇编、连接器、库管理和一个功能强大的仿真调试器等在内的完整开发方案,通过一个集成开发环境(uVision)将这些部分组合在一起。

如果你使用C语言编程,那么Keil几乎就是你的不二之选,即使不使用C语言而仅用汇编语言编程,其方便易用的集成环境、强大的软件仿真调试工具也会令你事半功倍。

KeilC51软件提供丰富的库函数和功能强大的集成开发调试工具,全Windows界面。

另外重要的一点,只要看一下编译后生成的汇编代码,就能体会到KeilC51生成的目标代码效率非常之高,多数语句生成的汇编代码很紧凑,容易理解。

在开发大型软件时更能体现高级语言的优势。

单片机的C语言采用C51编译器(简称C51)。

由C51产生的目标代码短、运行速度高、所需存储空间小、符合C语言的ANSI标准,生成的代码遵循INTEL目标文件格式,而且可与A51汇编语言目标代码混合使用。

应用C51编程具有以下优点:

(1)C51管理内部寄存器和存储器的分配,编程时,无需考虑不同寄存器的寻址和数据类型等细节问题。

(2)程序由若干函数组成,具有良好的模拟结构。

(3)有丰富的子程序可直接引用,从而大大减少用户编程的工作量。

(4)C语言和汇编语言可以交叉使用,汇编语言程序代码短、运行速度快,但复杂运算编程耗时。

如果用汇编语言编写与硬件有关的部分程序,用C语言编写与硬件无关的运算部分程序,充分发挥两种语言的长处,可以提高开发效率。

 

3设计过程

3.1设计原理及拓展内容说明

首先题目的基本功能要求是利用试用定时器中断方式或查询定时器溢出标志方式从P0口输出给定周期的方波,在实际设计中我用的是中断方式(利用的是T1定时器),而不是查询方式。

至于P0口我选择了P0.0口用来输出方波,输出方波的原理是:

先对P0.0口置初值1,T1中断时间一转到中断服务程序执行:

首先利用次中断服务程序对P0.0口取反,转回中断等待,下次再执行中断程序时再将P0.0取反,这样就产生了所需要的方波,至于方波的周期则需要控制中断时间,因此就是需要对定时器的计数初值做改变。

下面会做介绍。

对于拓展部分,我设计了两个拓展:

1)利用定时器定时周期来循环显示8个led,用于led显示在每次中断服务程序中,让数码管下移显示并循环显示,即对P1口的输入值做改变。

2)如何改变P0.0口输出方波的周期,主要是对P0.0口取反的时间间隔,即T1定时器定时周期,即T1定时器的计数初值,那么只要改变计数初值即可,在这里我设置了两个数组a,b,a里面存放的是T1定时器TH1内容,b里面存放的是T1定时器TL1的内容(T1定时器采用定时方式1),再设立两组指针ap,bp分别指向a,b两个数组,改变指针指向即可(本设计中我设立了两级变频,即数组中有三组数据)。

对于变频,我采用的是外部中断方式0来控制:

外部中断程序执行的内容是对指针做修改3次以后再循环,这样就控制了频率。

3)整个程序由C来编写,Keil来编译,proteus仿真,由于设计得比较简洁,所以程序内容不多,简洁明了。

 

3.2所用主要元器件

AT89C52单片机,如下图所示:

图1AT89C52芯片图

VCC:

供电电压。

GND:

接地。

P0口:

P0口为一个8位漏级开路双向I/O口,每脚可吸收8TTL门电流。

当P1口的管脚第一次写1时,被定义为高阻输入。

P0能够用于外部程序数据存储器,它可以被定义为数据/地址的第八位。

在FIASH编程时,P0口作为原码输入口,当FIASH进行校验时,P0输出原码,此时P0外部必须被拉高。

P1口:

P1口是一个内部提供上拉电阻的8位双向I/O口,P1口缓冲器能接收输出4TTL门电流。

P1口管脚写入1后,被内部上拉为高,可用作输入,P1口被外部下拉为低电平时,将输出电流,这是由于内部上拉的缘故。

在FLASH编程和校验时,P1口作为第八位地址接收;P2口:

P2口为一个内部上拉电阻的8位双向I/O口,P2口缓冲器可接收,输出4个TTL门电流,当P2口被写“1”时,其管脚被内部上拉电阻拉高,且作为输入。

并因此作为输入时,P2口的管脚被外部拉低,将输出电流。

这是由于内部上拉的缘故;P3口:

P3口管脚是8个带内部上拉电阻的双向I/O口,可接收输出4个TTL门电流。

当P3口写入“1”后,它们被内部上拉为高电平,并用作输入。

作为输入,由于外部下拉为低电平,P3口将输出电流(ILL)这是由于上拉的缘故。

P3口作为AT89C51的一些特殊功能口:

P3.0RXD(串行输入口)

P3.1TXD(串行输出口)

P3.2/INT0(外部中断0)

P3.3/INT1(外部中断1)

P3.4T0(记时器0外部输入)

P3.5T1(记时器1外部输入)

P3.6/WR(外部数据存储器写选通)

P3.7/RD(外部数据存储器读选通)

RST:

复位输入。

当振荡器复位器件时,要保持RST脚两个机器周期的高电平时间。

ALE/PROG:

当访问外部存储器时,地址锁存允许的输出电平用于锁存地址的地位字节。

在FLASH编程期间,此引脚用于输入编程脉冲。

在平时,ALE端以不变的频率周期输出正脉冲信号,此频率为振荡器频率的1/6。

因此它可用作对外部输出的脉冲或用于定时目的。

然而要注意的是:

每当用作外部数据存储器时,将跳过一个ALE脉冲。

如想禁止ALE的输出可在SFR8EH地址上置0。

此时,ALE只有在执行MOVX,MOVC指令是ALE才起作用。

另外,该引脚被略微拉高。

如果微处理器在外部执行状态ALE禁止,置位无效。

/PSEN:

外部程序存储器的选通信号。

在由外部程序存储器取指期间,每个机器周期两

/PSEN有效。

但在访问外部数据存储器时,这两次有效的/PSEN信号将不出现。

/EA/VPP:

当/EA保持低电平时,则在此期间外部程序存储器(0000H-FFFFH),不管是否有内部程序存储器。

注意加密方式1时,/EA将内部锁定为RESET;当/EA端保持高电平时,此间内部程序存储器。

在FLASH编程期间,此引脚也用于施加12V编程电源(VPP)。

XTAL1:

反向振荡放大器的输入及内部时钟工作电路的输入。

XTAL2:

来自反向振荡器的输出。

 

LCD液晶显示:

图2LCD液晶显示

P2口用于输出显示,

初始状态显示DIANXIN0804

0120809310405

3.3设计仿真电路

图3设计总图

3.4C语言代码

#include

#include

#defineucharunsignedchar

#defineuintunsignedint

ucharcodetable[]="DIANXIN0804";

ucharcodetable1[]="0120809310405";

ucharcodetable2[]="f=10Hz";

ucharcodetable3[]="f=16Hz";

ucharcodetable4[]="f=25Hz";

char*ap;

char*bp;

charb[3]={0x3c,0x63,0xb0};

chara[3]={0xb0,0xc4,0xe0};

sbitd1=P0^0;

sbitrs=P3^7;

sbitrw=P3^6;

sbiten=P3^5;

uchartemp;

ucharnum;

uinti;

voiddelay(uintz)

{

uintx,y;

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

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

}

voidwrite_com(ucharcom)

{

rs=0;

P2=com;

delay(5);

en=1;

delay(5);

en=0;

}

voidwrite_data(uchardate)

{

rs=1;

P2=date;

delay(5);

en=1;

delay(5);

en=0;

}

voidinit()

{

en=0;

write_com(0x38);

write_com(0x0e);

write_com(0x06);

write_com(0x01);

write_com(0x80+0x00);

}

 

voidmain()

{

init();

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

{write_data(table[num]);

delay(20);}

//write_com

(1);

write_com(0x80+0x40);

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

{write_data(table1[num]);

delay(20);}

IE=0x81;//允许INT0中断

IT0=1;//下降沿触发

TMOD=0x10;//T1工作于方式1

EA=1;ET1=1;//开总中断,允许T1中断

d1=1;

P1=0xfe;//第一盏LED亮

i=0;

while

(1)

{}

}

timer1()interrupt3using1

{

d1=~d1;

P1=P1<<1;

P1=P1|0x01;

if(P1==0xff)

P1=0xfe;

if(i==1)

{TH1=0x3c;TL1=0xb0;}

if(i==2)

{TH1=0x63;TL1=0xc4;}

if(i==0)

{TH1=0xb4;TL1=0xe0;}//重新装入计数初值

}

voidex_int0()interrupt0

{

TR1=1;//开启T1

switch(i)

{

case0:

write_com(0x80);

for(num=0;num<15;num++){write_data(table2[num]);delay(20);}

break;

case1:

write_com(0x80);

for(num=0;num<15;num++){write_data(table3[num]);delay(20);}

break;

case2:

write_com(0x80);

for(num=0;num<15;num++){write_data(table4[num]);delay(20);}

break;

}

i++;

if(i>2)

{

i=0;

}

}

 

4仿真结果及分析

输出波形控制记录(2级变频):

1)初始频率波形:

图3初始方波

2)一次变频波形:

图4一次变频方波

3)二次变频方波:

图5二次变频方波

仿真分析:

我对本次仿真主要有一下几点说明:

①对于led循环显示部分记录不够明显,所以没有截图;②外部中断是下降沿触发,用开关控制;③变频可循环,只要一直按开关即可不断变换。

5心得体会

 

6参考文献

【1】李群芳张士军单片微型计算机与接口技术电子工业出版社2008版

【2】李群芳肖看单片机原理接口与应用清华大学出版社2005版

【3】谢瑞和等串行技术大全清华大学出版社2003版

【4】张迎新单片微型计算机原理、应用及接口技术国防工业出版社1999版

【5】陈光东单片微型计算机原理与接口技术华中科技大学出版社1999版

 

本科生能力拓展训练成绩评定表

姓名

性别

专业、班级

电信0804

题目:

基于定时器的单片机仿真和C语言开发

答辩或质疑记录:

 

成绩评定依据:

最终评定成绩(以优、良、中、及格、不及格评定)

指导教师签字:

年月日

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 人文社科

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1