历史上的今天
返回首页

历史上的今天

今天是:2025年07月24日(星期四)

正在发生

2018年07月24日 | PIC单片机-定时器的应用

2018-07-24 来源:eefocus

一、利用定时器Timer0的定时功能,设计一个倒计时,显示在数码管上。


#include

 

#define uint8 unsigned char

#define uint16 unsigned int

 

#define SCK_595 RA5

#define RCK_595 RE0

#define SER_595 RC0

 

__CONFIG(WDTDIS & LVPDIS & HS & PWRTDIS & BORDIS);//设置配置位

//WDTDIS:disable watchdog timer 看门狗禁止

//LVPDIS:low voltage programming disabled 低电压编程禁止

//HS:high speed crystal/resonator 4M以上晶振选择HS高速

//PWRTDIS:disable power up timer

//BORDIS:disable brown out reset

 

/*************************定义全局变量******************************************/

uint8 Time_Value;

uint16 count;

const uint8 disp[] = {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};//0~9共阳数码管段码表

 

/************************声明函数***********************************************/

 

void DelayUS(uint8 delay);

void LED_Display(uint8 chosebit,uint8 wdata);

void HC595_Init(void);

void HC595_Write_Byte(uint8 data);

 

/*******************************************************************************

* 函 数 名: DelayUS(uint8 delay)

* 函数功能: 微秒延时   for 20MHZ

* 入口参数: delay

* 返    回: 无

*******************************************************************************/

 

void DelayUS(uint8 delay)

{

while(--delay);

}

 

/******************************************************************************

* 函 数 名: HC595_Init(void)

* 函数功能: 74HC595初始化

* 入口参数: 无

* 返    回: 无

*******************************************************************************/

void HC595_Init(void)

{

ADCON1 = 0x8E;

TRISA5 = 0;

TRISE0 = 0;

TRISC0 = 0;

}

 

/******************************************************************************

* 函 数 名: HC595_Write_Byte(uint8 data)

* 函数功能: 74HC595写8位数据

* 入口参数: 无

* 返    回: 无

*******************************************************************************/

void HC595_Write_Byte(uint8 data)

{

uint8 i;

for(i=0;i<8;i++)

{

if(data&0x80)

{

SER_595 = 1;

}

else

{

SER_595 = 0;

}

SCK_595 = 0;

data <<= 1;;;

SCK_595 = 1;

}

RCK_595 = 0;

    ;;

RCK_595 = 1;

}

 

/*******************************************************************************

* 函 数 名: LED_Display(uint8 chosebit,uint8 wdata)

* 函数功能: 单个数码管显示

* 入口参数: chosebit选择字位,wdata字型

* 返    回: 无

*******************************************************************************/

 

void LED_Display(uint8 chosebit,uint8 wdata)

{

if((chosebit<0) || (chosebit>4))

return;

ADCON1 = 0x86; //10000110 PORTA口设置为数字IO口

TRISA &= 0x00;

TRISE &= 0xEF; //配置PORTD为普通IO口,对PORTD的操作务必加上这句

TRISD = 0x00; //数据线配置为输出

PORTA = (PORTA & 0xE3) | ((chosebit+3) << 2); //RA2:RA3:RA4:011 选通第一位 100选通第二位 101选通第三位 110选通第四位

PORTD = disp[wdata]; //送显示数字的断码

DelayUS(100); //延时

PORTD = 0xFF; //关闭显示

}

 

/******************************************************************************

* 函 数 名: main(void)

* 函数功能: 利用定时器0进行倒计时

* 入口参数: 无

* 返    回: 无

*******************************************************************************/

 

void main(void)

{

HC595_Init(); //74HC595初始化

HC595_Write_Byte(0x00); //写0x00数据,关掉LED点阵显示

 

OPTION = 0x00; //设置定时器0为定时器,2分频

TMR0 = 0x05; //定时器0  (255-5)*2*200ns = 100us

T0IF = 0; //清中断标志

T0IE = 1; //开定时器0中断

PEIE = 1; //开外设中断

GIE = 1; //开总中断

Time_Value = 99;

while(1)

{

LED_Display(3,Time_Value%10); //显示个位数

LED_Display(2,Time_Value/10); //显示十位数

}

}

 

/******************************************************************************

* 函 数 名: interrupt Time0(void)

* 函数功能: 中断处理程序

* 入口参数: 无

* 返    回: 无

*******************************************************************************/

 

void interrupt Time0(void)

{

GIE = 0; //关总中断

if(T0IF) //定时器0计数溢出

{

T0IF = 0; //清中断标志

count++; //计数器加1

if(count >= 10000) //计数器到10000,即1s

{

count = 0;

if(Time_Value == 0)

{

Time_Value = 100;

}

Time_Value--; //时间减1

}

TMR0 = 0x05;

}

GIE = 1; //开总中断

}

二、利用定时器Timer1的定时功能,设计一个倒计时,显示在数码管上。


/*******************************************************************************

* 跳线接法:断开P14短接帽

* 功能描述: 使用中断函数利用定时器1的定时功能,设计一个倒计时,显示在数码管上

*******************************************************************************/

#include

 

#define uint8 unsigned char

#define uint16 unsigned int

 

#define     SCK_595     RA5

#define     RCK_595     RE0

#define     SER_595     RC0

 

__CONFIG(FOSC_HS &WDTE_OFF &BOREN_OFF &PWRTE_OFF &LVP_OFF);    //设置配置位

//WDTE_OFF:disable watchdog timer       看门狗禁止

//LVP_OFF:low voltage programming disabled  低电压编程禁止

//FOSC_HS:high speed crystal/resonator  4M以上晶振选择HS高速

//PWRTDIS:disable power up timer

//BOREN_OFF:disable brown out reset

 

/*************************定义全局变量******************************************/

uint8 Time_Value;

uint16 count;

const uint8 disp[] = {0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90}; //0~9共阳数码管段码表

 

/************************声明函数***********************************************/

 

void DelayUS(uint8 delay);

void LED_Display(uint8 chosebit, uint8 wdata);

void HC595_Init(void);

void HC595_Write_Byte(uint8 data);

void TIMER1_Init(void);

 

/*******************************************************************************

* 函 数 名: DelayUS(uint8 delay)

* 函数功能: 微秒延时   for 20MHZ

* 入口参数: delay

* 返    回: 无

*******************************************************************************/

 

void DelayUS(uint8 delay)

{

    while(--delay);

}

 

/******************************************************************************

* 函 数 名: HC595_Init(void)

* 函数功能: 74HC595初始化

* 入口参数: 无

* 返    回: 无

*******************************************************************************/

void HC595_Init(void)

{

    ADCON1 = 0x8E;

    TRISA5 = 0;

    TRISE0 = 0;

    TRISC0 = 0;

}

 

/******************************************************************************

* 函 数 名: HC595_Write_Byte(uint8 data)

* 函数功能: 74HC595写8位数据

* 入口参数: 无

* 返    回: 无

*******************************************************************************/

void HC595_Write_Byte(uint8 data)

{

    uint8 i;

    for(i = 0; i < 8; i++)

    {

        if(data & 0x80)

        {

            SER_595 = 1;

        }

        else

        {

            SER_595 = 0;

        }

        SCK_595 = 0;

        data <<= 1;;;

        SCK_595 = 1;

    }

    RCK_595 = 0;

    ;;

    RCK_595 = 1;

}

 

/*******************************************************************************

* 函 数 名: LED_Display(uint8 chosebit,uint8 wdata)

* 函数功能: 单个数码管显示

* 入口参数: chosebit选择字位,wdata字型

* 返    回: 无

*******************************************************************************/

 

void LED_Display(uint8 chosebit, uint8 wdata)

{

    if((chosebit < 0) || (chosebit > 4))

        return;

    ADCON1 = 0x86;  //10000110  PORTA口设置为数字IO口

    TRISA &= 0x00;

    TRISE &= 0xEF;      //配置PORTD为普通IO口,对PORTD的操作务必加上这句

    TRISD = 0x00;       //数据线配置为输出

    PORTA = (PORTA & 0xE3) | ((chosebit + 3) << 2); //RA2:RA3:RA4:011 选通第一位 100选通第二位 101选通第三位 110选通第四位

    PORTD = disp[wdata];    //送显示数字的断码

    DelayUS(100);       //延时

    PORTD = 0xFF;       //关闭显示

}

 

/*******************************************************************************

* 函 数 名: void TIMER1_Init(void)

* 函数功能: TIMER1溢出中断初始化

* 入口参数: 无

* 返    回: 无

*******************************************************************************/

 

void TIMER1_Init(void)

{

    T1CON = 0x01; //开TIMER1

    TMR1H = 0xFC; /*置初值,TMR1每1ms中断一次。因为写入TMR1后接着的两个周期不能增量,

中断需要3个周期的响应时间,以及C语言自动进行现场保护要消耗周期,取修正值15,所以只需

要定时1000-15=985us,初值=65535-985=0xFC27*/

    TMR1L = 0x27;

    TMR1IF = 0; //清定时器1中断标志

    TMR1IE = 1; //开定时器1中断

    PEIE = 1; //开外设中断

    GIE = 1;  //开总中断

    Time_Value = 99;

}

 

/******************************************************************************

* 函 数 名: main(void)

* 函数功能: 利用定时器0进行倒计时

* 入口参数: 无

* 返    回: 无

*******************************************************************************/

 

void main(void)

{

    HC595_Init();               //74HC595初始化

    HC595_Write_Byte(0x00);     //写0x00数据,关掉LED点阵显示

    TIMER1_Init();              //定时器1初始化

    while(1)

    {

        LED_Display(3, Time_Value % 10);    //显示个位数

        LED_Display(2, Time_Value / 10);    //显示十位数

    }

}

 

/******************************************************************************

* 函 数 名: interrupt Time0(void)

* 函数功能: 中断处理程序

* 入口参数: 无

* 返    回: 无

*******************************************************************************/

 

void interrupt Time1(void)

{

    GIE = 0;                //关总中断

    if(TMR1IF)              //定时器1计数溢出

    {

        TMR1IF = 0;         //清中断标志

        count++;            //计数器加1

        if(count >= 1000)   //计数器到1000,即1s

        {

            count = 0;

            if(Time_Value == 0)

            {

                Time_Value = 100;

            }

            Time_Value--;   //时间减1

        }

        TMR1H = 0xFC;

        TMR1L = 0x27;

    }

    GIE = 1;                //开总中断

}


推荐阅读

史海拾趣

Gamewell-FCI ( Honeywell )公司的发展小趣事

在电子行业中,Gamewell-FCI作为霍尼韦尔(Honeywell)旗下的重要品牌,其发展历程充满了诸多关键节点和里程碑事件。以下是五个与Gamewell-FCI(Honeywell)公司发展相关的故事,每个故事均基于事实描述:

1. Gamewell-FCI的起源与并入霍尼韦尔

Gamewell-FCI的起源可以追溯到其前身Gamewell Fire Alarm Telegraph Company,该公司成立于19世纪末,以生产创新的火灾报警系统而闻名。随着技术的不断进步和市场需求的扩大,Gamewell逐渐发展成为火灾安全领域的领导者。20世纪后期,Gamewell被FCI(Fire Control Instruments)收购,进一步巩固了其在消防报警技术领域的地位。随后,随着霍尼韦尔在工业自动化和安全领域的扩展,Gamewell-FCI被并入霍尼韦尔大家庭,成为其安全与生产力解决方案集团的一部分。这一合并不仅为Gamewell-FCI带来了更广阔的市场和资源,也使其能够继续推动消防安全技术的创新与发展。

2. 技术创新与产品线扩展

在并入霍尼韦尔后,Gamewell-FCI凭借其深厚的技术底蕴和创新能力,不断推出新产品和技术解决方案。从传统的火灾报警系统到先进的智能火灾探测和预警系统,Gamewell-FCI始终走在行业前列。公司还积极拓展产品线,涵盖了气体检测、紧急通讯、安全疏散等多个领域,为客户提供全方位的消防安全解决方案。这些技术创新和产品线扩展不仅增强了Gamewell-FCI的市场竞争力,也为其在全球范围内的业务扩展奠定了坚实基础。

3. 全球化布局与战略合作

随着全球化进程的加速,Gamewell-FCI也积极实施全球化战略,通过在全球各地设立分支机构、与当地企业建立合作关系等方式,不断扩大其市场覆盖面。同时,公司还注重与行业内的领军企业建立战略合作关系,共同推动消防安全技术的创新与发展。这些合作不仅为Gamewell-FCI带来了更多的商业机会,也促进了全球消防安全领域的交流与合作。

4. 应对市场挑战与转型

面对不断变化的市场环境和客户需求,Gamewell-FCI始终保持着敏锐的洞察力和灵活的反应能力。当传统消防安全市场逐渐饱和时,公司及时调整战略方向,将重心转向智能消防、物联网等新兴领域。通过引入先进的物联网技术、大数据分析等手段,Gamewell-FCI成功实现了从传统消防设备制造商向智能消防安全解决方案提供商的转型。这一转型不仅为公司带来了新的增长点,也为其在全球消防安全领域的领先地位提供了有力支撑。

5. 可持续发展与社会责任

作为霍尼韦尔的一部分,Gamewell-FCI始终将可持续发展和社会责任视为企业发展的重要组成部分。公司致力于通过技术创新和高效运营来降低产品对环境的影响,并积极推广节能减排、绿色建筑的理念。同时,Gamewell-FCI还积极参与社会公益事业,为灾区提供紧急救援、为教育机构提供安全培训等,展现了其作为行业领导者的社会责任感。这些努力不仅提升了公司的品牌形象和社会声誉,也为公司的长远发展奠定了坚实基础。

珠海艾派克(APEXMIC)公司的发展小趣事

为了进一步提升研发实力,艾派克先后在珠海、上海、杭州和美国北卡罗来纳州建立了四大研发中心,并与浙江大学、中科院上海微系统所等国内外知名机构建立联合实验室。这些举措不仅加强了公司在技术研发方面的国际合作,也推动了艾派克在行业技术前沿的领先地位。

CANOPUS公司的发展小趣事

面对激烈的市场竞争,CANOPUS始终保持着创新的精神。公司不断推出新产品、新技术,以满足不同消费者的需求。同时,CANOPUS也注重品牌形象的塑造和提升,通过赞助音乐活动、举办音乐会等方式,提升品牌知名度和影响力。

这些故事只是CANOPUS公司在电子行业中发展的冰山一角。实际上,公司的发展过程充满了挑战和机遇,每一个阶段都离不开创始人的智慧和团队的努力。未来,随着科技的进步和市场的变化,CANOPUS将继续保持创新精神,为音乐爱好者带来更多优质的产品和服务。

amcc [applied micro circuits corp]公司的发展小趣事

随着电子技术的飞速发展,CANOPUS开始探索将传统鼓制作技艺与现代电子技术相结合。公司不断投入研发,推出了一系列具有创新性的电子鼓产品。这些产品不仅保留了传统鼓的音质和手感,还加入了现代电子元素,使得演奏更加多样化和便捷。

Faraday Electronics Inc公司的发展小趣事

随着技术的不断进步,Faraday Electronics Inc意识到单一的产品线已无法满足市场的多样化需求。于是,公司开始积极拓展市场布局,将产品线拓展至智能家居、汽车电子等领域。通过不断的技术创新和市场拓展,公司逐渐在多个领域取得了领先地位,成为了电子行业的佼佼者。

DeLorme公司的发展小趣事

近年来,随着智能手机和移动互联网技术的快速发展,传统的GPS导航设备市场受到了巨大冲击。面对这一行业变革,DeLorme公司及时调整战略方向,将重心转向智能导航应用软件的开发和推广。他们通过与智能手机厂商的合作,将自己的导航软件集成到手机系统中,为用户提供更加便捷、高效的导航服务。同时,他们还积极探索新的商业模式和市场机会,为公司的未来发展奠定了坚实基础。

问答坊 | AI 解惑

各种电源资料

和大家一起分享一下   需要的话就下吧…

查看全部问答>

用什么方法在一个比较喧闹的环境中只能捕捉到自己说话的语音

在一个很嘈杂的环境中比如闹市中,用什么传感器只能捕捉到半径很小的一个范围内的声音(也就是自己说话的声音或者是距离自己很近的人所说话的声音),查了很多相关资料能不能从说话人的声波波段出发?或者是从近声场和远声场出发?    请 ...…

查看全部问答>

自学电路的郁闷

刚开始学习邱关源《电路》一书,书后的习题给我的感觉就是做下来一头雾水——做是可以做的,就连我也不明白为什么我要这样子做。没有以前物理课上的电路容易理解。那位大大指条明路吧…

查看全部问答>

有酬项目:S3C2440 WINCE 5.0上SDIO接口marvel 8686 WIFI模块驱动移植,已有WIFI驱动,需要做SDIO的驱动,有BSP,但是

这个WIFI模块为GM9601,厂家提供的驱动是marvel 8686驱动。 据厂家说,只要修改SDIO驱动即可,工作量1天。 由于本人能力有限,对WINCE系统不熟,现将此项目外包。 要求: 1. 一定是在S3C2440、WINCE 5.0上移植过SDIO WIFI模块的人,由于进度紧 ...…

查看全部问答>

请问哪个函数可以得到内核镜像 的基址?

请问哪个函数可以得到内核镜像 的基址? 我在DDK文档中找不到这样的函数. 还有,有什么函数能取到内核镜像的大小呢??/ 本人菜鸟,初学驱动编译,问题都比较弱智. 望大大们,不要见怪,请赐教,谢谢!!!…

查看全部问答>

适合学习的arm开发板有哪些?

适合学习的arm开发板有哪些? 新手哦!…

查看全部问答>

keil中关于片外RAM的疑问

MOV A,#30H MOV R1,#0E0H MOVX @R1,A MOVX A,@R1复制代码 意思是一个对片外RAM操作的,用keil下自带的模拟下,调用内存,输入I:0e0h,现实的是00,为什么啊?不是应该是30h的嘛?? 最终的a的值是30h,但是片外里面显示的是00,怎么回事啊??…

查看全部问答>

新手求助,谢谢

刚开始学嵌入式,用的是PB4.2,有一块SMDK2440的开发板,按照厂家给的wince安装手册一 步步操作下来,但在最后出现一个致命错误: srcgen D:\\WINCE420\\PLATFORM\\SMDK2440 QT2440LHQ D:\\WINCE420\\PUBLIC\\QT2440~1\\WIN CE420\\smdk2440\\ces ...…

查看全部问答>

uip的使用问题

代码如下:void connect_server(void){    u16_t ipaddr[2];    uip_ipaddr(ipaddr,192,168,1,101);    uip_connect(ipaddr,HTONS(10001));        char *echo=\"conn ...…

查看全部问答>

关于LM3S811核心板的一些想法

我们最近拿到的LM3S811板子只是个核心板,像普通的RS232或RS485、SPI(即ssi)、IIC等外设都没有 更别说其他的一些高级的外设了   谁有这方面的板子或者图纸   坛子有没有兴趣组织个这样的活动 将这个板子画出来   如果相应的 ...…

查看全部问答>