/**************************************************************** 外部晶振8M PA0~3:四位数码管的位选 PB0~7:数码管的8位段选 外部中断0用于计数 定时器0溢出中断的定时为1ms 说明 :检测到水流较小时,继电器延时1秒关闭 ******************************************************************/ #include<iom16v.h> #include<macros.h> #define uchar unsigned char #define uint unsigned int char led_7[10]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F}; //数码管段选 char position[4]={0xfe,0xfd,0xfb,0xf7};//数码管位选 uint sumnum=0; //用于记录1000ms内进入中断的次数 uint time=0; //记录进入比较定时器0的次数 uint num=0; //记录1ms内进入中断的次数 uint count=0; //进入外部中断0的次数 uchar flag; uint sumnum1; //记录100ms内的数目 /***************************函数声明***************************/ void delay(); void display(uint m ); void init(); void init_0(); void init_2(); void _delay_us(uint l) { unsigned int i; for(i=0;i<l;i++) { asm("nop"); } } /**************************主函数***********************************/ void main() { init(); init_0(); init_2(); while(sumnum<5) { PORTD=0XBF; segdisplay(sumnum1); } while(1) { segdisplay(sumnum1); } } /*************************扫描数码管时的延时函数*********************/ void delay() { uchar i,j; for(i=6;i>0;i--) for(j=225;j>0;j--); } /************************数码管显示函数*****************************/ void segdisplay( int temp) { int seg[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; int temp1,temp2,temp3,temp4; temp1=temp/1000; temp2=(temp/100)%10; temp3=(temp/10)%10; temp4=temp%10; DDRB=0xff; DDRA|=0x0f; PORTA=~BIT(3); PORTB=seg[temp1]; _delay_us(100); PORTA=~BIT(2); PORTB=seg[temp2]; _delay_us(100); PORTA=~BIT(1); PORTB=seg[temp3]; _delay_us(100); PORTA=~BIT(0); PORTB=seg[temp4]; _delay_us(100); } /***********************管脚初始化函数*********************/ void init() { DDRD|=0X40; //PD4 设置为输出 PORTD=0XBF; DDRA=0XFF; DDRB=0XFF; PORTA=0XFF; PORTB=0XFF; } /***********************外部中断0初始化*********************/ void init_0() { MCUCR=0X02; //INT0为下降沿触发 GICR=0X40; //使能INT0中断 SREG=0X80; //使能总中断 } /**********************定时器2初始化***********************/ void init_2() { TCCR0=0x03; // 内部时钟,64 分频(8M/64=125KHz) TCNT0=0x83; //装初值 TIMSK=0x01; // 允许 T/C0溢出中断中断 } /***********************外部中断0子函数********************/ #pragma interrupt_handler int0_isr:2 void int0_isr(void) { count++; } /*********************定时计数器0溢出中断子函数*****************/ #pragma interrupt_handler int0_over:10 void int0_over(void) { TCNT0=0x83; //重装初值 if((time%100) == 0) sumnum1 = num; if(time == 1000) { sumnum=num; if(sumnum<10) { if((flag==1)&&(sumnum<10)) { PORTD=0XFF; flag=0; } flag++; } else PORTD=0XBF; num=0; time=0; } num+=count; count=0; ++time; }
标签: C语言
上传时间: 2016-03-09
上传用户:彦 yan
最简单的阿尔法 贝塔 伽马 滤波程序 设置了初值 和真实值 并对真实值和估计值进行了比较
标签: 卡尔曼滤波
上传时间: 2016-10-21
上传用户:260970449
针对传统的系统级标定方法状态变量维数高、标定参数可观测性差等特点,提出一种十位置系统级标 定方法。该方法以分立式标定结果为初值,以速度误差和姿态误差作为观测量,合并加速度计标定误差和光 纤陀螺标定误差,降低Kalman滤波器维数。设计10个位置对SINS标定误差进行估计,然后将估计值进行解 耦,计算SINS标定参数。仿真和转台实验结果表明:十位置系统级标定方法可以一次性标定出标度因数、安 装误差和零位等24个标定参数。
上传时间: 2016-10-23
上传用户:260970449
/*import java.util.Scanner; //主类 public class student122 { //主方法 public static void main(String[] args){ //定义7个元素的字符数组 String[] st = new String[7]; inputSt(st); //调用输入方法 calculateSt(st); //调用计算方法 outputSt(st); //调用输出方法 } //其他方法 //输入方法 private static void inputSt(String st[]){ System.out.println("输入学生的信息:"); System.out.println("学号 姓名 成绩1,2,3"); //创建键盘输入类 Scanner ss = new Scanner(System.in); for(int i=0; i<5; i++){ st[i] = ss.next(); //键盘输入1个字符串 } } //计算方法 private static void calculateSt(String[] st){ int sum = 0; //总分赋初值 int ave = 0; //平均分赋初值 for(int i=2;i<5;i++) { /计总分,字符变换成整数后进行计算 sum += Integer.parseInt(st[i]); } ave = sum/3; //计算平均分 //整数变换成字符后保存到数组里 st[5] = String.valueOf(sum); st[6] = String.valueOf(ave); } //输出方法 private static void outputSt(String[] st){ System.out.print("学号 姓名 "); //不换行 System.out.print("成绩1 成绩2 成绩3 "); System.out.println("总分 平均分");//换行 //输出学生信息 for(int i=0; i<7; i++){ //按格式输出,小于6个字符,补充空格 System.out.printf("%6s", st[i]); } System.out.println(); //输出换行 } }*/ import java.util.Scanner; public class student122 { public static void main(String[] args) { // TODO 自动生成的方法存根 String[][] st = new String[3][8]; inputSt(st); calculateSt(st); outputSt(st); } //输入方法 private static void inputSt(String st[][]) { System.out.println("输入学生信息:"); System.out.println("班级 学号 姓名 成绩:数学 物理 化学"); //创建键盘输入类 Scanner ss = new Scanner(System.in); for(int j = 0; j < 3; j++) { for(int i = 0; i < 6; i++) { st[j][i] = ss.next(); } } } //输出方法 private static void outputSt(String st[][]) { System.out.println("序号 班级 学号 姓名 成绩:数学 物理 化学 总分 平均分"); //输出学生信息 for(int j = 0; j < 3; j++) { System.out.print(j+1 + ":"); for(int i = 0; i < 8; i++) { System.out.printf("%6s", st[j][i]); } System.out.println(); } } //计算方法 private static void calculateSt(String[][] st) { int sum1 = 0; int sum2 = 0; int sum3 = 0; int ave1 = 0; int ave2 = 0; int ave3 = 0; for(int i = 3; i < 6; i++) { sum1 += Integer.parseInt(st[0][i]); } ave1 = sum1/3; for(int i = 3; i < 6; i++) { sum2 += Integer.parseInt(st[1][i]); } ave2 = sum2/3; for(int i = 3; i < 6; i++) { sum3 += Integer.parseInt(st[2][i]); } ave3 = sum3/3; st[0][6] = String.valueOf(sum1); st[1][6] = String.valueOf(sum2); st[2][6] = String.valueOf(sum3); st[0][7] = String.valueOf(ave1); st[1][7] = String.valueOf(ave2); st[2][7] = String.valueOf(ave3); } }
上传时间: 2017-03-17
上传用户:simple
用迭代法求方程 x3-x2-1=0 在[1.3, 1.6]内的一个实根,选初值x0 =1.3,迭代一步。
标签: gggggg
上传时间: 2017-05-09
上传用户:mic0000
对于非线性方程组F(X)=0,用fsolve函数求其数值解。fsolve函数的调用格式为: X=fsolve('fun',X0,option) 其中X为返回的解,fun是用于定义需求解的非线性方程组的函数文件名,X0是求根过程的初值,option为最优化工具箱的选项设定。最优化工具箱提供了20多个选项,用户可以使用optimset命令将它们显示出来。如果想改变其中某个选项,则可以调用optimset()函数来完成。例如,Display选项决定函数调用时中间结果的显示方式,其中‘off’为不显示,‘iter’表示每步都显示,‘final’只显示最终结果。optimset(‘Display’,‘off’)将设定Display选项为‘off’。
标签: MATLAB fsolve 非线性 方程 代码 源程序
上传时间: 2017-07-31
上传用户:ChrisQQQ
四阶龙格-库塔法源程序代码,用于求解一阶或高阶常微分方程(组)的初值问题。
标签: 源程序
上传时间: 2017-12-29
上传用户:liudansn
采用四阶龙格库塔法求解初值微分方程,采用Fortran语言进行编译
标签: Fortran
上传时间: 2018-06-07
上传用户:zhuchenmp
function [alpha,N,U]=youxianchafen2(r1,r2,up,under,num,deta) %[alpha,N,U]=youxianchafen2(a,r1,r2,up,under,num,deta) %该函数用有限差分法求解有两种介质的正方形区域的二维拉普拉斯方程的数值解 %函数返回迭代因子、迭代次数以及迭代完成后所求区域内网格节点处的值 %a为正方形求解区域的边长 %r1,r2分别表示两种介质的电导率 %up,under分别为上下边界值 %num表示将区域每边的网格剖分个数 %deta为迭代过程中所允许的相对误差限 n=num+1; %每边节点数 U(n,n)=0; %节点处数值矩阵 N=0; %迭代次数初值 alpha=2/(1+sin(pi/num));%超松弛迭代因子 k=r1/r2; %两介质电导率之比 U(1,1:n)=up; %求解区域上边界第一类边界条件 U(n,1:n)=under; %求解区域下边界第一类边界条件 U(2:num,1)=0;U(2:num,n)=0; for i=2:num U(i,2:num)=up-(up-under)/num*(i-1);%采用线性赋值对上下边界之间的节点赋迭代初值 end G=1; while G>0 %迭代条件:不满足相对误差限要求的节点数目G不为零 Un=U; %完成第n次迭代后所有节点处的值 G=0; %每完成一次迭代将不满足相对误差限要求的节点数目归零 for j=1:n for i=2:num U1=U(i,j); %第n次迭代时网格节点处的值 if j==1 %第n+1次迭代左边界第二类边界条件 U(i,j)=1/4*(2*U(i,j+1)+U(i-1,j)+U(i+1,j)); end if (j>1)&&(j U2=1/4*(U(i,j+1)+ U(i-1,j)+ U(i,j-1)+ U(i+1,j)); U(i,j)=U1+alpha*(U2-U1); %引入超松弛迭代因子后的网格节点处的值 end if i==n+1-j %第n+1次迭代两介质分界面(与网格对角线重合)第二类边界条件 U(i,j)=1/4*(2/(1+k)*(U(i,j+1)+U(i+1,j))+2*k/(1+k)*(U(i-1,j)+U(i,j-1))); end if j==n %第n+1次迭代右边界第二类边界条件 U(i,n)=1/4*(2*U(i,j-1)+U(i-1,j)+U(i+1,j)); end end end N=N+1 %显示迭代次数 Un1=U; %完成第n+1次迭代后所有节点处的值 err=abs((Un1-Un)./Un1);%第n+1次迭代与第n次迭代所有节点值的相对误差 err(1,1:n)=0; %上边界节点相对误差置零 err(n,1:n)=0; %下边界节点相对误差置零 G=sum(sum(err>deta))%显示每次迭代后不满足相对误差限要求的节点数目G end
标签: 有限差分
上传时间: 2018-07-13
上传用户:Kemin
51里,从中断开始,很多初学者就会感到很迷茫,不知道自己在学什么,特上传此资料。单片机在执行程序的过程中,暂时中断执行当前的程序,转而去执行其他的应急处理程序,称为中断。例如。你正在餐厅吃饭,有朋友喊你去接电话,于是你就收到了来自朋友的一个中断(可以叫做外部中断),当你准备去接电话时,突然肚子疼,需要上厕所(内部中断),这又是一个中断,我们把引起中断的事件叫中断源(例如接电话、上厕所等,外部引起的叫外部中断,内部引起的叫内部中断),产生中断就要去处理它,这称为中断的响应。在接电话、上厕所这些中断源中,显然上厕所更需要立刻处理,这就是中断的优先级。 51单片机的中断系统十分重要,分为外部中断和定时器中断。中断发生CPU在处理某一事件A时,发生了另一事件B请求CPU迅速去处理中断响应和中断服务CPU暂时中断当前的工作,转去处理事件B中断返回待CPU将事件B处理完毕后,再回到原来事件A被中断的地方继续处理事件A这一过程称为中断单片机有10个寄存器主要与中断程序的书写控制有关中断允许控制寄存器IE定时器控制寄存器TCON串口控制寄存器SCON中断优先控制寄存器IP定时器工作方式控制寄存器TMOD定时器初值赋予寄存器(TH0/TH1,TL0/TL1)
上传时间: 2022-02-16
上传用户:qdxqdxqdxqdx