📄 ss.c
字号:
//**************************************************
//头文件部分,文件名:plj.h
/**************************************************
//主函数:
/*==================================================================================
公司名称: 河海大学电气工程学院 *
模块名 : AT89C52单片机系统,全国电子设计大赛 *
创建人 : 南东亮 日期:2007。7。28 *
修改人 : *
功能描述: 利用AT89S51单片机的T0、T1的定时计数器功能,来完成对输入的信号进行
频率计数,计数的频率结果通过8位动态数码管显示出来。要求能够对0-250KHZ
的信号频率进行准确计数,计数误差不超过±hz
程序设计内容:
1)定时/计数器T0和T1的工作方式设置,由图可知,T0是工作在计数状态下,
对输入的频率信号进行计数,当T/C工作在定时器时,计数脉冲来自外部脉冲
输入管脚T0(P3。4)或T1(P3。5),当T0或T1产生负跳变时计数器加1。识别
管脚的负跳变需要两个机器周期,即24个振荡周期。所以,以T0或T1脚输入的
可计数外部脉冲的最高频率为1/24Fosc。但对工作在计数状态下的T0,
最大计数值为fOSC/24,由于fOSC=12MHz 因此:T0的最大计数频率为500KHz?
高于此频率将出错。
对于频率的概念就是在一秒只数脉冲的个数,即为频率值
所以T1工作在定时状态下,每定时1秒钟到,就停止T0的计数,
而从T0的计数单元中读取计数的数值,然后进行数据处理。
送到数码管显示出来。
2)T1工作在定时状态下,最大定时时间为65ms,达不到1秒的定时,
所以采用定时50ms,共定时20次,即可完成1秒的定时功能。
*
//;*其他说明: 产品为设计阶段 *
*/
//;==================================================================================
//;主程序开始
//;==================================================================================
//#include "plj.h"
#include<reg52.h>
#include<absacc.h>
#include <intrins.h>
#define uint unsigned int
#define uchar unsigned char
#define LED_DATA P0
sbit LED_COM1=P2^4; // 第1位数码管的COM线连P2.4
sbit LED_COM2=P2^5; // 第1位数码管的COM线连P2.5
sbit LED_COM3=P2^6; // 第1位数码管的COM线连P2.6
sbit LED_COM4=P2^7; // 第1位数码管的COM线连P2.7
#define LED_ON 1 // 点亮数码管的电平
#define LED_OFF 0 // 熄灭数码管的电平
void mDelay(uchar j) //延时,毫秒数由j决定
{ uint i=0;
for(;j>0;j--)
{ for(i=0;i<124;i++)
{;}
}
}
code unsigned char seg_code[10]={
0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F, // 对应0~9的8段数码管的段码
};
unsigned char led_buffer[4];
unsigned char code table1[]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39};//0123456789
//unsigned char code table2[]={0x41,0x42,0x43,0x44,0x45,0x46};//abcdef
uchar T0count; //从T0的计数单元中读取计数的数值
uchar timecount; //
bit flag; //标志位
unsigned long x;
//uchar xPos,yPos;
uchar i;
static void delay1ms(const unsigned int N) // 功能描述:延时N(0~65535)ms;输入参数:N 延迟时间(0~65535)
{
unsigned int i,j;
for(i=0;i<N;i++)
{
for(j=0;j<128;j++);
}
}
void led4bit_init(void) //初始化4位8段数码管显示,熄灭所有数码管。
{
LED_COM1 = LED_OFF;
LED_COM2 = LED_OFF;
LED_COM3 = LED_OFF;
LED_COM4 = LED_OFF;
}
void led4bit_disp(void) //4位8段数码管显示。
{
LED_DATA = seg_code[ led_buffer[0]]; //准备好第1位数码管的数据
LED_COM1 = LED_ON; // 点亮第1位数码管
delay1ms(2); // 延时2毫秒
LED_COM1 = LED_OFF; // 熄灭第1位数码管
LED_DATA = seg_code[ led_buffer[1] ];
LED_COM2 = LED_ON; // 点亮第2位数码管
delay1ms(2); // 延时2毫秒
LED_COM2 = LED_OFF; // 熄灭第2位数码管
LED_DATA = seg_code[ led_buffer[2] ];
LED_COM3 = LED_ON; // 点亮第3位数码管
delay1ms(2); // 延时2毫秒
LED_COM3 = LED_OFF; // 熄灭第3位数码管
LED_DATA = seg_code[ led_buffer[3] ];
LED_COM4 = LED_ON; // 点亮第4位数码管
delay1ms(2); // 延时2毫秒
LED_COM4 = LED_OFF; // 熄灭第4位数码管
}
void t0() interrupt 1 using 0 //T0中断服务
{
T0count++; //对P3。4口的脉冲进行计数
}
//;==================================================================================
void t1(void) interrupt 3 using 0 //T1中断服务
{
TH1=(65536-4000)/256; //计数初值重装载
TL1=(65536-4000)%256;
timecount++;
if(timecount==250)
{
TR0=0;
timecount=0;
flag=1; // 置标志
}
}
void main(void)
{
TMOD=0x15; //T0工作为16位计数器(方式1),T1工作方式为16位定时器
TH0=0; //计数为65536
TL0=0; //
TH1=(65536-4000)/256; //定时器采用定时4ms. 初值为4000
TL1=(65536-4000)%256;
TR1=1; //TR1=1,控制开关闭合,计数脉冲进入T1计数器,启动定时
TR0=1; //TR0=1,控制开关闭合,计数脉冲进入T1计数器,启动计数
ET0=1; //定时器0开中断
ET1=1; //定时器1开中断
EA=1; //CPU开中断
while(1)
{
if(flag==1) //
{
flag=0; //清标志位
x=T0count*65536+TH0*256+TL0; //取得时间宽度参数
led_buffer[0] =x/1000;
led_buffer[1] =(x%1000)/100;
led_buffer[2] =(x%100)/10;
led_buffer[3] =(x%10)/1;
led4bit_disp();
timecount=0;
T0count=0;
TH0=0;
TL0=0;
TR0=1; //TR0=1,控制开关闭合,计数脉冲进入T1计数器,启动计数
}
}
}
//;==================================================================================
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -