电源电路就是单片机的供电电路,一般是3.3V或者5V,具体多少要参考各种型号的单片机的工作电压,通常情况下是5V,这里是指通常情况下。
整体设计思路:
单片机中断初始化程序应完成du如下工作:
1、对TMOD赋值,以确定T0和T1的工作方式。
2、计算初值,并将其写入TH0、TL0或TH1、TL1。
3、中断方式时,则对IE赋值,开放中断。
4、使TR0或TR1置位,启动定时/计数器定时或计数。
整体设计思路
单片机的中断为向量中断,即一响应中断就转入固定入口地址执行中断服务程序。各中断源服务程序的入口地址
两个中断入口间只相隔8字节,难以安放一个完整的中断服务程序。因此,通常在中断入口地址处放置一条无条件转移指令,使程序执行转向中断服务程序入口。
定时器中断是由单片机中的定时器溢出而申请的中断。51单片机中有两个定时器T0和T1
有电路仿真原理图(10分);图中元件参数标注详细正确(10分);有操作过程说明(10分);有工作原理的文字描述(5分);对电路原理的描述全面(5分)。
1.电路仿真原理图:
电路原理描述:
共阳型数码管字模:
{~0x3F,~0x06,~0x5B,~0x4F,~0x66,~0x6D,~0x7D,~0x07,~0x7F,~0x6F }; //{0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1, 0x86,0x8e};
//0,1,2,3,4,5,6,7,8,9
中断装置和中断处理程序统称为中断系统。
中断系统是计算机的重要组成部分。实时控制、故障自动处理、计算机与外围设备间的数据传送往往采用中断系统。中断系统的应用大大提高了计算机效率。
3.工作原理:
定时器/计数器初始化的一般步骤 51 单片机内部定时器/计数器是可编程序的,通过程序设置寄存器对它进行设定和控制,因此需要进行初始化操作。
(1)确定定时器/计数器的工作方式:
通过对 TMOD 中的方式选择位 M1 和 M0 赋值实现。
(2)预置定时或计数初值:
根据定时时间或计数次数,将计算的定时或计数初值写入 TH0、TL0 或 TH1、TL1。如预置 T0 初值指令。
(3)开放定时器/计数器的中断,设定中断优先级:
通过给 IE 寄存器中的相关位赋值来实现。
(4)启动定时器/计数器:
通过给 TCON 中的 TR1 或 TR0 置 1 实现。
5电路原理:
定时器/计数器的为自动恢复初值(初值自动装入)的 8 位定时器/计 数器。TLx(x = 0,1)作为常数缓冲器,当 TLx 计数溢出时,在溢出标志 TFx 置 “1”的同时,还自动将 THx 中的初值送至 TLx,使 TLx 从初值开始重新计数。 定时器/计数器的方式 2 工作过程如下图所示。该方式可省去用户软件中重装初
值的指令执行时间,简化定时初值的计算方法,可以相当精确地确定定时时间。
单片机源程序如下:
- #include <at89x51.h>
- #define LEDCHAR P1 //LED 字符I/O 口,P1.0~7对应A~DP
- #define LEDSELECT P0 //LED 选择I/O口. P0.0~5对应LED的1~6
- unsigned char code uca_LEDCode[]=
- {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};
- //0,1,2,3,4,5,6,7,8,9
- unsigned char code uca_LEDSelect[]={0x01,0x02,0x04,0x08,0x10,0x20};
- //分别点亮第6,5,4,3,2,1号灯.
- unsigned char uca_LedNum[6];
- //存放数字的各个位
- //* 函数实现
- unsigned char * pucLedNum(unsigned long ulNumber)
- {
- if(ulNumber>999999)
- ulNumber=999999;
- if(ulNumber<0)
- ulNumber=0;
- uca_LedNum[0] = ulNumber/100000; //最高位
- uca_LedNum[1] = (ulNumber-100000*(long)uca_LedNum[0])/10000;
- uca_LedNum[2] = (ulNumber-100000*(long)uca_LedNum[0]-10000*(long)uca_LedNum[1])/1000;
- uca_LedNum[3] = (ulNumber-100000*(long)uca_LedNum[0]-10000*(long)uca_LedNum[1]
- -1000*(long)uca_LedNum[2])/100;
- uca_LedNum[4] = (ulNumber-100000*(long)uca_LedNum[0]-10000*(long)uca_LedNum[1]
- -1000*(long)uca_LedNum[2]-100*(long)uca_LedNum[3])/10;
- uca_LedNum[5] = (ulNumber-100000*(long)uca_LedNum[0]-10000*(long)uca_LedNum[1]
- -1000*(long)uca_LedNum[2]-100*(long)uca_LedNum[3]-10*(long)uca_LedNum[4]);
- return uca_LedNum;
- }
- void vShowOneNum(unsigned char ucOneNum,unsigned char ucOrder)
- {
- LEDSELECT=0;
- LEDCHAR=uca_LEDCode[ucOneNum];
- LEDSELECT=uca_LEDSelect[ucOrder]; //ucOrder:0~5(代表从左到右1~6)
- }
复制代码
上个月做的设计。附件有单片机源码,原理图等。
用AD画的原理图,和proteus仿真工程文件以及设计的文档。
都是自己原创,分享一下。
全部资料51hei下载地址:
定时器控制单只数码管循环显示0_F.rar
(72.48 KB, 下载次数: 25)
基于单片机内部定时器中断计数器设计.docx
(455.46 KB, 下载次数: 23)
|