标题: 有没有大神帮我看看这个测脉冲宽度的程序哪里不对 [打印本页]
作者: muchong 时间: 2017-3-14 10:01
标题: 有没有大神帮我看看这个测脉冲宽度的程序哪里不对
#include <reg51.h> //包含51单片机寄存器定义的头文件
#define off 1 //高电平时为关闭状态
#define on 0 //低电平时为开启状态
sbit XPRET = P1^7; //信号输入口定义
sbit DJDW = P1^6;
sbit LED10 = P1^5; //指示灯输出口定义
sbit LED11 = P1^4;
//sbit LED12 = P3^7; //跳变时序指示灯,亮为不正常
unsigned char jishi; //记录有多少个0.05s
void main()
{
//unsigned char tmp = 0; //用于检测时序
LED10=LED11=off; //熄灭灯
jishi = 0; //0.05s计时赋零
TMOD = 0x01; // 设T0位方式1,GATE=0 模拟寄存器
TH0 = (65536-50000)/256; // 高八位
TL0 = (65536-50000)%256; // 低八位
TR0 = 0; // 关闭计时器 TCON控制寄存器
TF0 = 0; // 溢出标志清零 TCON控制寄存器
EA = 1; // 开关中断 中断使能寄存器
ET0 = 1; // 定时器0中断 中断使能寄存器
while(1)
{
// tmp = P1;
// tmp = (tmp&0xf0)>>4; //清零低四位
// if(tmp==0x08||tmp==0x0e||tmp==0x0a||tmp==0x09) //检测跳变时序
// {LED12 = off;}
// else
// {LED12 = on;}
if(XPRET) //同步信号XPRET高电平 灯亮
{LED10 = on;}
else
{LED10 = off;}
if(DJDW) //高电平计时
{TR0 = 1;} //开启计时
else
{TR0 = 0; //关闭计时
if(jishi>=100&&jishi<=160) //DJDW高电平5~8s之间
{LED11 = off;}
else
{LED11 = on;}
}
}
}
void timer0() interrupt 1 //T0中断,达到0.05s。jishi变量加1
{jishi = jishi+1;}
我单片机晶振用的是6MHZ,仿真的时候无论高电平持续多久,led11都会亮(本来是只有不在5-8s范围内才会亮的)
-
IMAG2755.jpg
(33.45 KB, 下载次数: 65)
作者: zl2168 时间: 2017-3-14 19:28
测量脉冲宽度
先Proteus仿真一下,确认有效。
以上摘自张志良编著《单片机实验实训100例》 ISBN 978-7-5124-1603-1,北航社出版
书中电路和程序设计有详细说明,程序语句条条有注解。
欢迎光临 (http://www.51hei.com/bbs/) |
Powered by Discuz! X3.1 |