实验2 中断和定时计数器实验

发布者:电子创新者最新更新时间:2017-01-06 来源: eefocus关键字:中断  定时  计数器 手机看文章 扫描二维码
随时随地手机看文章

1.当单片机的INT0进入低电平触发方式,进入相应的中断服务程序,P0口做输出口,接8只发光二极管,点亮发光二级管,控制蜂鸣器响。当INT1为低电平时进入中断服务程序,发光二级管灭。

接线:将P0和JP1连接、P3和JP5连接

#include

#define uchar unsigned char

#define uint unsigned int

sbit beer = P1 ^5;      //蜂鸣器

sbit button0 = P3 ^2;   //独立按键3

sbit button1 = P3 ^3;   //独立按键4

 

void int0() interrupt 0//外部中断0

{

    P0 =0;

    beer =0;

}

 

void int1() interrupt 2//外部中断1

{

    P0 =0xff;

    beer =1;

}

 

void init(){//初始化中断

    IT0 =0;

    IT1 =0;

    EA =1;       //开启中断总允许

    EX0 =1;   //外部中断0允许位

    EX1 =1;   //外部中断2允许位

}

 

int main(){

    init();

    while(1){}//让程序跑死

    return0;

}

 

 

2.选择外部中断0(P3.2),边沿触发,进入相应中断服务程序,在中断服务程序中,数码管显示加1,在0-9之间循环

 

接线:JP5+P3;J12+P0

 

#include

#define uchar unsigned char

#define uint unsigned int

uint code NumTable[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//数字的编码

sbit button0 = P3 ^2;   //独立按键3

uchar Count=0;

 

//延时函数

void delay_1ms(uint x){

    uint i=x;

    uint j;

    for(;i>0;--i){

       for(j=110;j>0;--j);

    }

}

/**

    在数码管上显示对应的值

**/

void display(uchar Num)

{

    P0=NumTable[Num];

    delay_1ms(1);

    P0=0;      //送完段选信号后,进行消影的处理

}

 

 

void int0() interrupt 0//外部中断0

{

    Count++;

}

 

void init(){//初始化中断

    IT0 =1;

    EA =1;    //开启中断总允许

    EX0 =1;   //外部中断0允许位

}

 

int main(){

    init();       //初始化

    while(1){

       if(Count==10){

           Count=0;

       }else{

           display(Count);

       }

    }

    return0;

}

3实验板上完成如下功能:用定时0实现8个发光二极管以1s间隔闪烁,用定时器1实现数码管的前两位59s循环计时。

#include

#define uint unsigned int

#define uchar unsigned char

/**

用定时0实现8个发光二极管以1s间隔闪烁,用定时器1实现数码管的前两位59s循环计时。

1、定时器0的初始化

2、时钟1s的计算

3、定时器1循环计时

接线方式:

1、P0接数码管J12,实现段选

2、译码器和数码管位选输入短接,J15+J16

3、P3控制发光二极管,P3+JP1

4、P2用来控制译码器的输入

**/

 

//========全局变量区============================================

uint code NumTable[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//数字的编码

sbit high=P2^4;

sbit mid=P2^3;

sbit low=P2^2;

uint T_High_50ms=(65536-45872)/256;

uint T_Low_50ms=(65536-45872)%256;

uchar Count,Count_T1,Count_1s;//Count用来记录每50ms的计数,Count_T1用来记录1s的次数

//========全局变量区结束========================================

 

//========函数区================================================

 

//延时

void delay_1ms(uint x){

    uint i=x;

    uint j;

    for(;i>0;--i){

       for(j=110;j>0;--j);

    }

}

 

/**

    在数码管上显示对应的值

**/

void display(unsignedchar Num)

{

    P0=NumTable[Num];

    delay_1ms(1);

    P0=0;      //送完段选信号后,进行消影的处理

}

 

/**

    控制数码管显示后3位,并分解计数值

**/

void DisplayNumByOrder(uint Count){

       low=0; mid=0; high=0;  display(0);        

        low=1; mid=0; high=0;  display(0);               

        low=0; mid=1; high=0;  display(0);

       low=1; mid=1; high=0;  display(0);

       low=0; mid=0; high=1;  display(0);

       low=1; mid=0; high=1;  display(0);

       low=0; mid=1; high=1;  display(Count%100/10);

       low=1; mid=1; high=1;  display(Count%10);

}

/**

    初始化

**/

void init(){//初始化中断

 

    TMOD=0x01;        // 对TMOD赋值,以确定T0和T1的工作方式。

    TH0=TH1=T_High_50ms;// 计算初值,并将其写入TH0、TL0或TH1、TL1。

    TL0=TL1=T_Low_50ms;

    EA =1;//开启中断总允许

    ET0 =ET1=1; 

    IT0 =IT0=1;  //开启定时器0,1中断允许

    TR0=TR1=1;     // 使TR0或TR1置位,启动定时/计数器定时或计数

    Count=Count_T1=Count_1s=0;//计数

}

 

void main(){

    init();

    while(1){

       if(Count==20){//定时器0 1s时间到

           Count=0;  //开始下一轮1s的计时

           P3=~P3;

       }

       if(Count_T1==20){//定时器1 1s时间到

           Count=0;

           Count_1s++;  

       }

       if(Count_1s==60){

           Count_1s=0;

       }

       DisplayNumByOrder(Count_1s);//在数码管上显示对应的数值

    }

}

 

//========函数区结束============================================

 

//========中断函数区============================================

/**

    用定时0实现8个发光二极管以1s间隔闪烁

**/

void int0() interrupt 1//定时/计数器T0中断

{

 

    TH0=T_High_50ms;// 计算初值,并将其写入TH0、TL0或TH1、TL1。

    TL0=T_Low_50ms;

    Count++;

}

 

/**

    用定时器1实现数码管的前两位59s循环计时。

**/

void int1() interrupt 3//定时/计数器T1中断

{

    TH1=T_High_50ms;// 计算初值,并将其写入TH0、TL0或TH1、TL1。

    TL1=T_Low_50ms;

    Count_T1++;

}

 

//========中断函数结束==========================================

4、同时用两个定时器控制蜂鸣器发声,定时器0控制频率,定时器1控制同个频率持续的时间,间隔300ms依次输出1,10,50,100,200,400,800,1k(hz)的方波。

#include

#define uchar unsigned char

#define uint unsigned int

 

/**

同时用两个定时器控制蜂鸣器发声,

定时器0控制频率,定时器1控制同个频率持续的时间,

间隔300ms依次输出1,10,50,100,200,400,800,1Table_Index(hz)的方波。

**/

 

#include

#define uchar unsigned char

#define uint unsigned int

 

uchar code Table_F[]={1,10,50,100,200,400,800,1000};  //频率表

 

uint Count_T0 =0;

uchar Table_Index =0;  //频率表下标

uint Count_T1 =0;

sbit beep = P1 ^5;     

uint f;                //频率

uint T_High_50ms=(65536-45872)/256;

uint T_Low_50ms=(65536-45872)%256;

 

 

void timer0() interrupt 1

{

    Count_T0++;

    if(Count_T0 ==6){//间隔300ms

       Table_Index++;

       if(Table_Index ==8)

           Table_Index =0;

       f = Table_F[Table_Index];      

       Count_T0 =0;

    }

    TL0 = T_High_50ms;     //50MS

    TH0 = T_Low_50ms;

}

//控制输出的频率

//1、

void timer1() interrupt 3

{

    /*因为1秒=20*50ms。1ms=1000us。Count_T1每次+1间隔50ms。20000/f 为1秒内要有多少个50ms。

    */

    Count_T1++;

    if(Count_T1 ==20000/ f){//20000=1000*20

       beep =~beep;

       Count_T1 =0;

    }

    TL1 = T_High_50ms;

    TH1 = T_Low_50ms;

}

 

void init(){

    TMOD=0x01;    // 对TMOD赋值,以确定T0和T1的工作方式。

    EA =1;           //开启中断总允许

    ET0 =ET1=1;  //开启定时器0,1中断允许

    TR0=TR1=1;     // 使TR0或TR1置位,启动定时/计数器定时或计数

    TH0=TH1=T_High_50ms;// 计算初值,并将其写入TH0、TL0或TH1、TL1。

    TL0=TL1=T_Low_50ms;

}

 

int main(){

    f = Table_F[0];

    init();

    while(1){

    }

    return0;

}

5. 利用动态扫描和定时器1在数码管上显示出从765432开始以1/10秒的速度往下递减直至765398并保持显示此数,与此同时利用定时器0以500MS速度进行流水灯从上至下移动,当数码管上数减到停止时,实验板上流水灯也停止然后全部开始闪烁,3秒后(用T0定时)流水灯全部关闭、数码管上显示出“HELLO”,到此保持住。

#include

#define uchar unsigned char

#define uint unsigned int

 

/**

利用动态扫描和定时器1在数码管上显示出从765432开始以1/10秒的速度往下递减直至765398并保持显示此数,与此同时利用定时器0以500MS速度进行流水灯从上至下移动,当数码管上数减到停止时,实验板上流水灯也停止然后全部开始闪烁,3秒后(用T0定时)流水灯全部关闭、数码管上显示出“HELLO”,到此保持住。

**/

 

#include

#define uchar unsigned char

#define uint unsigned int

#define ulong unsigned long

/**

 

接线方式:

1、P0接数码管J12,实现段选

2、译码器和数码管位选输入短接,J15+J16

3、P3控制发光二极管,P3+JP1

4、P2用来控制译码器的输入

**/

//=========全局变量区============================================

sbit high=P2^4;

sbit mid=P2^3;

sbit low=P2^2;

uint code NumTable[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//数字的编码

uint code CharTable[]={0x3f,0x38,0x38,0x79,0x76};//数字的编码

uint water_led_table[]={~0x01,~0x02,~0x04,~0x08,~0x10,~0x20,~0x40,~0x80};

uint Count_T0,Count_T1,Count_3s,Water_Led_Index =0;

uchar Switch=1;//用来控制显示字母和控制流水灯

ulong Counter=765432;

uint T_High_50ms=(65536-45872)/256;

uint T_Low_50ms=(65536-45872)%256;

//=========全局变量区结束========================================

 

 

//========中断函数区============================================

void timer0() interrupt 1

{

    Count_T0++;

}

 

void timer1() interrupt 3

{

    //利用动态扫描和定时器1在数码管上显示出从765432开始

    //以1/10秒的速度往下递减直至765398并保持显示此数

    Count_T1++;

}

 

//========中断函数区结束==========================================

 

 

//========函数区================================================

/**

    是否需要递减

**/

void IsMinus(){

    if(Counter>(ulong)765398){

       Counter--;

    }else{

       Switch=0;//3秒后显示Hello,流水灯关闭

    }

}

//延时

void delay_1ms(uint x){

    uint i=x;

    uint j;

    for(;i>0;--i){ 

       for(j=110;j>0;--j);

    }

}

 

/**

    在数码管上显示对应的值

**/

void display(unsignedchar Num)

{

    P0=NumTable[Num];

    delay_1ms(1);

    P0=0;      //送完段选信号后,进行消影的处理

}

/**

    显示字母

**/

void displayChar(unsignedchar Num)

{

    P0=CharTable[Num];

    delay_1ms(1);

    P0=0;      //送完段选信号后,进行消影的处理

}

/**

    控制数码管显示后6位,显示Hello

**/

void DisplayNumByOrder(ulong Count){

       low=0; mid=0; high=0;  display(0);        

        low=1; mid=0; high=0;  display(0);               

        low=0; mid=1; high=0;  display(Count%1000000/100000);

       low=1; mid=1; high=0;  display(Count%100000/10000);

       low=0; mid=0; high=1;  display(Count%10000/1000);

       low=1; mid=0; high=1;  display(Count%1000/100);

       low=0; mid=1; high=1;  display(Count%100/10);

       low=1; mid=1; high=1;  display(Count%10);

}

/**

    控制数码管显示后6位,并分解计数值

**/

void DisplayHello(){

       low=0; mid=0; high=0;  display(0);        

        low=1; mid=0; high=0;  display(0);               

        low=0; mid=1; high=0;  display(0);

       low=1; mid=1; high=0;  displayChar(4);

       low=0; mid=0; high=1;  displayChar(3);

       low=1; mid=0; high=1;  displayChar(2);

       low=0; mid=1; high=1;  displayChar(1);

       low=1; mid=1; high=1;  displayChar(0);

}

/**

    初始化

**/

void init(){

    TMOD=0x11;    // 对TMOD赋值,以确定T0和T1的工作方式。

    EA =1;           //开启中断总允许

    ET0 =ET1=1;  //开启定时器0,1中断允许

    TR0=TR1=1;     // 使TR0或TR1置位,启动定时/计数器定时或计数

    TH0=TH1=T_High_50ms;// 计算初值,并将其写入TH0、TL0或TH1、TL1。

    TL0=TL1=T_Low_50ms;

}

/**

    显示方式的选择

**/

void DisplayStyle(){

    if(Count_3s<6){

           DisplayNumByOrder(Counter);//在数码管上显示对应的数值

       }else{

           DisplayHello();

       }  

}

/**

    流水灯

**/

void WaterLed(){

    P3=water_led_table[Water_Led_Index];

    if(Water_Led_Index==8){

       Water_Led_Index=0;

    }else{

       Water_Led_Index++;

    }

   

}

 

/**

    等待3秒

**/

void WaitingFor3s(){

    if(Switch==0){

       Count_3s++;

    }

}

int main(){

   

    init();

    while(1){

       if(Count_T0 ==10&&Count_3s<6){//计时中断0 间隔500ms循环移动数码管

           WaterLed();

           Count_T0 =0;

           WaitingFor3s();

      

           TL0 = T_High_50ms;     //50MS 

           TH0 = T_Low_50ms;

       }else{

           P3=0xff;//流水灯关闭

       }

       if(Count_T1 ==2&&Switch){//计时中断1  LED显示

           IsMinus();

           Count_T1=0;

           TL1 = T_High_50ms;

           TH1 = T_Low_50ms;

       }

       DisplayStyle();

    }

    return0;

}

//========函数区结束============================================


关键字:中断  定时  计数器 引用地址:实验2 中断和定时计数器实验

上一篇:51单片机堆栈深入剖析
下一篇:实验3 串口通信

推荐阅读最新更新时间:2024-03-16 15:29

联通光纤入户工程中断 疑因物业索高额入户费
近日,望京南湖东园一区的联通光纤入户工程过半,施工队却撤出小区。昨天下午,中国联通(微博)北京分公司负责人证实,由于物业与联通双方协商不畅,久未签订合作协议,该小区的光纤入户只能被暂时搁置。 市民李先生住在望京南湖东园一区。今年3月初,李先生在网上得知北京联通宽带提速计划,需要在线申请光纤入户,但申请几次均未成功。 李先生联系到负责该地区光纤入户的施工人员,对方称,物业与施工方暂未达成协议,因此不能安装光纤宽带。李先生称,对方告诉他,物业向施工方索要每栋楼一两万的入户费,他们不同意,物业就把施工队轰出去了。 对此,久筑物业公司值班经理董先生表示,从未听说物业向联通公司索要入户费。董先生说:“联通的施工队从来没有负
[网络通信]
利用单片机定时器T0产生定时脉冲编程
利用定时器T0产生定时脉冲。每隔2ms产生宽度为2个机器周期的正脉冲,由P1.0输出此定时序列脉冲信号(设时钟频率为6MHZ)。 答:首先求出定时器T0初值。由于时钟频率为6MHZ,所以,机器周期为2µs。 因为:t=(213-T0初值)´ 机器周期 所以,当t=2ms时,则:(213-T0初值)´ 2´10-6=2´10-3 解得:T0初值=7096=11011101 11000B,其中将高8位11011101 B=DDH赋给TH0,低5位11000B=18H赋给TL0。 方法一: 采用查询工作方式, 编程 如下: ORG 0000H AJMP MAIN
[单片机]
AVR的外部中断INT示例程
使用AVR的外部中断INT1检测PD3Key,如果有按键按下,则唤醒休眠的MCU,并使它的PB口的LED做加1指示。 #include iom16v.h #include D:ICC_HCmmICC.H #define DISP_DDR DDRB #define DISP_PORT PORTB #define IN_PD3 cbi(DDRD,3) //PD3 #define SET_PD3 sbi(PORTD,3) #define GET_PD3 gbi(PIND,3) /*---------------------------------------------------
[单片机]
编程点滴:8位AVR定时器比较匹配中断测试程序
程序实现以Timer0比较匹配中断方式控制LED以500ms为间隔产生亮灭变化。 TCCR0寄存器的WGM0位配置为CTC模式时,当比较匹配发生时会自动清除计数器,无需对TCNT0手动置零。 文件组成:测试程序 main.c ,定时器配置程序 timer_8bit_test2.c 和头文件 timer_8bit_test2.h 。 main.c /* ******************************************* * File name: main.c * Function: 8位定时器比较匹配中断方式测试程序 * Description: 定时器控制LED以500ms间隔闪烁 * Author
[单片机]
基于嵌入式ARM的LCD图像显示系统设计
0 引 言 随着嵌入式技术迅猛发展和Linux在信息行业中广泛应用,利用嵌入式Linux系统实现图像采集处理已有可能。实时获得图像数据是实现这些应用的重要环节。本文使用的系统硬件平台采用Samsung公司的处理器S3C2410,并以此为基础,在基于嵌入式Linux系统平台上设计了建立图像视频的一种方法。 1 系统硬件电路设计 S3C2410芯片处理器内部集成了ARM公司ARM920T处理器核的32位微控制器,资源丰富,带独立的16 kB的指令Cache和16 kB数据Cache、LCD(液晶显示器)控制器、RAM控制器、NAND闪存控制器、3路UART、4路DMA、4路带PWM的定时器、并行I/O口、8路10位ADC、Tou
[嵌入式]
STM32入门学习笔记之中断架构(上)
3.1 STM32F103中断概述 Cortex-M3内核支持256个中断,其中包含了16个内核中断和240个外部中断,并且具有256级的可编程中断设置。但STM32并没有使用Cortex-M3内核的全部东西,而是只用了它的一部分。STM32有84个中断,包括16个内核中断和68个可屏蔽中断,具有16级可编程的中断优先级。而我们常用的就是这68个可屏蔽中断,但是STM32的68个可屏蔽中断,在STM32F103ZET6中只有60个。 3.2 STM32F103中断优先级 3.2.1 优先级结构 STM32F103的中断分为抢占优先级和响应优先级两种,这两种优先级的顺序是抢占优先级高于响应优先级,假设存在两个事件,那就会存在以下
[单片机]
存在串扰时的抖动和定时分析
串行数据标准数量不断激增,明显改善了PC、服务器系统的性能。对这些更高速的标准执行测试,找到抖动迹象对设计的长期稳定性及实现优秀的误码率(BER)目标至关重要。要进行高效分析,首先要选择正确的仪器,要很好地了解仪器噪声、上升时间以及三阶谐波、四阶谐波、五阶谐波性能等因素。 但这远不只是进行测量 适当的仪器必需与适当的分析工具配套使用。在测试8 Gb/sec以上的串行数据速率时,抖动分隔、反嵌/嵌入等也是重要的考虑因素。在本文中,我们将重点介绍存在串扰时隔离抖动的一种新方法,随着通路数量提高、以提升计算系统吞吐量,串扰问题正变得日益明显。 使用电压跳变表示定时信息的所有电气系统都有定时抖动。在历史上,电气系统通过采用相对较低的信
[测试测量]
存在串扰时的抖动和<font color='red'>定时</font>分析
用ST16C2552实现DSP高速串行通讯扩展
1 引言 随着大规模集成电路工艺技术的迅速发展,DSP已经越来越广泛地应用于工业场合。工业现场由于许多场合通讯双方相距较远,为了保证通讯成本和可靠性,必须采用串行方式进行通讯。目前TI公司DSP都只有一个UART口,比如TMS320LF2407,当同时需要与上位机和下面的被控对象进行通讯,或者同时连接几个上位机时,则需要对DSP进行串行通讯口扩展,而使用可编程的ST16C2552可以一次扩展两组相互独立的串口,满足各种条件下串行通讯的要求。 2 ST16C2552介绍 ST16C2552是Exar公司生产的通用异步通讯扩展器件,并与飞利浦公司的SC16C2552相兼容,可扩展2路独立的串行通讯,可编程设定通讯起始位、停止位和
[工业控制]
热门资源推荐
热门放大器推荐
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
  • 学习ARM开发(16)
    ARM有很多东西要学习,那么中断,就肯定是需要学习的东西。自从CPU引入中断以来,才真正地进入多任务系统工作,并且大大提高了工作效率。采 ...
  • 学习ARM开发(17)
    因为嵌入式系统里全部要使用中断的,那么我的S3C44B0怎么样中断流程呢?那我就需要了解整个流程了。要深入了解,最好的方法,就是去写程序 ...
  • 学习ARM开发(18)
    上一次已经了解ARM的中断处理过程,并且可以设置中断函数,那么它这样就可以工作了吗?答案是否定的。因为S3C44B0还有好几个寄存器是控制中 ...
  • 嵌入式系统调试仿真工具
    嵌入式硬件系统设计出来后就要进行调试,不管是硬件调试还是软件调试或者程序固化,都需要用到调试仿真工具。 随着处理器新品种、新 ...
  • 最近困扰在心中的一个小疑问终于解惑了~~
    最近在驱动方面一直在概念上不能很好的理解 有时候结合别人写的一点usb的例子能有点感觉,但是因为arm体系里面没有像单片机那样直接讲解引脚 ...
  • 学习ARM开发(1)
  • 学习ARM开发(2)
  • 学习ARM开发(4)
  • 学习ARM开发(6)
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved