不想占用太多的cpu
基本思路 :采用中断和定时器来测量
中断0控制测量周期接信号取反的信号(因为51不支持上升沿的原因) 对应计数器0
中断1控制测量高电平 接原信号对应计数器1
代码如下
#include <reg52.h>
sbit e = P2^7;
sbit rs = P2^6;
sbit rw = P2^5;
//--定义LCD显示的文字--//
uchar code string1[16]={"Percent: %"};
uchar code string2[16]={"T: ms"};
uchar T[5];
uchar S[4];
//--声明全局函数--//
void TIMER_init(); //初始化定时器
uchar flag = 1;
ulong num1,num2;
void delay_ms(uchar t);
void write_com(uchar com);
void write_date(uchar dat);
void init_1602();
void INT_TIMER_init()
{
TMOD = 0X11;
EA = 1;
EX0 = 1;//外部中断
EX1 = 1;
IT0 = 1;//下降沿触发
IT1 = 1;
ET0=1;//定时器中断
ET1=1;
}
void delay_ms(uchar t)
{
uchar i = 110;
while(t--)
while(i--) continue;
}
void write_com(uchar com)
{
e = 0;
rs = 0;
rw = 0;
P0 = com;
delay_ms(1);
e = 1;
delay_ms(10);
e = 0;
}
void write_data(uchar dat)
{
e = 0;
rs = 1;
rw = 0;
P0 = dat;
delay_ms(1);
e = 1;
delay_ms(10);
e = 0;
}
void init_1602()
{
delay_ms(15);
write_com(0x38);
delay_ms(5);
write_com(0x38);
delay_ms(5);
write_com(0x38);
write_com(0x07);
write_com(0x01);
write_com(0x06);
write_com(0x0c);
}
void main()
{
uchar i;
uint s;
init_1602();
INT_TIMER_init();
//--显示要写的字母--//
for(i=0;i<16;i++)
{
write_data(string1[i]);
}
write_com(0xc0);//第二行显示
for(i=0;i<16;i++)
{
write_data(string2[i]);
}
while(1)
{
T[0]='0'+num1%100000/10000;
T[1]='0'+num1%10000/1000;
T[2]='0'+num1%1000/100;
T[3]='0'+num1%100/10;
T[4]='0'+num1%10;
s = (uint)((num2*1.0/num1)*1000);
S[0] = '0'+s/100;
S[1] = '0'+s%10/10;
S[2] = '.';
S[3] = '0'+s%10;
for(i=0;i<4;i++)//从最高位开始查找不为0的数开始显示
{
if(S[i]=='0')
{
S[i]=' '; //若为0则赋值空格键
}
else
{
break;
}
}
for(i=0;i<5;i++)//从最高位开始查找不为0的数开始显示
{
if(T[i]=='0')
{
T[i]=' '; //若为0则赋值空格键
}
else
{
break;
}
}
write_com(0x8b);
for(i=0;i<6;i++)
{
write_data(S[i]);
}
write_com(0xc9);
for(i=0;i<5;i++)
{
write_data(T[i]);
}
}
}
void int0() interrupt 0 //信号取反
{
if(flag)//周期开始
{
TR0=1;
TR1=1;
flag = 0;
}
else //周期结束
{
TR0 = 0;
num1 = num1+TH0*256+TL0;
num2 = num2+TH1*256+TL1;
TH0 = 0;
TL0 = 0;
TH1 = 0;
TL1 = 0;
flag = 1;
}
}
void int1() interrupt 2 //信号下降沿关闭计数器1
{
TR1 = 0;
}
void timer0() interrupt 1//周期计数
{
num1=num1+65536;
}
void timer1() interrupt 3 //高脉冲奇数计数
{
num2=num2+65536;
}
51单片机测占空比和周期程序求解
1、首先测出方波的频率(这个跟占空比无关),利用这个计算出周期T;2、利用一个独立的外部中断,在测量完频率后启动。(1)先开启中断,并设置为上升边沿触发;(2)方波从低电平跳变到高电平后,中断触发后,将其设置为下降边沿触发,同时启动定时器;(3)第二次触发中断后,停止计时,两次中断之间...
51单片机用定时器形成占空比问题
100Hz,周期=10mS,那么定时器周期取 T=1mS,输出信号周期\/定时器周期=10,那么 如果使P1.0口输出5个T0高电平,5个T低电平,则得到占空比=50%,周期=10T=10mS的方波信号;使P1.0口输出3个T0高电平,7个T低电平,则得到占空比=30%,周期=3T+7T=10T=10mS的方波信号;如果想得到占空比=33...
用的是51单片机,晶振11.0592,请问怎么算出占空比,和pwm波频率,求具体...
一个周期后(假设中断20次)a清0,再次输出高电平 那么占空比=(20-b)\/20 改变b的值即可改变占空比 周期=20*定时器定时长 由于中断程序要占用一定时间,因此定时器中断间隔时间不能太短,造成PWM的频率不能太高,或者占空比的调节精度较低 所以有的单片机具有硬件PWM功能 ...
51单片机测量PWM波的占空比的C语言程序
调节a ,b的值即可调节占空比,程序框架就是这样,具体自己改吧
求高手 51单片机IO口输出2.57HZ方波占空比是40%程序
如果是12M晶振,2.57Hz,周期为389105us,40%占空比,高电平155642us,低电平233463us,程序如下:include<reg51.h> sbit pluse=P1^0;unsigned char flag=0xff;void t0isr() interrupt 1 { flag=~flag;if(flag){ TH0=(65536-155642)\/256;TL0=(65536-155642)%256;pluse=1;} else { TH0=(...
怎么用51单片机来实现pwm调节占空比
可以用两级中断来实现,该方法可实现精确占空比与频率的调整。。。大致思想是:1.在定时器T0中开定时器T1,并使pwm=1,2.在定时器T1中关掉T1,即TR1=0;并使pwm=0;注:t0控制频率(周期),t1控制占空比(高电平时间),你只要装载相应的定时器初值即可。很实用的哦 ...
用51单片机的定时器产生一种方波,频率60HZ,但是占空比只有约0.5%...
24MHz晶振,系统时钟周期 t =1\/24 us;单片机指令周期(机械周期)T=12t=0.5us;16位定时器的最大计数为 65536个机械周期,即 32768us=32.768ms,足够产生 16.67ms 的脉冲了。程序思路:①先计算2个值:60us = 120 ×0.5us=120T;16.67ms=33333 ×0.5us=33333T;②定时器内有个变量...
51单片机时针频率12MHz,要求从p1.0引脚输出一个频率为100KHz占空比为1...
周期是 10us。50% 的占空比?那就是 5us 高电平、5us 低电平。程序如下:LOOP:SETB P1.0 NOP NOP NOP NOP CLR P1.0 NOP NOP SJMP LOOP END
51单片机产生一定占空比和频率的PWM.
include<reg51.h> define count 50 define TH_M1 (65536-count)\/256 \/\/设置定时器T0的定时时间 define TL_M1 (65536-count)%256 \/\/设置定时器T0的定时时间 unsigned char ucount=0;sbit PWM=P1^0;unsigned char DR;\/\/定义全局变量占空比 \/*主函数***\/ void main(void){ \/\/IP=0x10; ...
跪求!想用51单片机通过按键触发来输出一个可调占空比的的PWM波形。用C...
开个定时器,0.1ms的中断周期,中断100次为一个PWM周期,得出10ms周期的PWM波,然后在这100次的中断中,前30次中断让IO口输出高,后70次让IO口输出低,然后就得出了30%占空比的PWM波,根据这个方法即可实现你的要求。