返回主页 单片机教程XL2000开发板 单片机学习 自制编程器 单片机资料 软件下载 电子技术产品介绍如何购买 进入论坛

第一章:硬件资源模块第二章:keilc软件使用
at89s51单片机实验及实践课题     at89s51单片机实验及实践课题
1.闪烁灯2.模拟开关灯
3.多路开关状态指示4.广告灯的左移右移
5.广告灯(利用取表方式)6.报警产生器
7.I/O并行口直接驱动LED显示8.按键识别方法之一
9.一键多功能按键识别技术10.00-99计数器
11.00-59秒计时器(软件延时)12.可预置可逆4位计数器
13.动态数码显示技术14.4×4矩阵式键盘识别技术
15.定时计数器T0作定时(一)16.定时计数器T0作定时应用技术(二)
17.99秒马表设计18.“嘀、嘀、……”报警声
19.“叮咚”门铃20.数字钟(★)
21.拉幕式数码显示技术22.电子琴
23.模拟计算器数字输入及显示24.8×8LED点阵显示技术
25.点阵LED“0-9”数字显示技术26.点阵式LED简单图形显示技术
27.ADC0809A/D转换器基本应用技术28.数字电压表
29.两点间温度控制30.四位数数字温度计
31.6位数显频率计数器32.电子密码锁设计
33.4×4键盘的电子密码锁34.带有存储器功能的数字温度计-DS1624技术应用
35.DS18B20数字温度计使用

单片机c语言<>欢迎进入51单片机学习网论坛讨论

本站新域名www.8951.com开通WWW.51C51.COM 中国单片机编程技术普及推广第一站!

16.     定时计数器T0作定时应用技术(二)

1.      实验任务

AT89S51的定时/计数器T0产生2秒钟的定时,每当2秒定时到来时,更换指示灯闪烁,每个指示闪烁的频率为0.2秒,也就是说,开始L1指示灯以0.2秒的速率闪烁,当2秒定时到来之后,L2开始以0.2秒的速率闪烁,如此循环下去。0.2秒的闪烁速率也由定时/计数器T0来完成。

2.      电路原理图

4.16.1

3.      系统板硬件连线

(1.       把“单片机系统”区域中的P1.0P1.3用导线连接到“八路发光二极管指示模块”区域中的L1L4

4.      程序设计内容

(1.       由于采用中断方式来完成,因此,对于中断源必须它的中断入口地址,对于定时/计数器T0来说,中断入口地址为000BH,因此在中断入口地方加入长跳转指令来执行中断服务程序。书写汇编源程序格式如下所示:

                            ORG 00H

                            LJMP START

                            ORG 0BH        ;定时/计数器T0中断入口地址

                            LJMP INT_T0

START:               NOP          ;主程序开始

                            .

                            .

 

INT_T0:             PUSH ACC                  ;定时/计数器T0中断服务程序

                            PUSH PSW

                            .

                            .

                            POP PSW

                            POP ACC

                            RETI                   ;中断服务程序返回

                            END

(2.       定时2秒,采用16位定时50ms,共定时40次才可达到2秒,每50ms产生一中断,定时的40次数在中断服务程序中完成,同样0.2秒的定时,需要4次才可达到0.2秒。对于中断程序,在主程序中要对中断开中断。

(3.       由于每次2秒定时到时,L1L4要交替闪烁。采用ID来号来识别。当ID0时,L1在闪烁,当ID1时,L2在闪烁;当ID2时,L3在闪烁;当ID3时,L4在闪烁

5.      程序框图

T0中断服务程序框图

 

 

 

 

 

 

 

 

 

主程序框图

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

4.16.2

6.      汇编源程序

TCOUNT2S                EQU 30H

TCNT02S                    EQU 31H

ID                                 EQU 32H

                                      ORG 00H

                                      LJMP START

                                      ORG 0BH

                                      LJMP INT_T0

START:                        MOV TCOUNT2S,#00H

                                     MOV TCNT02S,#00H

                                     MOV ID,#00H

                                      MOV TMOD,#01H

                                      MOV TH0,#(65536-50000) / 256

                                      MOV TL0,#(65536-50000) MOD 256

                                      SETB TR0

                                      SETB ET0

                                      SETB EA

                                      SJMP $

INT_T0:                      MOV TH0,#(65536-50000) / 256

                                      MOV TL0,#(65536-50000) MOD 256

                                      INC TCOUNT2S

                                      MOV A,TCOUNT2S

                                      CJNE A,#40,NEXT

                                      MOV TCOUNT2S,#00H

                                      INC ID

                                      MOV A,ID

                                      CJNE A,#04H,NEXT

                                      MOV ID,#00H

NEXT:                          INC TCNT02S

                                      MOV A,TCNT02S

                                      CJNE A,#4,DONE

                                      MOV TCNT02S,#00H

                                      MOV A,ID

                                      CJNE A,#00H,SID1

                                      CPL P1.0

                                      SJMP DONE

SID1:                            CJNE A,#01H,SID2

                                      CPL P1.1

                                      SJMP DONE

SID2:                           CJNE A,#02H,SID3

                                      CPL P1.2

                                      SJMP DONE

SID3:                            CJNE A,#03H,SID4

                                      CPL P1.3

SID4:                            SJMP DONE

DONE:                        RETI

                                      END

7.      C语言源程序

#include <AT89X51.H>

 

unsigned char tcount2s;

unsigned char tcount02s;

unsigned char ID;

 

void main(void)

{

  TMOD=0x01;

  TH0=(65536-50000)/256;

  TL0=(65536-50000)%256;

  TR0=1;

  ET0=1;

  EA=1;

 

  while(1);

}

void t0(void) interrupt 1 using 0

{

  tcount2s++;

  if(tcount2s==40)

    {

      tcount2s=0;

      ID++;

      if(ID==4)

        {

          ID=0;

        }

    }

  tcount02s++;

  if(tcount02s==4)

    {

      tcount02s=0;

      switch(ID)

        {

          case 0:

            P1_0=~P1_0;

            break;

          case 1:

            P1_1=~P1_1;

            break;

          case 2:

            P1_2=~P1_2;

            break;

          case 3:

            P1_3=~P1_3;

            break;

        }

    }