找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机实验 定时器中断程序和原理图

[复制链接]
ID:786759 发表于 2020-6-22 16:14 | 显示全部楼层 |阅读模式
原理图 新工程 - Proteus 8 Professional - 原理图绘制 2020_6_22 16_10_09.png
  1. include "reg52.h"                         //此文件中定义了单片机的一些特殊功能寄存器
  2. #include<intrins.h>         



  3. typedef unsigned int u16;          //对数据类型进行声明定义
  4. typedef unsigned char u8;
  5. #define left 0
  6. #define right 1


  7. void switch_direction(u8 x);

  8. sbit k1=P3^2;  //定义按键K1
  9. sbit k2=P3^3;  //定义按键K2
  10. sbit k3=P3^5;  //定义按键K2
  11. u8 xianshi[8] = {0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
  12. char i;
  13. u16 j,m,flag_led,s_key;

  14. #define LED P2         


  15. void delay(u16 i)
  16. {
  17.         while(i--);        
  18. }


  19. void Int_Init()         //中断配置                        外部中断
  20. {
  21.         //设置INT0
  22.         IT0=1;//跳变沿出发方式(下降沿)
  23.         EX0=1;//打开INT0的中断允许。
  24.         
  25.         //设置INT1
  26.         IT1=1;//跳变沿出发方式(下降沿)
  27.         EX1=1;//打开INT1的中断允许。
  28.         
  29.                
  30.         EA=1;//打开总中断        
  31. }

  32. //定时器0中断
  33. void Timer0Init()
  34. {
  35.         TMOD|=0X01;//选择为定时器0模式,工作方式1,仅用TR0打开启动。

  36.         TH0=0XFC;        //给定时器赋初值,定时1ms
  37.         TL0=0X18;        
  38.         ET0=1;//打开定时器0中断允许
  39.         EA=1;//打开总中断
  40.         TR0=1;//打开定时器                        
  41. }

  42. void TIM1init(void)
  43. {     
  44.    TMOD=0x21;    //设置定时器1为工作方式2     
  45.    TH1=0xff;   //装入初值     
  46.    TL1=0xff;         
  47.    EA=1;    //开总中断     
  48.    ET1=1;   //开定时器中断     
  49.    TR1=1;   //启动定时器1
  50. }



  51. void main()
  52. {        
  53.     LED = 0XFF;
  54.         flag_led = 0;
  55.         s_key = right;
  56.         Int_Init();  //        设置外部中断1
  57.         Timer0Init();
  58.         TIM1init();
  59.         while(1)
  60.         {
  61.            if(flag_led == 0)
  62.            {
  63.              LED = xianshi[i];
  64.            }
  65.            else
  66.            {
  67.                      LED = 0xff;
  68.            }
  69.         }               
  70. }




  71. void Int0()        interrupt 0                //外部中断0的中断函数
  72. {
  73.         delay(1000);         //延时消抖
  74.         if(k1==0)
  75.         {
  76.                 s_key = left;
  77.         }
  78. }

  79. void Timer0() interrupt 1  //定时器1中断服务函数
  80. {
  81.         static u16 j;
  82.         TH0=0XFC;        //给定时器赋初值,定时1ms
  83.         TL0=0X18;
  84.         j++;
  85.         if(j==1000)
  86.         {
  87.                 j=0;
  88.           switch_direction(s_key);        
  89.         }        
  90. }


  91. void Int1()        interrupt 2                //外部中断1的中断函数
  92. {
  93.         delay(1000);         //延时消抖
  94.         if(k2==0)
  95.         {
  96.                 s_key = right;
  97.         }
  98. }

  99. void Timer1() interrupt 3  //定时器1中断服务函数
  100. {
  101.         TH1=0xff;
  102.         TL1=0xff;
  103.         if(k3==0)
  104.         {
  105.                 delay(1000);
  106.                 if(k3==0)
  107.                 {
  108.                     EX0 = ~EX0;
  109.                         EX1 = ~EX1;
  110.                         TR0 = ~TR0;
  111.                         flag_led = ~flag_led;
  112.                 }
  113.         }
  114.                  
  115.         
  116. }


  117. void switch_direction(u8 x)
  118. {
  119.   if(x == 0)
  120.   {
  121.     i--;
  122.   }
  123.   else
  124.   {
  125.     i++;
  126.   }
  127.   if(i==8)
  128.    {
  129.            i = 0;
  130.    }
  131.   if(i == -1)
  132.    {
  133.           i = 7;
  134.    }

  135. }
复制代码





回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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