用89C52单片机做信号发生器,keil51编程从100hz到200hz的正弦波,大虾们帮忙啊

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了用89C52单片机做信号发生器,keil51编程从100hz到200hz的正弦波,大虾们帮忙啊相关的知识,希望对你有一定的参考价值。

正弦波,挺难得嘞。可以试一试查表的方式,表格上列0~2∏,32等分的值。最大是5V,最小是0V;取近似值。这就是正弦波的幅值。
频率用定时器来做吧,100HZ到200HZ就是从5ms~10ms的变化。试试看,用汇编写程序也比较简单。追问

频率是用定时器来做,但是做出来的波形是阶梯型的,有什么办法改变?还有能不能做到改变两个频率只是相差1hz,就是调节精度达到1hz

参考技术A 方法主要有三种,建议根据需要选择
1.根据正弦波形特性,每隔一段时间进行采点,越密集精度越高,对相应幅值进行编码,最终得到一个编码表,然后,选择I/O口进行输出,但精度不高。
2.推荐采用专用的函数信号发生器芯片,如MAX038,用单片机进行控制,精度高电路还简单
3.或者就先输出方波,后进行积分电路,变为三角波,后用三角波转正弦波的电路,或者再次积分,得到近似为正弦波的波。但波形容易失真。追问

用的是第一种方法,但是做出来的波形是阶梯型的,有什么办法改变?还有能不能做到改变两个频率只是相差1hz,就是调节精度达到1hz

参考技术B 你若是用高频的示波器看波形肯定是梯形的啊。相当于把波形横向拉长了。

Keil C51用C写单片机程序能不能像汇编那样跳转到任意地方?

楼上说得对,
C51
语言在算法上,逻辑关系上,的确比汇编优秀得多,也容易看明白,C51程序的设计,不管是在硬件上,还是在软件上,个人建议都采用统一的
模块化设计
,这样在调试和修改,维护上都方便得多,主程序一般都是由多个子函数构成,什么时候需要直接调用就行了,比起汇编在调用的地址范围上的限制,要人行化得多。所以,你说,能不能汇编那样,跳到任意地方,其实,确切的说,不是跳到任何地方,是我程序在哪个地方需要什么功能,直接去调用相关功能的
子程序
就行了。而不是像汇编那样用LCALL,ACALL等指今。
当然C语言里面有一条语句,GOTO,它可以跳到你和程序的任何地方,但建议一般不这样用,会打破你的模块化设计结构。如果你非要用,建议只用在子程序里面,而且跳转地址也只在该子程序里。不要在主程序中用此语句。
祝你好运
参考技术A 可以!但最好不要这样用,也没有谁会这样用。你需要什么子程序就调用什么子程序就行了,不要用GOTO去跳转。这样会跳乱的。 参考技术B 你虽然写了void
one(void);
void
delay10ms(unsigned
int
c);
这两个函数,但是你在主函数里么有使用它们,所以会警告,你如果这样就不会啦
void
main(void)

two();
delay10ms(12);
one();

望悬赏啊

以上是关于用89C52单片机做信号发生器,keil51编程从100hz到200hz的正弦波,大虾们帮忙啊的主要内容,如果未能解决你的问题,请参考以下文章

51单片机 超声波红外避障 程序

单片机如何产生PWM信号

在keil软件里边怎么编写对数函数

keil51中怎么用C语言编程把处理得到的数据存到数据存储器中,掉电不会消失

单片机编程。 keil中数组指针怎么用才规范呢?一直提示C182警告

单片机开辟情况搭建--Keil uVision4装置教程