用什么手机软件可以给视频视频怎么添加滚动字幕母字幕?

查看: 368|回复: 0
乱想了些东西就写了,关于H&H
& &&&这几天心情很糟糕。很忧郁。让我想起了许多东西。从中想起了两个人对我的教诲。
首先想起了别人对我说的做人不能怕麻烦。从而让我联想到了在我看来比较复杂的H&H容量测试仪的电路
本来想买套件自己焊结果一下被人买完了。然后我就找了它的电路图。以前一看比较复杂的图就直接关了。想试一下于是我找了来看。看了很久思路都清晰了觉得挺简单的。但是又有点麻烦
当我想到不能怕麻烦时又想试一下。于是我就下定决心买东西自己慢慢接。
我就不信自己搞不好。等着来吧。我一定要自己亲手完成。。。。
还有有人说要锻炼自己。要吃多点苦。我觉得说得很对。其实我觉得已经在锻炼自己了。
我现在在宿舍逼自己全部衣服都要用手洗。不能用洗衣机洗。一个学期下来了。我果然坚持到了
我要完善自己。煮饭已经很久没试过了。去年暑假天天在家炒菜原来自己煮的菜味道还可以。爸都说好吃。最近有次机会煮了一道菜觉得味道还可以。
我现在什么都要学点。我觉得什么都懂点比只精通一样东西好多了。人要多方面发展。。。待续& && && && && && && && && && && && && && && && && && && && && && && && && && && && && && && && && && && && && && &&&
Powered by&模电学习1&Multisim 12.0 搭建并仿真51单片机最小系统
系统环境: win7 64位软件平台:Multisim 12.0
刚毕业,但是模电知识也忘得差不多了,加之自己想搞搞硬件设计,如果只是看模电书,不实践,还是终觉浅。当做兴趣一样学学模电,仿真仿真。Multisim的MCU少,就拿51来练练手,搭建51单片机仿真系统,配合着记录一下书本的知识。
最后使用Multisim 12.0搭建出来的最小系统为图1-1所示,通过编写程序可以使LED1循环闪烁。
图1-1正常来说,51单片机最小系统一般包括单片机、晶振电路、复位电路,我没有添加复位电路,因为只是模电的Hello World而已,先熟悉仿真流程。
1、建立一个文件夹MCUDemo,存放所创建的工程,我这里路径是&F:/Multisim/MCUDemo
图1-22、打开Multisim 12.0 软件
图1-3软件的首界面为图1-4,可以再左边工程栏看到默认创建了一个名字为 Design1的Multisim工程
图1-43、 选择File/Save as或者Ctrl+S,保存一下新工程,并改名字为 MCU51Demo,存放在第1步创建的文件夹,如图1-5所示,选择“保存”按钮
图1-5保存完后,软件界面截图如下
图1-64、放置单片机。选择菜单栏的 Place/Component,弹出“Select a component”对话框,选择 Group为 “MCU”,Family为“805x”,Component为“8051”,如图1-7所示
图1-75、在图1-7对话框内,选择好器件后,点击右上角的“OK”按钮,这时可以将选中的8051器件放置在原理图中,当放置好之后(也即点击鼠标左键),会弹出MCU Wizard创建向导,如图1-8所示
图1-86、在图1-8所示中,选择工作空间存放的路径,这里为第1步所创建的文件夹F:/Multisim/MCUDemo/,工作空间名字取名为 MCU51,如下图1-9
图1-9设置好之后,选择 Next7、这一步是设置MCU的工程的类型以及编译语言、名字,Project Type里有Standard和 External Hex File,前者是标准类型(其实我也没用后者),后者是导入外部HEX文件,在本实验中,我选择“Standard”;编程语言Programming Language里选择“C”,即用C语言; 编译工具Assembler/compiler tool一栏选择默认;工程名字Project name设置为“MCU51Debug”,突然感觉起了好多名字。设置好之后如图1-10所示
图1-10设置好之后,选择“Next”8、接下来是设置是否创建空工程,这里按默认值,直接添加一个main.c文件,如图1-11所示
图1-11选择“Finish”9、此时Multisim的工程结构如图1-11所示
图1-1110、接下来就是要搭建最小系统了,首先搭建晶振电路,先添加晶振,选择菜单栏 Place--&Component,在Multisim中,晶振的所属的GROUP为 Misc,Family为CRYSTAL,如图1-12所示,选择 晶振“HC-49/U_11MHz”,我没找到12M的。
图1-12点击右上角的OK,将其放置在合适的位置,这里放置好之后,我右键旋转了一下,放置好之后的如图1-13
图1-1311、然后放置2个30pf的电容,同样的 Place--&Component,电容的Group为Basic,Family为 CAPACITOR,如下图1-14所示
图1-14点击“OK”,放置在合适的位置,按照同样的方法再放置一个30pF的电容,如图1-15所示
图1-1512、然后再放置地 DGND,同样的Place--&Component,如图1-16所示
图1-16放置后的效果如图1-17
图1-17到此,晶振电路就搭建好了,现在可以先将这一部分用线Wire连接,顺带着把单片机的地线也连接,连接后如图1-18所示
图1-1813、放置电源VCC,放置步骤不再啰嗦,如图1-19
图1-19放置并连线,如图1-20
图1-20,到这里其实,51单片机的最最最小系统已经搭建好了,注意其中31脚也和VCC连接了,这是因为对于31脚(EA/Vpp),当接高电平时,单片机在复位后从内部ROM的0000H开始执行;当接低电平时,复位后直接从外部ROM的0000H开始执行。这一点是初学者容易忽略的。尽管最小系统已经搭建好了,但是也无法通过仿真看有什么效果,这里添加一个LED灯,来显示仿真结果。14、同样的添加一个LED,如图1-21,器件对话框,这里选择了一个红色LED
图1-21放置在电路图合适的位置,如图1-22
图1-2215、此时LED还不能直接连接,需要添加一个电阻,保护二极管LED,添加一个1K的电阻,如图1-23
图1-23放置并连接,如图1-24
图1-24我LED灯与单片机连接的引脚是P2.0,引脚可以随便连接。接下来就是Ctrl+S保存一下,再编写51程序16、双击图1-25所示的main.c
图1-25此时main.c的内容如图1-26所示
图1-2617、编写程序,编写完后的main.c内容如下图1-27
图1-27注意 Multisim里的51头文件是8051.h ,不是 reg51.h18、保存一下文件,然后选择工具栏的 MCU--&MCU 8051 U1--&Build,编译程序,如图1-28所示
图1-28编译的结果如下图1-29。此时 0 Errors 0 Warnings
图1-2919、回到原理图界面,点击如图1-30红线圈起的开始按钮,
图1-3020、此时,按常理来说,LED1应该不停闪烁,但是我的没有闪烁。这个与LED的工作电流有关系,下面修改一下,首先 停止仿真,即菜单栏 Simulator--&Stop,然后双击LED1,弹出LED1的属性对话框,如下图1-31
图1-31将上图的On Current值“5”该低一些,这里改为 “2”,如下图1-32所示
图1-32点击OK,然后Ctrl+S保存,再点击“开始仿真”按钮或者 Simulator--&Start,弹出如下对话框
点击“Yes”,此时可以看到LED1闪烁
图1-33 &LED灭 & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & &图1-34 LED亮
到这里,利用Multisim仿真51单片机点亮LED灯的例程差不多完了,中间的一些细节问题还想再写一写,但是到时间去做运动了。不喜勿喷,纯粹就是个人笔记而已,感觉好像回到了大三写博客的时候了...╮(╯▽╰)╭来到上海不容易啊
最新教程周点击榜
微信扫一扫FFT算法在单片机中的使用&&L… - 博客频道 - CSDN.NET
effort0806222的博客
&&好久没更新博客了,觉得对不起自己建立博客的初衷。我这个人太懒了,又没有坚持下去的决心,唉~
&言归正传,本次创新基金我是要做一个简易的频谱仪,核心就是要进行一个FFT运算。大家知道,如果采用DSP芯片效果那是相当好的。但由于项目资金以及时间不够等情况,我采用的是ATMEL公司的AVR单片机,这款单片机的FLASH存储和内存比51单片机犀利得多。
&由于采用的是12864液晶,也就是一个横128点竖64点的一个点阵,因而采用128点FFT运算已然够了,因为即使得到再多的数据也无法在液晶上可视化显示出来。本文是基于128点FFT运算。
&程序如下:
#include &iom16v.h&
#include &macros.h&
#include&math.h&
#define N 128
#define PI 3.
#define uchar unsigned char&
#define uint unsigned int&
typedef struct
void initw(); & &
&//初始化旋转因子
void bitReverse(); & &
//比特反转
void FFT();
complex x[N];
uchar vis[N];
void delayms(uint ms)
&for(i=0;i&i++)
&for(j=0;j&3;j++);
void FFT()
int i,j,k,t,P,B,m;
complex up,down,
for (i=0;i&7;i++)
for (j=0;j&B;j++)
t=1&&(6-i);
for (k=j;k&N;k=k+2*B)
product.real=x[k+B].real*cos(2*PI*P/N)+x[k+B].img*sin(2*PI*P/N);
product.img=x[k+B].real*(-1)*
sin(2*PI*P/N)+x[k+B].img*cos(2*PI*P/N);
&x[k+B].real=x[k].real-product.
&x[k+B].img=x[k].img-product.
&x[k].real=x[k].real+product.
&x[k].img=x[k].img+product.
void initw() &//初始化旋转因子
for (i=0;i&N;i++)
void bitReverse() &//比特反转
int i,j=0;
complex tmp3;
for (i=0;i&N;i++)
& &int tmp=i,tmp2=0,j;
&for(j=0;j&7;j++)
&tmp2+=((tmp&&j)&1)*(1&&(6-j));
if(vis[i]==0)
& & tmp3=x[i];
x[i]=x[tmp2];
& & x[tmp2]=tmp3;
vis[tmp2]=1;
void main()
uchar ii,y;
for (ii=0;ii&20;ii++)
x[ii].real=3;
x[ii].img=0;
for (ii=20;ii&128;ii++)
x[ii].real=0;
x[ii].img=0;
bitReverse();
&上图是8点FFT运算,按照上图的流程所示,FFT运算主要有两步,一步是比特反转,就是右边不是按照0、1、2、3……这样顺序进行计算的,而左边是的,两边的关系就是进行一个比特反转。可以看到右边0对应二进制为000,左边对应二进制为000,右边1二进制001,左边4对应二进制100,依次下去,可以清楚看到,对于8位FFT运算,对应二进制有三位,而左右两边的关系恰巧是按照中间位进行了个反转。
&FFT运算第二步就是乘以旋转因子,注意的是这里是复数运算,虚部和实部都要加入运算。乘以旋转因子后对进行加减运算得到新的值,依次下去得到最终解。
&由于单片机内存的限制,因而对于传统的FFT算法,我进行了些改进,原则就是尽量地少使用变量,一个变量可以重复的使用是最理想的了,大家可以在程序中看出。个人意见这是能节省变量最少的了,如果有好的方法,希望可以告诉我下,我的邮箱是,谢谢!
&& 下面是12864液晶驱动程序的写法:
&&&LCD12864128*6412864“”16*168*16
LCDRSRWERS01RW10E
下面的函数是12864与FFT算法的一个结合,里面设置了一个门函数,12864上显示的结果则是一个sinc函数,证明结果是正确的。
#include &iom16v.h&
#include &macros.h&
#include&math.h&
#define N 128
#define PI 3.
#define uchar unsigned char&
#define uint unsigned int&
#define RS (1&&4)
#define RW (1&&5)
#define EN (1&&6)
typedef struct
void initw(); & &
&//初始化旋转因子
void bitReverse(); & &
& & & //比特反转
void FFT();
complex x[N];
uchar vis[N];
void delayms(uint ms)
&for(i=0;i&i++)
&for(j=0;j&3;j++);
//此处定义字符串
void WriteDataLCM(unsigned char WDLCM)
&//写数据函数
// ReadStatusLCM(); //检测忙
delayms(1);
PORTA|=RS; & & &
//RS=1 & &
delayms(1);
PORTA&=~RW; & &
delayms(1);
PORTA|=EN; & & &
delayms(1);
PORTB=WDLCM; & & //输出数据
delayms(1);
PORTA&=~EN; & &
delayms(1);
void WriteCommandLCM(unsigned char WCLCM) //写命令函数
// ReadStatusLCM(); //根据需要检测忙
delayms(1);
PORTA&=~RS; & &
delayms(1);
PORTA&=~RW; & &
delayms(1);
PORTA|=EN; & & &
delayms(1);
PORTB=WCLCM; & & //输出指令
delayms(1);
PORTA&=~EN; & &
delayms(1);
//读状态:检测忙
void ReadStatusLCM() &//读状态函数
&& &uchar flag =
&while(flag==1)
delayms(1);
& &DDRB=0x00; &
& &//端口B改为输入
delayms(1);
PORTA&=~RS; & &
delayms(1);
PORTA|=RW; & &
delayms(1);
PORTA|=EN; & &
delayms(10);
temp = PINB; & &//读端口B
delayms(10);
DDRB=0 & &
&//端口B改为
delayms(10);
PORTA&=~EN; & &
delayms(1);
if(temp&&7==0)
uchar read_data() //读数据函数
&&uchar lcd_
&&DDRB=0x00;
&&PORTA|=RW;
&&PORTA|=RS;&
&&delayms(10);
&&PORTA|=EN;
&&delayms(10);
&&lcd_data=PINB;
&&delayms(10);
&&PORTA&=~EN;
&&return(lcd_data) ;
void point(uchar x,uchar y) //打点函数,最重要的函数,GUI的基础
&&uchar x_Dyte,x_
&&uchar y_Dyte,y_
GDRAM_hbit,GDRAM_
&&WriteCommandLCM(0x36);
&&x_Dyte=x/16;
&&x_byte=x&0x0f;
&&y_Dyte=y/32;
&&y_byte=y&0x1f;
&&WriteCommandLCM(0x80+y_byte);
&&WriteCommandLCM(0x80+x_Dyte+8*y_Dyte);
&&read_data();
&&GDRAM_hbit=read_data();
&&GDRAM_lbit=read_data();
&& delayms(10);
&&WriteCommandLCM(0x80+y_byte);
&&WriteCommandLCM(0x80+x_Dyte+8*y_Dyte);
&& delayms(10);
&&if(x_byte&8)
&WriteDataLCM(GDRAM_hbit|(0x01&&(7-x_byte)));
&WriteDataLCM(GDRAM_lbit);
&WriteDataLCM(GDRAM_hbit);
&WriteDataLCM(GDRAM_lbit|(0x01&&(15-x_byte)));
&WriteCommandLCM(0x30);
//LCM初始化
void LCMInit(void)&
WriteCommandLCM(0x30); &
&//三次显示模式设置,不检测忙信号
delayms(10);
WriteCommandLCM(0x30);
delayms(10);&
WriteCommandLCM(0x30);
delayms(10);&
WriteCommandLCM(0x30); &
&//显示模式设置,开始要求每次检测忙信号
WriteCommandLCM(0x08); &
&//关闭显示
WriteCommandLCM(0x01); &
&//显示清屏
WriteCommandLCM(0x06); &
&//显示光标移动设置
WriteCommandLCM(0x0C); &
&//显示开及光标设置
void clear(uchar dat) &//清屏函数
&&uchar i,j,k;
&&uchar addr=0x80;
&&for(i=0;i&2;i++)
&for(j=0;j&32;j++)
&for(k=0;k&8;k++)
&WriteCommandLCM(0x36);
&WriteCommandLCM(0x80+j);
&WriteCommandLCM(addr+k);
&WriteDataLCM(dat);
&WriteDataLCM(dat);
& addr=0x88;
&& WriteCommandLCM(0x36);
&& WriteCommandLCM(0x30);
void heng(uchar a)
&&for(i=0;i&127;i++)
&point(i,a);
void su(uchar a)
&&for(i=0;i&63;i++)
&point(a,i);
void FFT()
int i,j,k,t,P,B,m;
complex up,down,
for (i=0;i&7;i++)
for (j=0;j&B;j++)
t=1&&(6-i);
for (k=j;k&N;k=k+2*B)
product.real=x[k+B].real*cos(2*PI*P/N)+x[k+B].img*sin(2*PI*P/N);
product.img=x[k+B].real*(-1)*
sin(2*PI*P/N)+x[k+B].img*cos(2*PI*P/N);
&x[k+B].real=x[k].real-product.
&x[k+B].img=x[k].img-product.
&x[k].real=x[k].real+product.
&x[k].img=x[k].img+product.
void initw() &//初始化旋转因子
for (i=0;i&N;i++)
void bitReverse() &//比特反转
int i,j=0;
complex tmp3;
for (i=0;i&N;i++)
& &int tmp=i,tmp2=0,j;
&for(j=0;j&7;j++)
&tmp2+=((tmp&&j)&1)*(1&&(6-j));
if(vis[i]==0)
& & tmp3=x[i];
x[i]=x[tmp2];
& & x[tmp2]=tmp3;
vis[tmp2]=1;
void xian(uchar x,uchar y)
&&for(i=63;i&=y;i--)
&point(x,i);
void main(void)
uchar ii,y;
&& &//端口初始化
PORTD=0x00;
delayms(20);&
delayms(20); &
LCMInit(); //LCM初始化 & //液晶初始化
delayms(100);
&clear(0x00);
for (ii=0;ii&20;ii++)
x[ii].real=3;
x[ii].img=0;
for (ii=20;ii&128;ii++)
x[ii].real=0;
x[ii].img=0;
bitReverse();
for(ii=64;ii&128;ii++)
&tmp=sqrt((x[ii].real*x[ii].real)+(x[ii].img*x[ii].img));
& &y= 63-(int)
point(ii-64,y);
xian(ii-64,y);
for(ii=0;ii&64;ii++)
&tmp=sqrt((x[ii].real*x[ii].real)+(x[ii].img*x[ii].img));
& &y= 63-(int)
point(ii+64,y);
xian(ii+64,y);
得到的图片:
MATLAB仿真图形:
effort0806222
排名:千里之外
(19)(0)(3)(1)(11)}

我要回帖

更多关于 视频添加滚动水印 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信