❶ 我用51单片机做了一个函数信号发生器,函数信号用程序实现,有高手知道锯齿波的思路吗
锯齿波设计的思想是:设置一个变量,以一定的步进值累加,加达最大值后清零。每次累加的结果传输给DA转换器,输出就是个锯齿波了。
幅值与你设置的最大值有关,这个最大值可以通过按键设置。你可以设置这个最大值的大小,也可以给这个值设定一个系数,通过控制这个系数的大小来调整最大值
❷ 试用c语言编写一个能输出锯齿波信号的单片机c51程序
程序加一个的LCD1602,你选择使用
的#include <reg52.h>的/ /包含头文件
?#包括<intrins.h>的
#定义UCHAR无符号的字符/ /宏定义
?#定义UINT无符号整数
?UCHAR I,J,N,Z,/ /定义全局变量
SBIT RS = P2 ^ 0; / /定义端口
?和SBIT RW = P2 ^ 1;
SBIT E = P2 ^ 2;
SBIT K = P2 ^ 7;
SBIT K1 = P2 ^ 6;
UCHAR代码STR0 [] = {“正弦波”}; / /定义LCD1602显示的字符数组
UCHAR代码STR1 [] = {“三角波”};
UCHAR代码字符串str2 [] = {“方波”};
?的UCHAR代码表[3] [40] = / /定义的两维阵列的波形
?{
??80H时,0x94的,0xa7,0xb9,0xca,0xd9,0xe7,0xf1,0XF8,是0xFD,
??是0xFD,0xff,则0XF8,0xf1,0xe7,0xd9,0xca,0xb9 0xa7,0x94的,
??80H时,0x6c,将0x55,0x46,0x35,$ 25,为0x18,0X0E,0X06,0X02,
??为0x00,0X02,0X06,0X0E,为0x18,$ 25,0x35,0x46,0x55??的,0x6c,
??80H时,0x8c,0x99,0xa6,0xb3,0XC0,含有0xCC,0xd9,0xe6,0xf2,
??为0xff,0xf2,0xe6,0xd9,含有0xCC,0XC0,0xb3,0xa6,0x99,0x8c,
??80H时,为0x73,0x66,0X5A,0x4d,0X40,地址0x33,0X26,0X1A,0X0D,
?为0x00,0X0D,0X1A,0X26,地址0x33,0X40,0x4d,为0x5A,0x66,为0x73,
??为0xff,0xff,则是0xFF,0xFF时,为0xff,0xff,则是0xFF,0xFF时,为0xff,0xff,则
??为0xff,0xff,则是0xFF,0xFF时,为0xff,0xff,则是0xFF,0xFF时,为0xff,0xff,则
??0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
??0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00
?};
?无效延迟(UINT Z)/ /延时程序
?{
????(Z,Z> 0,Z - )
???
??
??}
?}
?无效Write_command“(UCHAR CMD)/ / LCD1602写命令程序
?{
??RS = 0; / /选择指令寄存器
?RW = 0; / /写操作
?E = 1 / /使能端
?P1 = CMD;
?延迟时间(1);
?E = 0;
LCD1602是不是很忙?延迟(10); / /延时
?}
?无效WRITE_DATA(UCHAR CMD)/ / LCD1602写入数据的命令
?{
??RS = 1; / /选择数据寄存器
?RW = 0; / /写操作
?E = 1; / /结束
?P1 = CMD;
?延迟时间(1);
?E = 0;
LCD1602是不是很忙?延迟(10); / /延时
?}
?的无效Lcd_init()/ / LCD1602初始化程序
?{
????Write_command(0x38); / /设置16 * 5 * 7点阵8位数据接口
?Write_command(0X0C)/ / LCD1602打开显示,不显示光标
?Write_command(0X06)/ /读或写一个字符指针加1不动
?Write_command(0X80 +0 X00); / /设置数据地址指针
?}
?无效显示器()/ / LCD1602显示英语课程
?{
????Lcd_init();
?(我== 0)
???
?组(n = 0,N <13,N +)
???
???WRITE_DATA(STR0 [N]);
??}
????}
?否则,如果(我== 1)
?{
?组(n = 0,N <13,N +)
??
??WRITE_DATA(STR1 [N]);
?}
?}
?其他
?{
?组(n = 0,N <13,N +)
??
??WRITE_DATA(字符串str2 [N]);
?}
?}
?}
无效的主要()/ /主函数
?{
???显示();
?而(1)
?{
??中for(j = 0; J <40; + +)
???
???P0 =表[I] [J];
???
??}
(k == 0)/ /切换程序??
???
????延迟时间(1);
???(k == 0);
????
????(K == 0)
?????
????+ +;
????如果(i == 3)= 0;
???显示();
????}
????
???}
??????而(k == 0);
??}
?}
?}
❸ 帮忙解决下:使用51单片机,产生方波、锯齿波、三角波等波形,频率可调。并且能实现在protues中的仿真
基本知识点:
1、定时器
2、PWM
方波、三角波的实现方法:
1、PWM固定占空比1:1,实现对称方波输出
2、方波后连接积分电路,可将方波变为同频率的三角波。
实现以上功能较容易,且可实现的频率范围较宽。
锯齿波实现方法:
锯齿波实现方法稍显麻烦,不过硬件电路原理与三角波类似。
区别在于锯齿波在一个周期内输出若干个占空比不同的方波,每个方波的占空比除了最后一个点之外,呈线性递增。这样出来的信号还不是锯齿波,需要经过积分电路才能转变为锯齿波。由于一个周期需要输出多个方波(个数越多,精度越高),因此,锯齿波的频率不能太高。
锯齿波个人建议采用AD或专用的信号发生器电路。
❹ 请问你是不是会 用KEIL编写程序就是用51单片机汇编锯齿波,方波....的程序
用C编写更简单
❺ 如何使用51单片机做一个和输入频率同步的锯齿波发生器
找一个快一点的单片机 或者
生成锯齿波可以用方波积分,这样用触发器和有源电容+放电电路就行了。你这个频率不高,找最通用的触发器就行 正负不是问题 电平基准总是可以调节的 然后边沿触发就好
❻ mcs51单片机如何通过数模转换器DAC0832生成负向锯齿波(主要是负向怎么来不明白,正向锯齿波课本有)
不知你这负向指的什么?!如是是在隔直电容后的,那就用一个反相放大器就行了,如你要在电源上也是负的那可只有再加一个负电源再用放大器在这负电源环境下进行放大。正弦波可用查表方式来产生。
❼ 怎么用51单片机实现锯齿波
嘿嘿
还是让俺来帮你解决吧
1
关于定时器定时时间的计算问题:
如果使用的是12m晶振计算,指令周期1us,定时器是加1计数器,即是对内部时钟即指令周期脉冲计数
每当1us到时,计数器加1。
假设
定时器的初始值=x,则每到1us
计数器的值就加1
,则计数器值=x+1+1+...+1
值越来越大,最后达到ffffh+1
就会产生溢出
结果计数器值回0(ffffh+1=65536)
可以推出
定时时间=计数的1的个数×1us=(65536—x
)1
us
结论:
定时时间跟初始值即时间常数x有关。
如果要定时0.5毫秒=500us
根据定时时间公式
500=(65536—x
)
即x=(65536-500)
一般把高8位送th0
即
(65536-500)/256
把
(65536-500)%256即除上256后的余数
即低8位数送给tl0
每当定时时间到
计数器值都回0
必须重新送时间常数x
2每条指令的时间怎么算?
答复:
可以查指令表
每一条指令的执行时间的周期数
都是固定的
如
nop
为一个机器周期
mov
r6,#200;
为2个机器周期
机器周期=12/晶振频率
如果晶振频率=12mhz
则机器周期=1
us
就可以知道
;
执行nop指令的执行时间为
1
us
执行mov
r6,#200指令的执行时间为
2
us
因此
是可以精确计算出指令的延时时间的
呵呵
就介绍这些吧
满意就
给加分吧
❽ 基于51单片机的锯齿波发生器,要求能够发生出1HZ,100HZ,1KHZ。
//晶振频率12M,所以定时器脉冲频率为1M=1000000
#define F 12 // 晶振频率
#define ONE_SECOND (F*1000000/12) // 机器周期频率
#define IT0_Cost 10 // 定时器0中断平均花费时间10us,这是大概数据,自己可以仔细计算,影响不大只是为了提高精度,所以无法不可能输出1KHz锯齿波,最高只能输出大约390Hz
#define SAWF 100 // 输出锯齿波频率,建议输出不高于100Hz
#define oTH0 (65536-ONE_SECOND/SAWF/256 + IT0_Cost) / 256
#define oTL0 (65536-ONE_SECOND/SAWF/256 + IT0_Cost) % 256
void main()
{
TMOD=0X01;
TH0=oTH0 ;
TL0=oTL0;
ET0=1;
TR0=1;
EA=1;
while(1){};
}
void timer0(void) interrupt 1
{
static unsigned char vout,ff;
TH0=oTH0 ;
TL0=oTL0;
P2=vout; // P2接DAC,输出100Hz
vout++;
if(vout==255) vout=0;
/* 注释部分替换上面三行即输出1Hz
ff++;
if(ff == 100)
{
P2=vout; // P2接DAC,输出1Hz
vout++;
if(vout==255) vout=0;
*/
}
*/
}
❾ 五一单片机与数模转换芯片dac 0832的硬件连接如图编写输出锯齿波的程序
可以这样,DAC0832是根据输入的数字量,输出相应的模拟量,锯齿波是有规律的模拟量。
单片机内部程序可以通过算法(规律计算或数组),定时生成一个数字量发送到DAC0832,使其输出相应模拟量,即可。
例如锯齿波是从0~3V,将0~3V分为若干个点(分辨率),定时输出每个点的数字量。
❿ 51单片机中DAC0832转换模块,c语言程序实现键控波形输出,锯齿波,方波,矩形波
DAC是输入的,还要输出?我有DAC0832的proteus应用,不过是针对输入的部分,输出显示在1602LCD上