太原工业学院毕业设计
以上就是定时器初值的计算法,总结后得出如下结论:当用定时器的方式1时,设机器周期为TCY,定时器产生一次中断的时间为t,那么需要计数的个数为N=t/TCY ,装入THX和TLX中的数分别为:
THX=(65536-N)/256 , TLX=(65536-N)%6
在写单片机的定时器程序时,在程序开始处需要对定时器及中断寄存器做初始化设置,通常定时器初始化过程如下: (1)对TMOD赋值,以确定T0和
T1的工作方式。
(2)计算初值,并将初值写入TH0、TL0或TH1、TL1。 (3)中断方式时,则对IE赋值,开放中断。
(4)使TR0和TR1置位,启动定时器/计数器定时或计数。
3.4 本章小结
本章主要介绍了本次设计需要用到的单片机的部分原理。第一,介绍了单片机芯片STC89C52RC的基本组成原理以及40个引脚功能;第二,介绍了单片机定时/计数器的结构及工作原理和方式;第三,介绍了单片机中断系统的原理以及工作方式。
在对系统所用核心芯片STC89C52RC单片机基本原理以及定时中断工作方式介绍的基础上,接下来就是系统的软件程序设计部分,以完成本次的设计。
26
太原工业学院毕业设计
第4章 软件设计
4.1 软件开发环境
STC89C52RC单片机软件开发平台为Keil uvision4 C51,仿真环境为Protues,下载软件为STC_ISP。
Keil C51是美国Keil Software公司出品的51系列兼容单片机C语言软件开发系统,与汇编相比,C语言在功能上、结构性、可读性、可维护性上有明显的优势,因而易学易用。Keil提供了包括C编译器、宏汇编、连接器、库管理和一个功能强大的仿真调试器等在内的完整开发方案,通过一个集成开发环境(uVision)将这些部分组合在一起。运行Keil软件需要WIN98、NT、WIN2000、WINXP等操作系统。[16]
Protues软件是英国Labcenter electronics公司出版的EDA工具软件。它不仅具有其它EDA工具软件的仿真功能,还能仿真单片机及外围器件。它是目前最好的仿真单片机及外围器件的工具。虽然目前国内推广刚起步,但已受到单片机爱好者、从事单片机教学的教师、致力于单片机开发应用的科技工作者的青睐。Proteus是世界上著名的EDA工具(仿真软件),从原理图布图、代码调试到单片机与外围电路协同仿真,一键切换到PCB设计,真正实现了从概念到产品的完整设计。是目前世界上唯一将电路仿真软件、PCB设计软件和虚拟模型仿真软件三合一的设计平台,其处理器模型支持8051、HC11、PIC10/12/16/18/24/30/DsPIC33、AVR、ARM、8086和MSP430等,2010年即将增加Cortex和DSP系列处理器,并持续增加其他系列处理器模型。在编译方面,它也支持IAR、Keil和MPLAB等多种编译。[16]
STC-ISP 是一款单片机下载编程烧录软件,是针对STC系列单片机而设计的,可下载STC89系列、12C2052系列和12C5410等系列的STC单片机,使用简便,现已被广泛使用。
4.2 智能定时电源开关主程序图
在本次设计中,主程序是在单片机的控制下进行60秒循环倒计时,当时间倒计时到10秒时,继电器有电流通过进而接通被控电源电路,灯泡发光,当倒计时到0秒时,继电器没有电流通过进而断开被控电源电路,灯泡熄灭,与此同时,时间又从60秒开始倒计时,进行如上的动作,如此无限循环往复的进行下去。具体流程图如图4.1所示:
27
太原工业学院毕业设计
开始
图4.1 系统主程序图
28
系统初始化 60秒倒计时开始 倒计时过程 倒计时到10秒? N Y 继电器通,灯泡亮 N 倒计时到0秒? Y 继电器断,灯泡灭 太原工业学院毕业设计
4.3 智能定时电源开关实现程序
由于学过C语言的编程方法,而且C语言编程既简洁又方便,所以本次设计选择利用C语言编写程序来实现智能定时电源开关的功能,具体程序如下: #include
unsigned char j,k,a1,a0,s=60; unsigned int m;
unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d, 0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; void delay(unsigned char i) {
for(j=i;j>0;j--) for(k=125;k>0;k--); }
void display(unsigned char sh_c,unsigned char g_c)//个位与十位数字的显示 {
dula=0;
P0=table[sh_c]; dula=1; dula=0; wela=0; P0=0xfe; wela=1; wela=0; delay(5); P0=table[g_c]; dula=1;
29
太原工业学院毕业设计
dula=0; P0=0xfd; wela=1; wela=0; delay(5); }
void main() {
TMOD=0x01;//选择中断类型为定时器中断 TR0=1;//总中断打开
TH0=(65536-46080)/256;// 由于晶振为11.0592,故所记次数应为46080,计时器
每隔50000微秒发起一次中断。
TL0=(65536-46080)%6;//46080的来历,为50000*11.0592/12 ET0=1;//定时器中断0打开 EA=1;//使能中断打开 while(1) {
if(m==20) { m=0; } a0=s; a1=s/10; display(a1,a0); if(s==10) {
// TR0=0;//时间到,定时器关闭
JDQ=0;//继电器打开,灯泡亮。 s--;
} if(s == 0)
30