单片机C语言算法(1)
单片机C语言快速精度除法方案
单片机C语言快速精度除法方案单片机C语言快速精度除法方案目前的51单片机在进行带小数点结果的除法一般可以采用浮点数计算的方式,但是浮点数计算有一个缺点就是非常耗时,在对时间要求严格的工况就不太适用。
笔者的工作室长期承接单片机、电路、机电液、工控、自动化、计算机软件等项目,最近做了个单片机计算器的设计,在设计除法时利用长整形除法和取余运算,可以得到若干小数位的精度运算,与大家共享。
设计思路如下:假设长整形除数a, 长整形被数b,步骤如下:<1>得到除法的整数部分,c=a/b;<2>设d为a%b,e=10*d,得到除法的第一位小数,f=e/b;(要点:将a余b的余数乘以10倍,再和被除数b相除,就得到小数点后一位小数)<3>设g为e%b,h=10*g,得到除法的第二位小数,i=h/b;以此类推,可以得到除法的任意小数……/**********************************下面附上C语言程序**********************************************************/unsigned long result, result_p;//表示除法结果的整数和小数部分// result_p是小数部分,例如result_p=12345678,表示0.123 45678Void chufa(unsigned long chushu, unsigned long beichushu, unsigned char wei)// wei表示精确到小数点后多少位{ unsigned char i;unsigned long tmp;result=result_p=0;if (beichushu!=0)//被除数必须不为0 {if (wei==0){result=chushu/beichushu;//计算整数部分result_p=0;}else{result=chushu/beichushu;//计算整数部分tmp=chushu%beichushu;for (i=1;i<=wei;i++)//计算小数部分{tmp=tmp*10;result_p=result_p*10+tmp/beichushu; tmp=tmp%beichushu;}}}。
单片机C语言编程学习
单片机C 语言编程学习一、概述在一个集成电路芯片上集成微处理器、存储器、I/0接口电路,从而构成了单片机。
Intel公司推出了MCS-51系列单片机:集成8位CPU、4K字节ROM、128字节的RAM、4个8位并口、一个全双工串行口、2个16位定时器/计数器。
寻址范围64K,并有控制功能较强的布尔处理器。
二、预备知识<一>、电平特性1、数字电路中只有两种电平:高和低(本课程中)定义单片机为TTL电平:高+5V 低0V2、RS232电平:计算机的串口(-9V~15V) 高-12V 低+12V (+3V~+15V)所以计算机与单片机之间通讯时需要加电平转换芯片max232。
<二>、二进制与十六进制的表示及转换1、二进制:数字电路中的两种电平特性决定了它:0 0 6 110 12 11001 1 7 111 13 11012 10 8 1000 14 11103 11 9 1001 15 11114 100 10 1010 16 100005 101 11 10112、十六进:是二进制的简短表示形式。
十进制中的0-15分别表示为十六进制的0、1、2、3、4、5、6、7、8、9、A、B、C、D、E、F3、熟练掌握二进制与十六进制之间的转换。
规律:一般把四个二进制数放在一起转换成一个十六进制数,转换时先把二进制数转换成十进制数,再把十进制数转换成十六进制数。
如:0001B -> 1 -> 1HB表示为二进制,H为十六进制1001B -> 9 -> 9H1010B -> 10 -> AH0010 1100 -> 44 -> 2CH4、二进制各种对制关系:<三>、二进制数的逻辑运算1. “与”运算“与”运算是实现“必须都有,否则就没有”这种逻辑关系的一种运算。
运算符为“· ”, 其运算规则如下:0·0=0, 0·1=1·0=0, 1·1=12. “或”运算“或”运算是实现“只要其中之一有,就有”这种逻辑关系的一种运算, 其运算符为“+”。
单片机C语言(模块一)
《单片机原理及应用(二)》模块一C51程序设计基础任务1:实例导航第二章C与80512.1 8051的编程语言1、8051的编程语言(四种):(1)BASIC语言(2)PL/M√(3)汇编语言√(4)C语言目前,汇编语言和C语言是广泛使用的两种单片机编程语言。
在未来的一段时间内,汇编语言和C语言还将同时存在,但从发展趋势看,C语言有逐渐取代汇编语言的可能。
最好的单片机编程者应是具有汇编语言基础,又精通C语言的。
2、C语言的优点(与汇编语言相比):(P41)(1)对单片机的指令系统不要求了解,仅要求对8051的存储器结构有所了解(2)寄存器的分配、不同存储器的寻址及数据类型等细节由编译器管理(3)程序有规范的结构,由不同的函数组成,这种方式可使程序结构化(4)编程及程序调试时间显著缩短,从而提高效率(5)提供库函数,具有较强的数据处理能力3、8051单片机C语言(单片机C51语言)了解一下单片机的种类:(查资料)2.2 Cx51编译器编译:C语言源程序转换成机器语言目标程序的过程,叫做编译。
编译器:能自动完成编译过程的一种计算机软件。
(1)C语言编译器(标准C)(2)C51编译器(经典8051单片机)(3)C x51编译器(经典8051单片机及派生产品)Cx51编译器完全遵照ANSI C语言标准,支持C语言的所有标准特征。
另外,还增加了可以直接支持8051结构的特征。
典型产品:KILE套装工具软件----------uVision2 集成开发环境的使用(P 302)例2-1:用uVision2软件编译调试一个C51程序(HELLO.C)基本步骤:(1)创建一个新项目(建在一个新文件夹下)并为项目选择一个CPU(此时会自动加入启动文件)(2)创建新程序文件(或打开旧程序文件)此例中,打开c:\kile\c51\examples\hello(3)将源文件添加到项目中此时还可修改工具选项(4)编译和链接项目(Build Target命令):翻译和链接源文件,并生成一个可以载入到uvision2调试器进行调试的绝对目标模块。
STC单片机C语言程序设计STC单片机C语言编程入门
STC单片机C语言程序设计STC单片机C语言编程入门STC单片机是一种广泛应用于嵌入式系统和物联网设备中的微控制器。
它具有体积小、功耗低、运算能力强等特点,被广泛应用于各种控制系统中。
本文将介绍STC单片机C语言程序设计的入门知识,以帮助初学者快速上手。
首先,我们需要了解一些基本的概念和术语。
1.单片机:单片机是一种集成电路芯片,其中包含了中央处理器、存储器、输入输出接口等功能模块。
它可以独立完成特定的任务,不需要额外的硬件设备与之配合。
2.C语言:C语言是一种高级编程语言,被广泛应用于嵌入式系统开发中。
它具有简洁、高效的特点,易于理解和学习。
了解了上述基本概念后,接下来我们将介绍一些STC单片机C语言程序设计的入门知识。
2. 程序结构:一个C语言程序通常由多个函数组成,其中一个函数名为main(。
程序从main(函数开始执行,执行完main(函数后程序结束。
3.数据类型:C语言中有多种数据类型,包括整型、浮点型、字符型等。
在使用数据类型时,需要根据需要选择合适的数据类型。
4.变量和常量:在C语言中,可以使用变量和常量来存储数据。
变量是可以改变值的,而常量是固定不变的值。
5. 输入和输出:C语言中使用标准库函数scanf(和printf(来实现输入和输出操作。
通过这两个函数可以从键盘获取输入数据,并将结果输出到屏幕上。
6. 控制语句:在C语言中,可以使用if语句、for循环和while循环等控制语句来控制程序的执行流程。
通过控制语句,可以实现条件判断、循环执行等功能。
7.函数:函数是C语言中的重要概念,它可以将一段代码封装成一个独立的模块,方便重复使用。
在编写程序时,可以自定义函数来实现特定的功能。
8.数组:数组是一种存储相同类型数据的连续内存区域。
在C语言中,可以使用数组来存储一组数据,并对数据进行操作。
9.文件操作:C语言提供了文件操作函数,可以对文件进行读写操作。
通过文件操作,可以实现数据的持久化存储。
单片机C语言快速精度除法方案
单片机C语言快速精度除法方案单片机中进行除法操作时,可以采用多种方法来提高运算速度和精度。
下面介绍一种利用查表法来实现快速精度除法的方案。
在单片机中,由于乘法运算相对于除法来说速度更快,我们可以通过将除数乘以一些系数,将除法转换为乘法来实现快速运算。
假设要进行a/b的除法运算,其中a为被除数,b为除数。
首先确定一个系数k,将除数b乘以k,得到乘积c=k*b,然后再进行a/c的除法运算。
为了提高运算精度,我们可以利用查表法来获得除数的系数k。
假设查表法已经得到了一个包含n个元素的查找表,每个元素的索引值为i,对应的值为ki。
查找表中的元素可以通过预先计算或使用数学方法获得。
下面介绍利用查表法进行快速精度除法的步骤:1.根据所需精度选择或生成一个包含n个元素的查找表。
2. 将除数b拆分为整数部分和小数部分,例如b = b_int + b_frac。
3. 根据整数部分b_int在查找表中查找对应的系数ki,记为ki_int。
4. 将小数部分b_frac乘以系数ki_int得到乘积c_frac = b_frac* ki_int。
5. 将被除数a拆分为整数部分和小数部分,例如a = a_int +a_frac。
6. 将整数部分a_int进行正常除法运算,得到商q_int。
7. 将小数部分a_frac和c_frac进行除法运算,得到商q_frac。
8. 将商q_int和q_frac合并得到最终结果q。
通过将除法转换为乘法和查表操作,可以实现快速且精度较高的除法运算。
这种方法在处理对除法运算精度要求较高的场景中特别有效,可以大大提高单片机的计算效率。
需要注意的是,在选择或生成查找表时,应该根据具体的应用需求来确定表的大小和精度级别。
过小的查找表可能导致运算精度不够,而过大的查找表则会占用过多的存储空间。
因此,在设计中需要权衡计算速度和存储空间的使用。
此外,还可以通过并行计算、硬件加速等方法来进一步提高除法运算的速度和精度。
单片机常用的C语言算法
算法的描述:是对要解决一个问题或要完成一项任务所采取的方法和步骤的描述,包括需要什么数据(输入什么数据、输出什么结果)、采用什么结构、使用什么语句以及如何安排这些语句等。
通常使用自然语言、结构化流程图、伪代码等来描述算法。
一、计数、求和、求阶乘等简单算法此类问题都要使用循环,要注意根据问题确定循环变量的初值、终值或结束条件,更要注意用来表示计数、和、阶乘的变量的初值。
例:用随机函数产生100个[0,99]范围内的随机整数,统计个位上的数字分别为1,2,3,4,5,6,7,8,9,0的数的个数并打印出来。
本题使用数组来处理,用数组a[100]存放产生的确100个随机整数,数组x[10]来存放个位上的数字分别为1,2,3,4,5,6,7,8,9,0的数的个数。
即个位是1的个数存放在x[1]中,个位是2的个数存放在x[2]中,……个位是0的个数存放在数组x[10]。
二、求两个整数的最大公约数、最小公倍数分析:求最大公约数的算法思想:(最小公倍数=两个整数之积/最大公约数)(1) 对于已知两数m,n,使得m>n;(2) m除以n得余数r;(3) 若r=0,则n为求得的最大公约数,算法结束;否则执行(4);(4) m←n,n←r,再重复执行(2)。
例如: 求 m="14" ,n=6 的最大公约数.m n r14 6 26 2 0三、判断素数只能被1或本身整除的数称为素数基本思想:把m作为被除数,将2—INT()作为除数,如果都除不尽,m就是素数,否则就不是。
(可用以下程序段实现)四、验证哥德巴赫猜想(任意一个大于等于6的偶数都可以分解为两个素数之和)基本思想:n为大于等于6的任一偶数,可分解为n1和n2两个数,分别检查n1和n2是否为素数,如都是,则为一组解。
如n1不是素数,就不必再检查n2是否素数。
先从n1=3开始,检验n1和n2(n2=N-n1)是否素数。
然后使n1+2 再检验n1、n2是否素数,… 直到n1=n/2为止。
(1小时学会C语言51单片机)C语言入门教程1
我们在单片机最小系统上接个LED,看我们能否点亮它!对了,上面也有好几次提到过单片机最小系统了,所谓单片机最小系统就是在单片机上接上最少的外围电路元件让单片机工作。
一般只须连接晶体、VCC、GND、RST即可,一般情况下,A T89C51的31脚须接高电平。
#include<reg51.h> //头文件定义。
或用#include<at89x51.h>其具体的区别在于:后者定义了更多的地址空间。
//在Keil安装文件夹中,找到相应的文件,比较一下便知!sbit P1_0 = P1 ^ 0; //定义管脚void main (void){while(1){P1_0 = 0;//低电平有效,如果把LED反过来接那么就是高电平有效}}就那么简单,我们就把接在单片机P1_0上的LED点亮了,当然LED是低电平,才能点亮。
因为我们把LED的正通过电阻接至VCC。
P1_0 = 0; 类似与C语言中的赋值语句,即把0 赋给单片机的P1_0引脚,让它输出相应的电平。
那么这样就能达到了我们预先的要求了。
while(1)语句只是让单片机工作在死循环状态,即一直输出低电平。
如果我们要试着点亮其他的LED,也类似上述语句。
这里就不再讲了。
点亮了几个LED后,是不是让我们联想到了繁华的街区上流动的彩灯。
我们是不是也可以让几个LED依次按顺序亮呢?答案是肯定的!其实显示的原理很简单,就是让一个LED灭后,另一个立即亮,依次轮流下去。
假设我们有8个LED分别接在P1口的8个引脚上。
硬件连接,在P1_1--P1_7上再接7个LED即可。
例程如下:#include<reg51.h>sbit P1_0 = P1 ^ 0;sbit P1_1 = P1 ^ 1;sbit P1_2 = P1 ^ 2;sbit P1_3 = P1 ^ 3;sbit P1_4 = P1 ^ 4;sbit P1_5 = P1 ^ 5;sbit P1_6 = P1 ^ 6;sbit P1_7 = P1 ^ 7;void Delay(unsigned char a){unsigned char i;while( --a != 0){for(i = 0; i < 125; i++); //一个; 表示空语句,CPU空转。
51单片机C语言编程100例-单片机c语言编程
51单片机C语言编程100例-单片机c语言编程51单片机C语言编程100例在嵌入式系统领域,单片机是常用的硬件平台之一。
而C语言作为一种高级编程语言,能够为单片机编程提供更高的效率和便利性。
本文将介绍51单片机C语言编程的100个实例,帮助读者了解并掌握单片机的基本编程技巧和应用方法。
一、LED灯控制1. 实例介绍:通过控制51单片机的IO口输出,实现对LED灯的亮灭控制。
2. 实例代码:```#include <reg51.h>sbit LED = P1^0; // 定义P1口的第0位为LEDvoid main(){while(1){LED = 0; // LED灯亮delay(1000); //延时1秒LED = 1; // LED灯灭delay(1000); //延时1秒}}```二、数码管显示1. 实例介绍:使用数码管显示数字0-9,并实现数码管的动态显示效果。
2. 实例代码:```#include <reg51.h>unsigned char code DispTab[] ={0xC0,0XF9,0XA4,0XB0,0X99,0X92,0X82};sbit WeiDu = P1^2;sbit DUAN = P1^0;void delay(unsigned int t){unsigned int i;while(t--)for(i=0;i<125;i++);}void main(){unsigned int i;while(1){P0 = DispTab[i]; // 显示数字iDUAN = 1; //点亮段码DUAN = 0; //关闭段码P0 = ~(0x01 << i); // 选择数码管的位 WeiDu = 0; // 打开选通位WeiDu = 1; // 关闭选通位delay(100); // 延时100msi++;if(i > 9) i = 0;}}```三、外部中断1. 实例介绍:使用外部中断,当外部输入信号发生变化时,触发中断程序。
51单片机c语言教程
51单片机c语言教程在本教程中,我们将学习如何在51单片机上使用C语言进行编程。
无论您是初学者还是有一定经验的开发者,本教程都将对您有所帮助。
首先,我们需要了解一些基本概念。
51单片机是一种基于哈弗微电子公司的MCS-51架构的微控制器。
它采用了Harvard结构,即将程序存储器和数据存储器分开。
它具有各种功能和接口,可以满足不同的应用需求。
在使用C语言进行51单片机编程之前,必须安装相应的开发工具。
这里我们推荐使用Keil C51开发环境。
安装完成后,我们就可以开始编写第一个程序了。
#include <reg51.h>void main(){// 在这里编写您的代码}以上是一个简单的C语言程序模板。
我们使用了reg51.h头文件,该文件包含了与51单片机相关的寄存器定义和常量。
接下来,我们可以开始编写具体的功能代码了。
例如,如果我们想要在LED灯上闪烁一个简单的模式,可以使用以下代码:#include <reg51.h>sbit LED = P1^0;void main(){while(1){LED = 0; // 点亮LEDdelay(1000); // 延时1秒LED = 1; // 熄灭LEDdelay(1000); // 延时1秒}}在这个程序中,我们首先定义了一个LED的控制引脚,然后通过循环实现了闪烁的功能。
在每次循环中,我们先点亮LED,然后通过调用延时函数延时1秒,再将LED熄灭,再次延时1秒。
这样就形成了一个简单的LED闪烁效果。
除了控制IO口外,51单片机还可以实现其他各种功能,如定时器、串口通信等。
这些功能的实现也都可以通过C语言来完成。
希望通过本教程,您可以对51单片机的C语言编程有一个基本的了解。
在以后的学习中,您可以深入研究这些知识,并通过实践来提升自己的能力。
祝您学习愉快!。
51单片机C语言教程
手把手教你学51单片机C语言教程(C语言基础)电平特性数字电路中只有两种电平:高和低(本学习笔记中)定义单片机为TTL电平:高+5V 低 0VRS232电平:计算机的串口电平:高 -12V 低+12V所以计算机与单片机之间通讯时需要加电平转换芯片max232。
二进制只有2个数字 0 同1 数字电路中也用1 表标高电平用0表示底电平。
十六进制二进制的简短表示形式,十进制中的0-15用十六进制表示为0、1、2、3、4、5、6、7、8、9、A、B、C、D 、E、F各种进位制的对应关系二进制数的逻辑运算“与”运算类似于数值“X”运算0·0=0 0·1=1·0=0 1·1=1“或”运算“或”运算是实现“只要其中之一有,就有”这种逻辑关系的一种运算, 其运算符为“+”。
“或”运算规则如下:0+0=0, 0+1=1+0=1, 1+1=1C-51的程序结构与一般C语言的结构相同,以main()函数为程序人口,程序体中包含若干语句还可以包含若干函数。
C-51函数的一般格式类型函数名(参数表){数据说明部分语句执行部分}C-51的数据类型基本数据类型C语言中的基本数据类型C-51的数据类型扩充定义sfr:特殊功能寄存器声明sfr16:sfr的16位数据声明sbit:特殊功能位声明bit:位变量声明例:sfr SCON = 0X98;sfr16 T2 = 0xCC;sbit OV = PSW^2;C-51数据的存储类型C-51数据的存储类型(续)例:数据类型存储类型变量char data var1;bit data flags;unsigned char xdata vextor[10];C-51的包含的头文件通常有:reg51.h math.h ctype.h stdio.h stdlib.h absacc.h 常用有:reg51.h (定义特殊功能寄存器和位寄存器);math.h (定义常用数学运算);C-51的运算符与C语言基本相同:+ - * / (加减乘除)> >= < <= (大于大于等于小于小于等于)== != (测试等于测试不等于)&& || ! (逻辑与逻辑或逻辑非)>> << (位右移位左移)& | (按位与按位或)^ ~ (按位异或按位取反)位右移位左移按位与按位或C-51的基本语句与标准C语言基本相同:if 选择语言switch/case 多分支选择语言while 循环语言do-while 循环语言for 循环语言版权声明:(部分资料图片来源网络)。
单片机常用的C语言算法
单片机常用的C语言算法单片机是指仅集成一个芯片上的计算机系统,常用于嵌入式系统中。
C语言是单片机编程中最常用的语言,因其具有简洁、高效、易于理解和移植的特点。
以下是几个常用的C语言算法在单片机编程中的应用:1.串口通信算法:串口通信是单片机与外界通信的重要方式,常用于与计算机、其他单片机等设备之间的数据交换。
在C语言中,可以使用UART(Universal Asynchronous Receiver/Transmitter)库函数实现串口通信。
该算法主要包括串口初始化、数据发送和接收等步骤。
2.时钟算法:在单片机应用中,通常需要精确控制时间。
C语言中常用定时器(Timer)和计数器(Counter)来实现时钟算法。
定时器可以设定指定的时间间隔来触发中断,计数器则可以记录过去的时间,通过比对计数器的值可以进行时钟计算。
3.PWM算法:脉宽调制(PWM)是一种常用的模拟信号输出技术,被广泛应用于电机控制、音频发生等领域。
C语言中可以通过定时器来实现PWM算法。
通过控制定时器的重装载值和占空比,可以产生不同频率和不同占空比的PWM信号。
4.数值处理算法:5.调度算法:在多任务系统中,需要有效地调度和分配单片机资源。
C语言中可以使用任务调度器或者时间片轮转算法来实现任务的调度。
这些算法可以根据任务的优先级和时间片来合理地分配CPU时间,实现多任务的同时执行。
6.数据存储算法:在单片机应用中,数据存储是至关重要的。
C语言中可以使用RAM、Flash、EEPROM等不同的存储器类型来实现数据的读写操作。
这些算法可以将需要保存的数据存储在指定的内存地址中,并通过读写函数进行访问。
综上所述,C语言在单片机编程中有着广泛的应用,涵盖了串口通信、时钟、PWM、数值处理、调度和数据存储等常用算法。
这些算法能够帮助开发者高效地完成单片机的各种功能和任务。
信号发生器_(正弦波,方波,三角波)51单片机_C语言代码[1]
/**************************************//* 信号发生器(正弦波,方波,三角波)*//*************************************/#include<reg52.h>#include <intrins.h>#define uchar unsigned char#define uint unsigned intsbit cs=P2^0; //tlc5615片选端口sbit clk=P2^1; //tlc5615时钟线sbit din=P2^2; //tlc5615传输端口sbit key1=P1^0;sbit key2=P1^1; //按键的单片机接口uchar keydat;uchar flag; //波形发生终止信号的标志位一旦被置零立马停止发信号uchar flagsqu; //方波高低电平控制为(运用定时器1中断控制)uchar m,num;uchar dat=0xff;uchar code tosin[141]={ //正弦波的编码0x00,0x01,0x02,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0d,0x0e,0x10,0x11,0x13,0x15,0x16,0x18,0x1a,0x1c,0x1e,0x20,0x22,0x25,0x27,0x29,0x2b,0x2e,0x30,0x33,0x35,0x38,0x3a,0x3d,0x40,0x43,0x45,0x48,0x4c,0x4e,0x51,0x55,0x57,0x5a,0x5d,0x60,0x63,0x66,0x69,0x6c,0x6f,0x70,0x71,0x72,0x73,0x74,0x75,0x76,0x77,0x78,0x79,0x7a,0x7b,0x7c,0x7d,0x7e,0x7e,0x7f,0x80,0x7f,0x7e,0x7e,0x7d,0x7c,0x7b,0x7a,0x79,0x78,0x77,0x76,0x75,0x74,0x73,0x72,0x6f,0x6c,0x69,0x66,0x63,0x60,0x5d,0x5a,0x57,0x55,0x51,0x4e,0x4c,0x48,0x45,0x43,0x40,0x3d,0x3a,0x38,0x35,0x33,0x30,0x2e,0x2b,0x29,0x27,0x25,0x22,0x20,0x1e,0x1c,0x1a,0x18,0x16,0x15,0x13,0x11,0x10,0x0e,0x0d,0x0b,0x0a,0x09,0x08,0x07,0x06,0x05,0x04,0x03,0x02,0x02,0x01,0x00};void delay(uchar z) //延时函数{uchar x,y;for(x=0;x<110;x++)for(y=z;y>0;y--);}void prepare() //tlc5615的初始化{cs=1;din=1;clk=0;cs=0; //cs的上升沿和下降沿必须在clk 为低时进?}/* 用中断来产生方波void Squtranslator(){TR1=1; //启动定时器1 控制高低电平的持续时间占空比do{do{_wave=0;}while((!flagsqu) && flag==1);//如果一旦终止信号的//产生可以立马退出循环flagsqu=0;do{_wave=1;}while((!flagsqu) && flag==1);flagsqu=0;}while(flag);flag=1;TR1=0;}*/void Squtranslator() //方波函数{uchar j;uchar dat1=0x7f;while(flag){do{prepare();dat=dat1;for(j=0;j<12;j++){din=(bit)(dat>>7); //将数据的最高位赋给dinclk=1;dat=dat<<1; //一位位的传输clk=0;}cs=1; //cs的上升沿和下降沿必须在clk 为低时进行delay(200); //使高低电平持续一段时间if(dat1==0)dat1=0x7f; //完成了0和0x7f之间的替换elsedat1=0;}while(flag);}}void Tratranslator() //锯齿波的发生函数{uchar j;uchar dat1=0x7f;while(flag){do{prepare();dat=dat1;for(j=0;j<12;j++){din=(bit)(dat>>7); //将数据的最高位赋给dinclk=1;dat=dat<<1; //一位位的传输clk=0;}cs=1; //cs的上升沿和下降沿必须在clk 为低时进行delay(2); //稍加延时dat1--;}while(flag && dat1); //一旦有终止信号就可以停止do{prepare();dat=dat1;for(j=0;j<12;j++){din=(bit)(dat>>7); //将数据的最高位赋给dinclk=1;dat=dat<<1; //一位位的传输clk=0;}cs=1; //cs的上升沿和下降沿必须在clk 为低时进行delay(2); //稍加延时dat1++;}while(flag && (!(dat1==0x7f)));}}void Sintranslator(uchar wave[],uchar num )//正弦波的转换函数{uchar i,j;uchar dat1;do{for(i=0;i<num;i++){prepare();dat1=wave[i]; //打开片选开始工作for(j=0;j<12;j++){din=(bit)(dat1>>7); //将数据的最高位赋给dinclk=1;dat1=dat1<<1; //一位位的传输clk=0;if(flag==0)break;}cs=1; //cs的上升沿和下降沿必须在clk为低时进行delay(1); //稍加延时if(flag==0)break;}}while(flag); //等待控制键的暂停}void keyscan() //切换功能按键返回键值函数{uchar i;for(i=0;i<4;i++){if(key1==0){delay(10);if(key1==0){keydat++;do{}while(!key1); //松手检测if(keydat==4)keydat=1;//加满回零处理}}}}void keycountrl() //切断输出控制函数{if(key2==0){delay(10);if(key2==0){flag=0;do{}while(!key2); //松手检测}}}void main (){uchar temp;TMOD=0x01; //确定定时器的工作方式TH0=(65536-50000)/256; //给定时器0赋予初值TL0=(65536-50000)%256;EA=1; //开总中断ET0=1; //开启定时器0中断TR0=1;while(1){do{switch(keydat){case 1:flag=1;do{Sintranslator(tosin,141);}while(flag);break;case 2: flag=1;do{Tratranslator();}while(flag);break;case 3: flag=1;do{Squtranslator();}while(flag);break;default:break;}}while(flag);temp=keydat; //装载键值while(keydat==temp); //在这里等待键值的改变}}void Time0() interrupt 1{TH0=(65536-50000)/256; //定时器0用来扫描按键不断地扫描dTL0=(65536-50000)%256;num++;if(num==4){keyscan();keycountrl();num=0;}}。
单片机c语言编程
单片机c语言编程
单片机C语言是一种用来进行编程的程序设计语言,它一直是显
示技术,工控技术,以及嵌入式系统的重要编程语言之一。
它的出现,极大地改变了单片机编程的方式,也带给了很多便利,由此推动了智
能产品的发展,变得更加智能,便利。
单片机C语言编程的第一步就是了解单片机的架构,根据单片机
的特性,设计出适合自己的单片机C语言程序,其次,根据编写的程
序的具体内容,以及实现的目的,选择合适的编译器或开发环境,下
载到单片机中,然后使用编译程序编译单片机C语言源程序,调试好
程序的中的语法错误和逻辑错误,完成程序的设计和编写,最后,将
程序下载到单片机上,使其处于可运行状态,达到期望的效果。
在单片机C语言编程中,语法是非常重要的,必须完全正确,这
样才能正确运行程序。
编译程序肩负着检查语法错误的职责,任何错
误的语法都会被识别出来,以便更快地发现和修复问题,实现对程序
的更高精确性。
要编写出一个好的单片机程序,除了要了解单片机架构,熟悉语
法以外,还要考虑程序的可读性。
在实际编程过程中,通常需要使用
结构体,指针急速跳转,函数,宏等技术,这些技术让程序变得更加
简洁,可读性也更高,方便程序扩展和维护。
单片机C语言的优势非常明显,不仅比汇编语言的操作更加简单,功能也更加强大,也更加容易掌握,同时也为可编程逻辑引入了C程
序设计中一系列问题,例如内存、数据定义、流程控制等,使得程序
开发变得更加方便。
因此,单片机C语言编程的程序是单片机的今后
的发展方向之一。
单片机常用的14个C语言算法
引言概述:在单片机的开发中,C语言是最常用的编程语言之一。
掌握一些常用的C语言算法对于单片机的开发非常重要。
本文将介绍单片机常用的14个C语言算法之二,包括排序算法、查找算法、递归算法、动态规划算法和图算法。
正文内容:一、排序算法1. 冒泡排序:通过不断地交换相邻元素的位置,将大的元素冒泡到数组的末尾。
2. 快速排序:通过选择一个基准元素,将小于基准元素的数移动到基准元素左边,将大于基准元素的数移动到基准元素右边,然后分别对左右两部分递归地进行快速排序。
3. 插入排序:将数组分为已排序和未排序两部分,每次从未排序部分取一个元素,将其插入已排序部分的合适位置。
4. 选择排序:每次从未排序部分选择最小的元素,将其放在已排序部分的末尾。
5. 归并排序:将数组不断划分为更小的子数组,然后将子数组合并为有序数组。
二、查找算法1. 顺序查找:逐个比较数组中的元素,直到找到目标元素或者遍历完整个数组。
2. 二分查找:对于已排序的数组,通过不断将目标值与中间元素比较,并缩小搜索范围,最终找到目标元素的位置。
3. 插值查找:与二分查找类似,不同之处在于确定中间元素的位置时使用插值公式,使得查找范围更接近目标元素。
4. 哈希查找:使用哈希函数将关键字映射到一个唯一的哈希值,通过查找哈希值对应的位置来获取关键字。
5. 递归查找:通过递归地划分问题的规模,从而减小查找范围,最终找到目标元素。
三、递归算法1. 递归定义:在函数的定义中使用函数本身的方式称为递归。
2. 递归函数的特点:包含一个递归结束的条件和一个递归调用的表达式。
3. 递归算法的实现:通过不断把原问题转化为更小规模的子问题,直到满足递归结束的条件。
4. 递归算法的应用:在树、图等数据结构的遍历、搜索等问题中,递归算法被广泛使用。
5. 递归算法的优化:如尾递归优化、记忆化搜索等方法可以避免递归算法中的重复计算。
四、动态规划算法1. 动态规划的思想:将一个问题划分为多个子问题,并保存每个子问题的解,避免重复计算。
c语言单片机均方根滤波算法
c语言单片机均方根滤波算法C语言单片机均方根滤波算法引言:在实际应用中,信号通常会受到各种噪声的干扰,为了准确地处理信号,需要对其进行滤波处理。
均方根滤波算法是一种常用的滤波算法,它可以有效地去除信号中的高频噪声,提取出信号的有效成分。
本文将介绍C语言单片机实现均方根滤波算法的原理及其应用。
一、均方根滤波算法原理均方根滤波算法是一种基于统计学原理的滤波算法,它通过计算信号的均方根值来实现滤波。
其原理可以概括为以下几个步骤:1. 采样信号:从传感器或外部设备中获取信号,并对其进行采样。
采样频率要足够高,以保证准确性和可靠性。
2. 平方求和:将采样得到的信号值进行平方运算,并将结果相加。
这一步是为了得到信号的均方值。
3. 均值计算:将上一步得到的平方和除以采样点数,得到信号的均值。
4. 开方运算:对均值进行开方运算,得到信号的均方根值。
5. 输出结果:将均方根值作为滤波后的信号输出,用于后续处理或显示。
二、C语言单片机实现均方根滤波算法C语言在单片机编程中广泛应用,下面将介绍如何在单片机上使用C语言实现均方根滤波算法。
1. 硬件准备:选择一款支持C语言编程的单片机,如STC89C52。
连接信号源和单片机的模拟输入引脚,以便获取信号。
2. 采样和计算:编写C语言程序,在程序中设置采样频率和采样点数,并通过模拟输入引脚获取信号值。
对每一个采样点进行平方运算,并将结果累加到一个变量中。
3. 均值计算和开方运算:在程序中对累加得到的平方和除以采样点数,得到信号的均值。
然后对均值进行开方运算,得到信号的均方根值。
4. 输出结果:将均方根值通过串口或其他方式输出,用于后续处理或显示。
三、均方根滤波算法的应用均方根滤波算法广泛应用于信号处理领域,以下列举几个常见的应用场景:1. 传感器信号处理:在温度、湿度、压力等传感器信号采集过程中,常常伴随着各种噪声。
通过均方根滤波算法可以去除这些噪声,提取出真实的信号成分。
单片机c语言位运算做除法
单片机c语言位运算做除法单片机中的位运算在计算机科学中起着重要的作用。
位运算是指对二进制数字进行操作的一种运算方式,其中包括与、或、非、异或、左移和右移等操作。
在单片机中,位运算可以用来进行除法运算。
在单片机中,除法运算通常使用移位运算符来实现。
移位运算符包括左移运算符(<<)和右移运算符(>>)。
左移运算符将数字的所有位向左移动指定的位数,右移运算符将数字的所有位向右移动指定的位数。
在进行除法运算时,可以使用右移运算符来实现。
具体步骤如下:1. 将被除数和除数转换为二进制表示。
2. 使用右移运算符将被除数向右移动,直到它小于除数为止。
每次移动一位,同时记录移动的次数。
3. 记录移动的次数,即为除法的商。
以下是一个示例,演示如何使用位运算实现除法运算:```c#include <stdio.h>int main() {int dividend, divisor;printf("请输入被除数:");scanf("%d", ÷nd);printf("请输入除数:");scanf("%d", &divisor);int quotient = 0;int count = 0;while (dividend >= divisor) {dividend >>= 1; // 使用右移运算符将被除数向右移动 count++; // 记录移动的次数}quotient = count; // 移动的次数即为商printf("商:%d\n", quotient);return 0;}```在上述示例中,我们从用户输入获取被除数和除数。
然后,我们使用右移运算符将被除数向右移动,直到它小于除数为止。
每次移动一位,同时记录移动的次数。
最后,我们将移动的次数作为商打印出来。
单片机C语言快速精度除法方案
单片机C语言快速精度除法方案目前的51单片机在进行带小数点结果的除法一般可以采用浮点数计算的方式,但是浮点数计算有一个缺点就是非常耗时,在对时间要求严格的工况就不太适用。
笔者的工作室长期承接单片机、电路、机电液、工控、自动化、计算机软件等项目,最近做了个单片机计算器的设计,在设计除法时利用长整形除法和取余运算,可以得到若干小数位的精度运算,与大家共享。
设计思路如下:假设长整形除数a, 长整形被数b,步骤如下:;得到除法的整数部分,c=a/b;;设d为a%b,e=10*d,得到除法的第一位小数,f=e/b;(要点:将a余b的余数乘以10倍,再和被除数b相除,就得到小数点后一位小数);设g为e%b,h=10*g,得到除法的第二位小数,i=h/b;以此类推,可以得到除法的任意小数…… /**********************************下面附上C语言程序**********************************************************/unsigned long result, result_p;//表示除法结果的整数和小数部分// result_p是小数部分,例如result_p=12345678,表示0.12345678Void chufa(unsigned long chushu, unsigned long beichushu, unsigned char wei)// wei表示精确到小数点后多少位{ unsigned char i;unsigned long tmp;result=result_p=0;if (beichushu!=0)//被除数必须不为0{if (wei==0){result=chushu/beichushu;//计算整数部分result_p=0;}else{result=chushu/beichushu;//计算整数部分tmp=chushu%beichushu;for (i=1;i<=wei;i++)//计算小数部分{tmp=tmp*10;result_p=result_p*10+tmp/beichushu; tmp=tmp%beichushu;}}}。
单片机C语言编程常用的运算符介绍
单片机C语言编程常用的运算符介绍单片机C语言编程常用的运算符介绍在单片机 C 语言编程中,通常用到 30 个运算符,如表 1 ,其中算术运算符 13 个,关系运算符 6 个,逻辑运算符 3 个,位操作符 7 个,指针运算符 1 个。
在 C 语言中,运算符具有优先级和结合性。
算术运算符优先级规定为:先乘除模(模运算又叫求余运算)在单片机C语言编程中,通常用到30个运算符,如表1,其中算术运算符13个,关系运算符6个,逻辑运算符3个,位操作符7个,指针运算符1个。
在C语言中,运算符具有优先级和结合性。
算术运算符优先级规定为:先乘除模(模运算又叫求余运算),后加减,括号最优先。
结合性规定为:自左至右,即运算对象两侧的算术符优先级相同时,先与左边的运算符号结合。
关系运算符的优先级规定为:>、<、>=、<=四种运算符优先级相同,=、!=相同,但前四种优先级高于后四种。
关系运算符的优先级低于算术运算符,高于赋值(=)运算符。
逻辑运算符的优先级次序为:!、&&、||。
当表达式中出现不同类型的运算符时,非(!)运算符优先级最高,算术运算符次之,关系运算符再次之,其次是&&和||,最低为赋值运算符。
位操作的对象只能是整型或字符数据型。
运算符+ - * / % =算术运算+= -= *= /= %= ++关系运算-- > < = = >=表1单片机C语言常用运算符范例a+b a-b a*b a/b a%b a=5 a+=b a-=b a*=b a/=b a%=b a++a-- a>b a<b a= =b a>=b说明a变量值和b变量值相加a变量值和b变量值相减a变量值乘以b变量值 a变量值除以b变量值取a变量值除以b变量值的余数a变量赋值,即a变量值等于5 等同于a=a+b,将a和b相加的结果存回a等同于a=a-b,将a和b相减的结果存回a等同于a=a*b,将a和b相乘的结果存回a等同于a=a/b,将a和b相除的结果存回a等同于a=a%b,将a和b相除的余数存回aa的值加1,等同于a=a+1 a的值减1,等同于a=a-1 测试a是否大于b 测试a是否小于b 测试a是否等于b测试a是否大于或等于b<= != && || ! >>位操作运算指针1级优先级左结合 () 圆括号 [] 下标运算符-> 指向结构体成员运算符 . 结构体成员运算符 2级优先级右结合 ! 逻辑非运算符 ~ 按位取反运算符 ++ 前缀增量运算符 -- 前缀增量运算符 + 正号运算符 - 负号运算符(类型) 类型转换运算符 * 指针运算符 & 地址与运算符 sizeof 长度运算符 3级优先级左结合 * 乘法运算符 / 除法运算符 % 取余运算符 4级优先级左结合 + 加法运算符 - 减法运算符 5级优先级左结合 << 左移运算符 >> 右移运算符 6级优先级左结合a<=b a!=b a&&b a||b !a a>>b a<<b a|b a&b a^b ~a a=&b *a测试a是否小于或等于b 测试a是否不等于b a和b作逻辑与(AND),2个变量都为真时结果才为真 a和b作逻辑或(OR),只要有1个变量为真,结果就为真将a变量的值取反,即原来为真则变为假,原为假则为真将a按位右移b个位,高位补0 将a按位左移b个位,低位补0 a和b按位做或运算 a和b按位做与运算 a和b按位做异或运算将a的每一位取反将变量b的地址存入a寄存器用来取a寄存器所指地址内的值逻辑运算<< | & ^ ~ & *<、<=、>、>= 关系运算符7级优先级左结合== 等于运算符 != 不等于运算符 8级优先级左结合 & 按位与运算符 9级优先级左结合 ^ 按位异或运算符 10级优先级左结合 | 按位或运算符 11级优先级左结合 && 逻辑与运算符 12级优先级左结合 || 逻辑或运算符 13级优先级右结合 ? : 条件运算符 14级优先级右结合= += -= *= /= %= &= ^= |= <<= >>= 全为赋值运算符 15级优先级左结合,逗号运算符优先级从上到下依次递减,最上面具有最高的优先级,逗号操作符具有最低的优先级。
单片机输出电压闭环逻辑c语言
单片机输出电压闭环逻辑c语言单片机输出电压闭环逻辑C语言一、引言在电子系统中,单片机是一种常用的核心控制器。
单片机可以通过输出电压来控制各种设备的工作状态。
为了确保输出电压的稳定性和准确性,需要使用闭环控制的方法来实现。
二、闭环控制原理闭环控制是一种通过反馈信号来调整输出信号以达到预期目标的方法。
在单片机输出电压的闭环控制中,通常会使用PID(比例、积分、微分)控制算法。
1. 比例(P)控制比例控制是根据误差信号与参考信号之间的差异来调整输出信号。
误差信号是参考信号与实际输出信号之间的差值。
比例系数决定了误差信号对于输出信号调整的影响程度。
具体公式如下:```Output = Kp * Error```其中,Output表示输出信号,Kp表示比例系数,Error表示误差信号。
2. 积分(I)控制积分控制是根据误差累积值来调整输出信号。
积分系数决定了误差累积值对于输出信号调整的影响程度。
具体公式如下:```Output = Kp * Error + Ki * Integral(Error)```其中,Integral(Error)表示误差累积值,Ki表示积分系数。
3. 微分(D)控制微分控制是根据误差变化率来调整输出信号。
微分系数决定了误差变化率对于输出信号调整的影响程度。
具体公式如下:```Output = Kp * Error + Ki * Integral(Error) + Kd * Derivative(Error) ```其中,Derivative(Error)表示误差变化率,Kd表示微分系数。
三、C语言实现闭环控制在单片机中,可以使用C语言来实现闭环控制逻辑。
以下是一个基本的示例代码:```c#include <stdio.h>// 定义PID参数float Kp = 1.0;float Ki = 0.5;float Kd = 0.2;// 定义参考信号和实际输出信号float reference_signal = 5.0;float output_signal = 0.0;// 定义误差相关变量float error = 0.0;float previous_error = 0.0;float integral_error = 0.0;// 定义函数:计算PID输出信号void calculate_output_signal() {// 计算误差信号error = reference_signal - output_signal;// 计算积分项integral_error += error;// 计算微分项float derivative_error = error - previous_error;// 计算PID输出信号output_signal = Kp * error + Ki * integral_error + Kd * derivative_error;// 更新上一次的误差信号previous_error = error;}int main() {// 模拟输出电压调节过程for (int i = 0; i < 100; i++) {calculate_output_signal();// 输出当前的参考信号、实际输出信号和PID输出信号printf("Reference Signal: %.2f, Output Signal: %.2f, PID Output: %.2f\n", reference_signal, output_signal);// 模拟实际输出电压变化过程output_signal += 0.1;}return 0;}```以上示例代码实现了一个简单的闭环控制逻辑。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
}
while(ia<=9)
{ c[ic]=a[ia];
ia++;ic++;
}
while(ib<=9)
{ c[ic]ቤተ መጻሕፍቲ ባይዱb[ib];
b++;ic++;
}
for(i=0;i<20;i++)
printf("%d\n",c[i]);
}
六、查找问题
else
printf("the number is found the no%d!\n",index);
}
2.折半查找法(只能对有序数列进行查找)
基本思想:设n个有序数(从小到大)存放在数组a[1]----a[n]中,要查找的数为x。用变量bot、top、mid 分别表示查找数据范围的底部(数组下界)、顶部(数组的上界)和中间,mid=(top+bot)/2,折半查找的算法如下:
for(i=2;i<=x/2;i++)
if (prime(i)&&prime(x-i))
{
printf("%d+%d\n",i,x-i);
printf("验证成功!");
break;
}
}
五、排序问题
1.选择法排序(升序)
基本思想:
1)对有n个数的序列(存放在数组a(n)中),从中选出最小的数,与第1个数交换位置;
}
思考:将上面程序改写一查找函数Find,若找到则返回下标值,找不到返回-1
②基本思想:一列数放在数组a[1]---a[n]中,待查找的关键值为key,把key与a数组中的元素从头到尾一一进行比较查找,若相同,查找成功,若找不到,则查找失败。(查找子过程如下。index:存放找到元素的下标。)
}
}
2.冒泡法排序(升序)
基本思想:(将相邻两个数比较,小的调到前头)
1)有n个数(存放在数组a(n)中),第一趟将每相邻两个数比较,小的调到前头,经n-1次两两相邻比较后,最大的数已“沉底”,放在最后一个位置,小数上升“浮起”;
2)第二趟对余下的n-1个数(最大的数已“沉底”)按上法比较,经n-2次两两相邻比较后得次大的数;
void main()
{ int m,i,k;
printf("please input a number:\n");
scanf("%d",&m);
k=sqrt(m);
for(i=2;i<k;i++)
if(m%i==0) break;
if(i>=k)
printf("该数是素数");
一、计数、求和、求阶乘等简单算法
此类问题都要使用循环,要注意根据问题确定循环变量的初值、终值或结束条件,更要注意用来表示计数、和、阶乘的变量的初值。
例:用随机函数产生100个[0,99]范围内的随机整数,统计个位上的数字分别为1,2,3,4,5,6,7,8,9,0的数的个数并打印出来。
scanf("%d",&a[i]);
for(i=0;i<9;i++)
{ imin=i;
for(j=i+1;j<10;j++)
if(a[imin]>a[j]) imin=j;
if(i!=imin)
{s=a[i]; a[i]=a[imin]; a[imin]=s; }
printf("%d\n",a[i]);
2)除第1 个数外,其余n-1个数中选最小的数,与第2个数交换位置;
3)依次类推,选择了n-1次后,这个数列已按升序排列。
程序代码如下:
void main()
{ int i,j,imin,s,a[10];
printf("\n input 10 numbers:\n");
for(i=0;i<10;i++)
3)将另一个数组剩余元素抄入C数组,合并排序完成。
程序段如下:
void main()
{ int a[10],b[10],c[20],i,ia,ib,ic;
printf("please input the first array:\n");
for(i=0;i<10;i++)
scanf("%d",&a[i]);
分析:求最大公约数的算法思想:(最小公倍数=两个整数之积/最大公约数)
(1) 对于已知两数m,n,使得m>n;
(2) m除以n得余数r;
(3) 若r=0,则n为求得的最大公约数,算法结束;否则执行(4);
(4) m←n,n←r,再重复执行(2)。
例如: 求 m=14 ,n=6 的最大公约数. m n r
void main()
{ int a[10],index,x,i;
printf("please input the array:\n");
for(i=0;i<10;i++)
scanf("%d",&a[i]);
printf("please input the number you want find:\n");
scanf("%d",&x);
printf("\n");
p=0;
while(x!=a[p]&&p<10)
p++;
if(p>=10)
printf("the number is not found!\n");
else
printf("the number is found the no%d!\n",p);
else
printf("该数不是素数");
}
将其写成一函数,若为素数返回1,不是则返回0
int prime( m%)
{int i,k;
k=sqrt(m);
for(i=2;i<k;i++)
if(m%i==0) return 0;
return 1;
}
四、验证哥德巴赫猜想
本题使用数组来处理,用数组a[100]存放产生的确100个随机整数,数组x[10]来存放个位上的数字分别为1,2,3,4,5,6,7,8,9,0的数的个数。即个位是1的个数存放在x[1]中,个位是2的个数存放在x[2]中,……个位是0的个数存放在x[10]。
void main()
{ int a[101],x[11],i,p;
单片机C语言开发必备算法 2008-09-27 17:04:42| 分类: 默认分类 | 标签: |字号大
中
小 订阅
算法(Algorithm):计算机解题的基本思想方法和步骤。算法的描述:是对要解决一个问题或要完成一项任务所采取的方法和步骤的描述,包括需要什么数据(输入什么数据、输出什么结果)、采用什么结构、使用什么语句以及如何安排这些语句等。通常使用自然语言、结构化流程图、伪代码等来描述算法。
if(p==0) p=10;
x[p]=x[p]+1;
}
for(i=1;i<=10;i++)
{ p=i;
if(i==10) p=0;
printf("%d,%d\n",p,x[i]);
}
printf("\n");
}
二、求两个整数的最大公约数、最小公倍数
(任意一个大于等于6的偶数都可以分解为两个素数之和)
基本思想:n为大于等于6的任一偶数,可分解为n1和n2两个数,分别检查n1和n2是否为素数,如都是,则为一组解。如n1不是素数,就不必再检查n2是否素数。先从n1=3开始,检验n1和n2(n2=N-n1)是否素数。然后使n1+2 再检验n1、n2是否素数,… 直到n1=n/2为止。
for(i=0;i<10;i++)
scanf("%d",&b[i]);
printf("\n");
ia=0;ib=0;ic=0;
while(ia<10&&ib<10)
{ if(a[ia]<b[ib])
{ c[ic]=a[ia];ia++;}
else
{ c[ic]=b[ib];ib++;}
for(i=0;i<=11;i++)
x[i]=0;
for(i=1;i<=100;i++)
{ a[i]=rand() % 100;
printf("%4d",a[i]);
if(i%10==0)printf("\n");
}
for(i=1;i<=100;i++)
{ p=a[i]%10;
14 6 2
6 2 0
void main()
{ int nm,r,n,m,t;
printf("please input two numbers:\n");