找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 9|回复: 0
收起左侧

我的基于单片机内部定时器中断计数器设计,含源码,仿真原理图

[复制链接]
1319261399 发表于 2020-9-15 13:22 | 显示全部楼层 |阅读模式
电源电路就是单片机的供电电路,一般是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.电路仿真原理图:
OIZT1LJ8[5{3{FL{]$PSW[7.png

电路原理描述:
共阳型数码管字模:
{~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 工作过程如下图所示。该方式可省去用户软件中重装初
值的指令执行时间,简化定时初值的计算方法,可以相当精确地确定定时时间。

单片机源程序如下:
  1. #include <at89x51.h>
  2. #define LEDCHAR P1                        //LED 字符I/O 口,P1.0~7对应A~DP
  3. #define LEDSELECT P0                //LED 选择I/O口.   P0.0~5对应LED的1~6

  4. unsigned  char code uca_LEDCode[]=
  5.                         {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};
  6.                                         //0,1,2,3,4,5,6,7,8,9


  7. unsigned char code uca_LEDSelect[]={0x01,0x02,0x04,0x08,0x10,0x20};        
  8.                                         //分别点亮第6,5,4,3,2,1号灯.

  9. unsigned char uca_LedNum[6];                        
  10.                                         //存放数字的各个位

  11. //*                        函数实现

  12. unsigned char * pucLedNum(unsigned long ulNumber)
  13. {
  14.         if(ulNumber>999999)
  15.                 ulNumber=999999;
  16.         if(ulNumber<0)
  17.                 ulNumber=0;
  18.         uca_LedNum[0] = ulNumber/100000;                                                                   //最高位

  19.         uca_LedNum[1] = (ulNumber-100000*(long)uca_LedNum[0])/10000;

  20.         uca_LedNum[2] = (ulNumber-100000*(long)uca_LedNum[0]-10000*(long)uca_LedNum[1])/1000;

  21.         uca_LedNum[3] = (ulNumber-100000*(long)uca_LedNum[0]-10000*(long)uca_LedNum[1]
  22.                                         -1000*(long)uca_LedNum[2])/100;

  23.         uca_LedNum[4] = (ulNumber-100000*(long)uca_LedNum[0]-10000*(long)uca_LedNum[1]
  24.                                         -1000*(long)uca_LedNum[2]-100*(long)uca_LedNum[3])/10;

  25.         uca_LedNum[5] = (ulNumber-100000*(long)uca_LedNum[0]-10000*(long)uca_LedNum[1]
  26.                                         -1000*(long)uca_LedNum[2]-100*(long)uca_LedNum[3]-10*(long)uca_LedNum[4]);

  27.         return uca_LedNum;
  28. }



  29. void vShowOneNum(unsigned char ucOneNum,unsigned char ucOrder)
  30. {
  31.         LEDSELECT=0;
  32.         LEDCHAR=uca_LEDCode[ucOneNum];
  33.         LEDSELECT=uca_LEDSelect[ucOrder];                 //ucOrder:0~5(代表从左到右1~6)
  34. }
复制代码

上个月做的设计。附件有单片机源码,原理图等。
用AD画的原理图,和proteus仿真工程文件以及设计的文档。

都是自己原创,分享一下。
@3Q0O2U[QFKA3@ZMF158IFL.png
全部资料51hei下载地址:
定时器控制单只数码管循环显示0_F.rar (72.48 KB, 下载次数: 0)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表