基于STC89C52RC单片机实现定时计数功能(附源码及打包hex烧录文件)
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了基于STC89C52RC单片机实现定时计数功能(附源码及打包hex烧录文件),小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3476字,纯文字阅读大概需要5分钟。
内容图文
项目要求
- 两种不同的电路板由于某一个IC程序烧录版本不一致,需区分这两种电路板。
- 两种电路板外观完全一致,通过示波器读出只有第一次出现的波形群波形个数有区别。
实现思路
- 在第一次波形群出现的时间内对波形计数。
- 通过外部中断下降沿触发计数功能。在下降沿触发的中断函数里对变量count做自加一处理。
- 第一次进入外部中断即开启定时中断,这里通过count值是否为1来实现第一次进外部中断才开启定时中断开关。
- 一旦进入定时中断函数我们即关闭所有中断。停止计数和定时,以到达我们只对前50ms计数来区分波形数。
- main方法内我们通过死循环来一直监控Count值,为了锁死电平的状态,我们在对进入定时中断后关闭所有中断后flag置为2,判断flag为2进入一个死循环,锁死运行状态,不让main方法自上而下重复执行。
代码展示
/*****************************************************************
author:GuoZhiQiang
date:2019-10-07
*****************************************************************/
#include <reg51.h>
#include <intrins.h>
sbit INPUT = P3^2; //测试信号输入P3.2
sbit OUTPUT = P2^0; //测试信号输出P2.0
unsigned int Count = 0; //创建Count全局变量计数
unsigned int flag = 0; //标志是否开启定时中断 0为未开启 1为已开启
unsigned int Times = 0; //给进入定时中断计数
/*************************************************************************
延时函数
*************************************************************************/
void Delay(unsigned int i)
{
unsigned int j;
for(;i>0;i--)
for(j=0;j<125;j++)
{;}
}
/*************************************************************************
Count计数大于8,OUTPUT输出高电平1
Count计数小于8,OUTPUT输出低电平0
*************************************************************************/
void doSomeThing(){
if (Count>=8)
{
OUTPUT=1;
}
else
{
OUTPUT=0;
}
}
/**************************************************************************
初始化外部中断设置
**************************************************************************/
void Init_INT0(void)
{
EA=1; //首先开启总中断
EX0=1; //开启外部中断
IT0=1; //设置成下降沿触发,0为低电平触发,1为下降沿触发
}
/**************************************************************************
初始化定时器中断设置
**************************************************************************/
void Init_TIME0(void)
{
TMOD = 0x01;
TH0 = (65535-50000)/256;
TL0 = (65535-50000)%256;//定时器1定时50mS
ET0 = 1;//开启定时器中断
TR0 = 0;//定时器0暂不开启
}
/**************************************************************************
程序主入口:
无限循环对Count进行判断,如果Count大于X则输出高电平,否则低电平
**************************************************************************/
void main()
{
PT1 = 1;//设定定时器中断优先
Init_INT0();
Init_TIME0();
while(1){
if (flag=2)
{
while(1);//自锁程序,使得main方法不再自上而下重复执行,OUTPUT稳定输出电平
}
else
{
doSomeThing();//判断计数执行对应输出
}
}
}
/**************************************************************************
下降沿触发中断计数
**************************************************************************/
void INT0Interrupt(void) interrupt 0 using 0
{
Count++;
if(Count==1){
TR0=1;//开启定时器中断
flag=1;//flag置为1 标志开启定时器中断
}
}
/*************************************************************************
定时器0中断 当进入第二次定时中断定时器1定时100mS,关闭总中断不会再计数
*************************************************************************/
void TIME0Interrrupt(void) interrupt 1 using 0
{
Times++;
TH0 = (65535-50000)/256;
TL0 = (65535-50000)%256;//定时器1定时50mS
if(Times==2){
EX0=0;//关闭外部中断
TR0=0;//关闭定时器中断
EA=0;//关闭总中断
flag=2;
}
}
内容总结
以上是互联网集市为您收集整理的基于STC89C52RC单片机实现定时计数功能(附源码及打包hex烧录文件)全部内容,希望文章能够帮你解决基于STC89C52RC单片机实现定时计数功能(附源码及打包hex烧录文件)所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。