关于利用外部中断单片机测量方波频率的问题:程序代码如下,可是最后用串口调试助手显示的数据发现是错误

#include<reg52.h>#defineuintunsignedint#defineucharunsignedchar#defineuintunsignedint... #include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
#define uint unsigned int
#define uchar unsigned char
sbit dula=P2^6;
sbit wela=P2^7;
sbit wr=P3^6;
sbit rd=P3^7;
uchar num,temp,adval;
uint i,ad;
void main()
{
EA=1;//开总中断
EX0=1;//开外部中断0
IT0=1;//外部中断触发

TMOD=0x01;//定时器0工作方式1
TH0=(65536-1000)/256;//装初值
TL0=(65536-1000)%256;
ET0=1;//开定时器0中断
TR0=1;//启动定时器0

TMOD=0x20;//定时器1工作方式2
TH1=0xfd;//定时器初值,波特率9600
TL1=0xfd;
TR1=1;//启动定时器1
REN=1;//允许串口接收
SM0=0;//设定串口工作方式1
SM1=1;
ES=1;//开串口中断
while(1)
{
while(!TI)
TI=0;//串口发送中断
}
/外部中断
void waibu() interrupt 0
{
i++;
}
//定时器中断
void timer() interrupt 1
{
TH0=(65536-1000)/256;
TL0=(65536-1000)%256;
num++;
if(num==10)//到5ms,触发定期器0中断
{
ad=i*100;
num=0;
i=0;
}
}
//串口中断,可直接删除
void ser() interrupt 4
{
RI=0;
SBUF=ad;//传给串口

}
}
PS:我用一个函数信号发生器发声一个5V,1KHZ的方波,可是最后求得的结果是错误的,猜想应该是程序有问题,希望高手能指点指点,跪谢!!
展开
 我来答
seuzhouww
2011-03-19 · TA获得超过1386个赞
知道小有建树答主
回答量:658
采纳率:0%
帮助的人:322万
展开全部
你贴的程序本身有很多错误,改好后再看吧
1、#define uint ……多了两行。
2、main的}位置不对。
3、TMOD=0x21;一句就行。
4、uint ,ad; 去掉逗号。ad为16位。发送时SBUF=ad??应当重新运算,十进制数的ASCII码发送好了。计算好实际频率,把SBUF语句放到主程序里面发。while(!TI)加分号。此处还需考虑。
5、9600bps,你要考虑下晶振。实际设置定时值时要重新考虑,是否为1mS中断。
6、注意ad的范围和频率量程。
意法半导体(中国)投资有限公司
2023-06-12 广告
单片机原理由运算器、控制器、存储器、输入输出设备构成,单片机自动完成赋予它的任务的过程,也就是单片机执行程序的过程,即一条条执行的指令的过程;单片机的应用:节能控制;智能语音设备;报警控制;医疗设备。 单片机原理及应用 本书详细地介绍了MC... 点击进入详情页
本回答由意法半导体(中国)投资有限公司提供
tangnaner
2011-03-19 · 超过26用户采纳过TA的回答
知道答主
回答量:59
采纳率:0%
帮助的人:82.9万
展开全部
你定时器工作方式设置了两次,这样只有下面那次有效。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式