文档库 最新最全的文档下载
当前位置:文档库 › 第一课C语言控制实现交通灯

第一课C语言控制实现交通灯

第一课C语言控制实现交通灯
第一课C语言控制实现交通灯

C语言版交通灯课程设计

微机控制课程设计报告 课程名称基于C语言单片机交通灯 学生姓名张万双 学号51102022004 专业班级电子信息科学与技术2班 指导老师 2013年12月5日

目录 一.前言 (3) 二.功能概述 (3) 三.设计思路 (4) 四.硬件介绍 (4) 五.软件程序设计 (9) 六.电路图及仿真实现 (12) 七.总结 (14) 八.源程序 (15) 九.参考文献 (18)

一.前言 近年来随着科技的飞速发展,单片机的应用正在不断深入,同时带动传统控制检测技术日益更新。在实时检测和自动控制的单片机应用系统中,单片机往往作为一个核心部件来使用,仅单片机方面知识是不够的,还应根据具体硬件结构软硬件结合,加以完善。 十字路口车辆穿梭,行人熙攘,车行车道,人行人道,有条不紊。那么靠什么来实现这井然秩序呢?靠的就是交通信号灯的自动指挥系统。交通信号灯控制方式很多,在学习了单片机的有关知识之后,运用相关知识来设计完成交通信号灯。二.功能概述 2.1 设计任务:交通灯的硬件和软件设计 2.2 设计目的 1.进一步熟悉和掌握单片机的结构和工作原理。 2.掌握单片机的接口技术及相关外围芯片的外特性,控制方法。 3.通过课程设计,掌握以单片机为核心的电路设计的基本方法和技术,了解有关电路参数的计算方法。 4.通过实际程序设计和调试,逐步掌握模块化程序设计方法和调试技术。 5.通过完成一个包括电路设计和程序开发的完整过程,为我们今后从事相应工作打下基础。

三.设计思路 交通灯的变化规律 按照常规我们假设一个十字路口为东西南北走向。初始状态为状态1,南北方向绿灯通车,东西方向红灯。经过过一段时间(25S)转换状态2,南北方向绿灯闪几次转亮黄灯,延时5S,东西方向仍然红灯。再转换到状态3,东西方向绿灯通车,南北方向红灯。过一段时间(25S)转换到状态4,东西方向绿灯闪几次转亮黄等,延时5S,南北方向仍然红灯。最后循环至南北绿灯,东西红灯。在这些状态下,有时钟倒数计时。四.硬件介绍 基础知识 交通灯控制器实例主要使用了89C51 单片机的定时器/计数器,基础知识主要包括交通灯的变化规律、定时器/计数器的概念、定时器/计数器的相关寄存器、定时器/计数器的4 种工作方式、以及定时器/计数器的变成。 4.1 定时器/计数器 定时器/计数器是单片机中最常用、最重要的功能模块之一,本节通过交通灯控制器实例来演示定时器的使用,并复习如何使用散转程序。 首先介绍交通灯以及定时器/计数器的基础知识,接着介绍本实例的硬件电路构成,然后逐步分析定时器的变成以及程序的全貌,最后总结一下本实例的技巧与注意点。

基于模糊控制的速度跟踪控制问题(C语言以及MATLAB仿真实现)

基于模糊控制的速度控制 ——地面智能移动车辆速度控制系统问题描述 利用模糊控制的方法解决速度跟踪问题,即已知期望速度(desire speed),控制油门(throttle output)和刹车(brake output)来跟踪该速度。已知输入:车速和发动机转速(值可观测)。欲控制刹车和油门电压(同一时刻只有一个量起作用)。 算法思想 模糊控制器是一语言控制器,使得操作人员易于使用自然语言进行人机对话。模糊控制器是一种容易控制、掌握的较理想的非线性控制器,具有较佳的适应性及强健性(Robustness)、较佳的容错性(Fault Tolerance)。利用控制法则来描述系统变量间的关系。不用数值而用语言式的模糊变量来描述系统,模糊控制器不必对被控制对象建立完整的数学模式。 Figure 1模糊控制器的结构图 模糊控制的优点: (1)模糊控制是一种基于规则的控制,它直接采用语言型控制规则,出发点是现场操作人员的控制经验或相关专家的知识,在设计中不需要建立被控对象的精确的数学模型,因而使得控制机理和策略易于接受与理解,设计简单,便于应用。 (2)由工业过程的定性认识出发,比较容易建立语言控制规则,因而模糊控制对那些数学模型难以获取,动态特性不易掌握或变化非常显著的对象非常适用。 (3)基于模型的控制算法及系统设计方法,由于出发点和性能指标的不同,容易导致较大差异;但一个系统语言控制规则却具有相对的独立性,利用这些控制规律间的模糊连接,容易找到折中的选择,使控制效果优于常规控制器。 (4)模糊控制是基于启发性的知识及语言决策规则设计的,这有利于模拟人工控制的过程和方法,增强控制系统的适应能力,使之具有一定的智能水平。 简化系统设计的复杂性,特别适用于非线性、时变、模型不完全的系统上。 模糊控制的缺点

C语言第六章习题1

第6章作业 一.选择题 1.以下while循环中,循环体执行的次数是:() k=1; while (--k) k=10; a) 10次b) 无限次c) 一次也不执行d) 1次 2.有以下程序段,其中x为整型变量,以下选项中叙述正确的是:() x=0; while (!x!=0) x++; a) 退出while循环后,x的值为0 b) 退出while循环后,x的值为1 c) while的控制表达式是非法的 d) while循环执行无限次 3. 有以下程序段,其中n为整型变量,执行后输出结果是:() n=20 ; while(n--) ; printf(“%d”,n) ; a) 2 b) 19 c) -1 d) 0 4. 有以下程序段,其中t为整型变量,以下选项中叙述正确的是:() t=1; while (-1) { t--; if(t) break;} a) 循环一次也不执行 b) 循环执行一次 c) 循环控制表达式(-1)不合法 d) 循环执行2次 5. 有以下程序段,其中x为整型变量,以下选项中叙述正确的是:() x=-1; do {;} while (x++); printf(“x=%d”,x); a) 该循环没有循环体,程序错误 b) 输出x=1 c) 输出x=0 d) 输出x=-1 6. 有以下程序段,其中x,y为整型变量,程序输出结果是:() for(x=0,y=0;(x<=1)&&(y=1);x++,y--) ;

printf(“x=%d,y=%d”,x,y); a) x=2,y=0 b) x=1,y=0 c) x=1,y=1 d) x=0,y=0 7. 有以下程序: main() { int x=3,y; do { y=--x; if( !y) printf(“x”) ; else printf(“y”) ; } while(x); } 程序的输出结果是:() a) xyx b) yyx c) yxx d) yxy 8. 有以下程序段,此处do-while循环的结束条件是:() int n=0,p; do {scanf(“%d”,&p);n++;} while (p!=12345&&n<3); a) p的值不等于12345并且n的值小于3 b) p的值等于12345并且n的值大于等于3 c) p的值不等于12345或者n的值小于3 d) p的值等于12345或者n的值大于等于3 9. 有以下程序: main() { int a,b,t; for(a=3,b=0 ;!a==b ;a--,b++) if(a>b) { t=a;a=b;b=t;} printf(“%d,%d\n”,a,b); } 程序的输出结果是:() a) 4,1 b) 1,4 c) 4,-1 d) -1,4 10. 有以下程序: main() { int x=3,y=0; do { while( !y) y=-x; } while(x--); printf(“%d,%d\n”,x,y); } 程序的输出结果是:() a) -1,3 b) -1,-3 c) 0,0 d) 1,-3 11. 有以下程序: main() { int m,n;

C语言-基础教程-C语言整型数据

C语言-基础教程-C语言整型数据 考试大计算机等级站整理: 2.3.1 整型常量 整型常量及整常数。它可以是十进制、八进制、十六进制数字表示的整数值。十进制常数的形式是: d i g i t s s 这里d i g i t s可以是从0到9的一个或多个十进制数位,第一位不能是0。八进制常数的形式是: 0 d i g i t s s 在此,d i g i t s可以是一个或多个八进制数(0~7之间),起始0是必须的引导符。 十六进制常数是下述形式: 0 x h d i g i t s0 X h d i g i t s 这里h d i g i t s可以是一个或多个十六进制数(从0~9的数字,并从"a"~" "f"的字母)。 引导符0是必须有的,X即字母可用大写或小写。注意,空白字符不可出现在整数数字之间。表2 - 3列出了整常数的形式。 整常数在不加特别说明时总是正值。如果需要的是负值,则负号"-"必须放置于常数表达式的前面。 每个常数依其值要给出一种类型。当整常数应用于一表达式时,或出现有负号时,常数类型自动执行相应的转换,十进制常数可等价于带符号的整型或长整型,这取决于所需的常数的尺寸。 八进制和十六进制常数可对应整型、无符号整型、长整型或无符号长整型,具体类型也取决于常数的大小。如果常数可用整型表示,则使用整型。如果常数值大于一个整型所

能表示的值,但又小于整型位数所能表示的数,则使用无符号整型。同理,如果一个常数比无符号整型所表示的值还大,则它为长整型。如果需要,当然也可用无符号长整型。 在一个常数后面加一个字母l或L,则认为是长整型。如1 0 L、7 9 L、0 1 2 L、0 11 5 L、0 X A L、0 x 4 f L等。 2.3.2 整型变量 前面已提到,C规定在程序中所有用到的变量都必须在程序中指定其类型,即"定义"。这是和B A S I C、F O RT R A N不同的,而与P a s c a l相似。 运行结果为: R U N a u=22, b u=-1 4 可以看到不同类型的整型数据可以进行算术运算。在本例中是i n t型数据与unsingned int型数据进行相加减运算。

PWM调速的C语言程序编写

PWM调速的C语言程序编写 关于PWM的原理在上一篇文章中已经说的很详细了,现在就细说一下pwm C语言程序的编写。 C语言中PWM的编写有这么几种方法;一、用普通的I/O口输出的PWM ,二、使用定时计数器编写,三、就是使用片内PWM了。 1 先说使用普通的I\O口编写PWM程序了。 使用I/O口输出PWM波形你必须首先明白PWM他的实质是:调制占空比,占空比就是波形中高电平的长度与整个波长的比值。我们写C语言的目的是写PWM波形的一个周期。在这个周期内高低电平的比值是可以改变的。这也就符合了PWM的原意脉宽调制。即高电平的宽度的调制。当然了PWM他也可用于改变频率,我们这里只先说他改变脉宽。 一旦我们的C语言程序写完那么他产生的PWM波形的频率就一定了。(也可写频率变化的PWM,难度有点大)一般我们控制使用1K到10K的PWM波进行控制。当然了你也可在要求不是很高的地方使用频率更低的PWM波。比如在飞思卡尔智能车比赛中我们学校使用的PWM波频率只有600HZ. 我们要改变一个PWM波周期内的高电平的宽度显然需要将一个PWM波的周期分成单片机可以控制的N个小的周期,N的

取值越大你的调速等级越高,但产生的PWM频率就越低。我们下面以实现100级调速为例编写PWM程序。 先写出程序再慢慢给大家分析 void pwm (uchar x,uint y) //X 为占空比 Y为函数使用时间 { uint i,j,a,b; for(i=y;i>0;i--) //定时外函数 { for(j=7;j>0;j--) //定时内函数 { for(a=y;a>0;a--) //PWM波高电平宽度 { PORTA=0X01; }

C语言第六章答案及详解

第六章指针 一、选择题 1答案:A 分析:本题主要考指针赋值,n2=n1;是把n2的值赋给n1,故根据指针赋值的定义可知选A,即把q所指对象的值赋给p所指对象。 2答案:B 分析:本题主要考指针定义,因为p指向变量x,故输出其值的时候应该是x的值。 3答案:C 分析:本题主要考指针的定义和赋值,C前面是定义一个量a并赋值为10,后面定义一个指针,并把a的值赋给这个指针。 4答案:C 分析:本题主要考指针的定义及赋值,开始时使p指向a,q指向b,把它们的值交换,然后再显示。故得正确答案C。 5答案:C 分析:本题主要考函数指针的定义,函数前面的*号表求返回值是指针类型,void表示返回无值弄的。故选C。 6答案:A 分析:本题主要考的是指针的变量的赋值,在使用scanf()函数的时候,后面跟的是一个地址,由于pa本身保存的是地址,故选A 7答案:D 分析:本题主要考的指针的赋值及指向指针的指针的赋值,根据定义知选D。 B的正确形式是**q=2;C的正确形式应该是q=&p。 8答案:C 分析:本题主要考的是全局变量和局部变量,以及指针的用法,第一个f(&a)的返回值是5,第二个返回值是2。 9答案:A 分析:本题主要考的是变量自加,指针传值,以及指针的赋值。通过第二行a=b可知p1,p2指向的变量的值相同,都指向了b所指的对象,也是p2所指的对象’a’,由于(*a)++;是实现a所指对象的自加,故由’a’变成’b’,故最终选A。 10答案:A 分析:本题主考NULL,一般来说当我们把一个空值以整数的形式输出出来的时候,默认的情况是0。

11答案:C 分析:本题考的是指针变量的赋值,虽然p没有赋值,表示没有指向某个具体的对象,但事实上系统会让它随机的指向存储单元里的一个对象,那么它的返回值应该是所指存储单元中的值。 12答案:B 分析:本题主要考函数中参数变量的定义,在B中连续定义两个变量,这在函数中是不可以的。 13答案:C 分析:本题主要考指针的指针,c先指向b,b是一个指针,它指向a,故c最终是指向a的,故其值是a中的值。 14答案:A 分析:本题主要考指针的赋值,我们不能把一个具体的值赋给一个指针变量。 B选项是w,p指向同一对象。C是p指向a。D是把w所指对象的值赋给p 所指对象。 15答案:B 分析:本题主要考指针传值,p,q分别指向a,b,然而r会指向它们的较小值。 16答案:D 分析:在D中把一个整形变量的值赋给一个指针的地址,故而是错的。应该写成p=&a。 17答案:D 分析:本题主要考调用函数时指针传值和一般的变量的传值区别。指针通过地址传值,而变量是直接传值。c指针指向b,故对c指针里面的值的修改等于直接修改b中的值。 18答案:D 分析:本题主要考指针的定义及指针变量的值的输出方式,指针b指向a,故输出其值是511。 19答案:C 分析:本题主要考指针标识符*和乘号*的区别,*p=*p1*(*p2)中第1,2,4个*号是指针标识符,而第三个是乘号,故其运算的结果是3。 20答案:C 分析:本题主考函数的嵌套调用和数据的类型转换,注意的是(int)(a+b),所以得到5.0。 21答案:A

51单片机用C语言实现交通灯(红绿灯)源程序

51单片机用C语言实现交通灯(红绿灯)源程序 2009-10-29 23:00 交通灯,红黄绿灯交替亮,怎样实现呢?其实就是根据单片机定时器及倒计时的程序修改。源程序如下: /* 1、程序目的:使用定时器学习倒计时红绿灯原理主要程序和倒计时一样 2、硬件要求:数码管、晶振12M */ #include bit red,green,yellow,turnred; //定义红、黄、绿及转红标志 code unsigned char tab[]= {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //共阴数码管 0-9 unsigned char Dis_Shiwei;//定义十位 unsigned char Dis_Gewei; //定义个位 void delay(unsigned int cnt) //用于动态扫描数码管的延时程序 { while(--cnt); } main() { TMOD |=0x01;//定时器设置 10ms in 12M crystal定时器0,工作方式1,16位定时器 TH0=0xd8; //65535-10000=55535=D8F0(十六进制) TL0=0xf0; IE= 0x82; //中断控制,EA=1开总中断,ET0=1:定时器0中断允许 TR0=1; //开定时器0中断 P1=0xfc;//红灯亮,根据红黄绿接灯的顺序。 red =1; while(1) { P0=Dis_Shiwei;//显示十位,这里实现用8位数码管,即左1位 P2=0; delay(300);//短暂延时 P0=Dis_Gewei; //显示个位,左数,2位 P2=1; delay(300);

最新五种编程方式实现流水灯的单片机c程序讲课教案

五种编程方式实现流水灯的单片机C程序 //功能:采用顺序结构实现的流水灯控制程序 /*此方式中采用的是字操作(也称为总线操作)*/ #include void delay(unsigned char i); //延时函数声明 void main() //主函数 { while(1) { P1 = 0xfe; //点亮第1个发光二极管,0.000389s delay(200); //延时 P1 = 0xfd; //点亮第2个发光二极管,0.155403s,0.1558 delay(200); //延时 P1 = 0xfb; //点亮第3个发光二极管 delay(200); //延时 P1 = 0xf7; //点亮第4个发光二极管 delay(200); //延时 P1 = 0xef; //点亮第5个发光二极管 delay(200); //延时 P1 = 0xdf; //点亮第6个发光二极管 delay(200); //延时 P1 = 0xbf; //点亮第7个发光二极管 delay(200); //延时 P1 = 0x7f; //点亮第8个发光二极管 delay(200); //延时 } } //函数名:delay //函数功能:实现软件延时 //形式参数:unsigned char i; // i控制空循环的外循环次数,共循环i*255次 //返回值:无 void delay(unsigned char i) //延时函数,无符号字符型变量i为形式参数{ unsigned char j, k; //定义无符号字符型变量j和k for(k = 0; k < i; k++) //双重for循环语句实现软件延时 for(j = 0; j < 255; j++); } //功能:采用循环结构实现的流水灯控制程序 //此方式中采用的移位,按位取反等操作是位操作 #include //包含头文件REG51.H void delay(unsigned char i); //延时函数声明 void main() //主函数

最新C语言第六章循环结构复习题

循环结构程序设计复习题 一.选择题 1.以下while循环中,循环体执行的次数是:() k=1; while (--k) k=10; a) 10次b) 无限次c) 一次也不执行d) 1次 2.有以下程序段,其中x为整型变量,以下选项中叙述正确的是:() x=0; while (!x!=0) x++; a) 退出while循环后,x的值为0 b) 退出while循环后,x的值为1 c) while的控制表达式是非法的 d) while循环执行无限次 3. 有以下程序段,其中n为整型变量,执行后输出结果是:() n=20 ; while(n--) ; printf(“%d”,n) ; a) 2 b) 10 c) -1 d) 0 4. 有以下程序段,其中t为整型变量,以下选项中叙述正确的是:() t=1; while (-1)

{ t--; if(t) break;} a) 循环一次也不执行 b) 循环执行一次 c) 循环控制表达式(-1)不合法 d) 循环执行2次 5. 有以下程序段,其中x为整型变量,以下选项中叙述正确的是:() x=-1; do {;} while (x++); printf(“x=%d”,x); a) 该循环没有循环体,程序错误 b) 输出x=1 c) 输出x=0 d) 输出x=-1 6. 有以下程序段,其中x,y为整型变量,程序输出结果是:() for(x=0,y=0;(x<=1)&&(y=1);x++,y--) ; printf(“x=%d,y=%d”,x,y); a) x=2,y=0 b) x=1,y=0 c) x=1,y=1 d) x=0,y=0

电动车控制器C语言源代码

电动车控制器C语言源代码 . #define _E_BIKE_W79E83X_C_ #include "intrins.h" #include "E_BIKE_W79E83X.H" #include"W79E834.h" /******************************************************************** ********* * 主函数 ******************************************************************** * *********/ void main(void) { Init(); // 初始化 Init_IO(); // 初始化端口 H_Sample(); // 霍尔信号采样 Phase_Change(); // 相位变换 AutoHelpEN(1,0x1AA,200); /* 第一个参数设定助力功能允许不否,1为允许,0为禁止 第二个参数设定助力力量(PWM占空比),数值围:0~0x355,数值越大,力量 越大 第三个参数设定助力时间,数值越大,时间越长 */

Keep_SpeedEN(1,0x20,6); /* 第一个参数设定定速巡航功能允许不否,1为允许,0为禁止第二个参数设定定速巡航最低速设置 . . 第三个参数设定在巡航点保持多长时间后才进入巡航 */ Current_Lim(0xB48); /* 过流保护上限值设定 0xB00对应限电流最大大约为2.6A 0xB80对应限流值最大大约为3.8A */ LowVoltage_Lim(0x9B0); /* 欠压保护下限值设定 电池电压为47.9V时ADC采样值为0xB6 ==> 0xB60 推算电池电压为41V时的采样值为0x9B ==> 0x9B0 推算电池电压为40V时的采样值为0x98 ==> 0x980 */ EABS_Set(1,1); /* 第一个参数为滑行充电功能使能,1为允许,0为禁止

自动控制交通灯C语言程序

#include #define uchar unsigned char #define uint unsigned int const uchar SMG[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6F}; uchar NUM,SIGN=10,TIM,TIM2; bit FLAG,FLAG2; sbit hong_D=P1^0; sbit lv_D=P1^1; sbit huang_D=P1^2; sbit hong_B=P1^3; sbit lv_B=P1^4; sbit huang_B=P1^5; sbit BEEP=P3^4; sbit EN1=P2^3; sbit DIG1=P2^6; sbit DIG2=P2^7; sbit EN2=P2^2; sbit DIG3=P2^4; sbit DIG4=P2^5; sbit KEY1=P3^0; sbit KEY2=P3^1; sbit KEY3=P3^2; sbit KEY4=P3^3;

sbit KEY5=P2^0; sbit KEY6=P2^1; void keyscan(); uint M,N; void delay(uint n) { uint x,y; for(x=n;x>0;x--) for(y=110;y>0;y--); } void seg1(uint x) { DIG1=0; P0=SMG[x/10]; delay(1); DIG1=1; P0=0X00; DIG2=0; P0=SMG[x%10]; delay(1); DIG2=1; P0=0X00; } void seg2(uint x)

音量控制M62446的驱动C程序

音量控制M62446的驱动C程序 音量控制M62446 m62446 pdf //------------------------------------------------------------------------- // M62446 drving routines, VER 1.0 // // COPYRIGHT (C) 2000, Enbia Technology Inc. // Target: 8031 // AUTHOR: STEVEN LUO // // Revision History: // 2001/1/5 - Original Version // //------------------------------------------------------------------------- #include #include #include #include extern BOOL PIN_M62446_LATCH; extern BOOL PIN_M62446_DATA; extern BOOL PIN_M62446_CLK; static idata WORD shadow_word00=0; static idata WORD shadow_word01=0; static idata WORD shadow_word10=0; static idata WORD shadow_word11=0; // for storing the control word status // static BOOL bM62446Muted; // Set when 62446 is muted static void Write_M62446_Word(WORD myword); //------------------------------------------------------------------------- // Name: Volume_Validate // Description: // Arguments: // Return value: none //------------------------------------------------------------------------- static BYTE Volume_Validate(char vol){ if(vol<0)vol=0; // negative, should be 0 else if(vol >80) vol=80; // >80, set to 80 return 80 - vol; // Down to Up } //------------------------------------------------------------------------- // Name: Mute_M62446 // Description: // Arguments: // Return value: none //------------------------------------------------------------------------- void Mute_M62446(void){

C语言入门教程____免费下载

51单片机C语言 相信很多爱好电子的朋友,对单片机这个词应该都不会陌生了吧。不过有些朋友可能只听说他叫单片机,他的全称是什么也许并不太清楚, 更不用说他的英文全称和简称了。单片机是一块在集成电路芯片上集成了一台有一定规模的微型计算机。简称为:单片微型计算机或单片机 (Single Chip Computer)。单片机的应用到处可见,应用领域广泛,主要应用在智能仪表、实时控制、通信、家电等方面。不过这一切都没 什么关系,因为我(当然也包括任何人)都是从不知道转变成知道的,再转变成精通的。现在我只想把我学习单片机的经历,详细地讲叙给大 家听听,可能有些大虾会笑话我,想:那么简单的东西还在这里卖弄。但是你错了,我只是把我个人学习的经历讲述一遍而已,仅仅对那些想 学习单片机,但又找不到好方法或者途径的朋友,提供一个帮助,使他们在学习过程中,尽量少走些弯路而已! 首先,你必须有学习单片机的热情,不是说今天去图书馆看了一个下午关于单片机的书,而明天玩上半天,后天就不知道那个本书在讲什 么东西了。还是先说说我吧,我从大二的第一个学期期末的时候才开始接触单片机,但在这之前,正如上面所说的:我知道有种芯片叫单片机, 但是具体长成什么样子,却一点也不知道!看到这里很多朋友一定会忍不住发笑。嘿嘿,你可千万别笑,有些大四毕业的人也同样不知道单片 机长成什么样子呢!而我对单片机的痴迷更是常人所不能想象的地步,大二的期末考试,我全放弃了复习,每当室友拿着书在埋头复习的时候, 我却捧着自己从图书馆借的单片机书在那看,虽然有很多不懂,但是我还是坚持了下来,当时我就想过,为了单片机值不值得我这样去付出, 或许这也是在一些三流学校的好处吧,考试挂科后,明年开学交上几十元一门的补考费,应该大部分都能过了。于是,我横下一条心,坚持看 我的单片机书和资料。 当你明白了单片机是这么一回事的时候,显而易见的问题出来了:我要选择那种语言为单片机编写程序呢这个问题,困扰了我好久。具 体选择C51还是A51呢汇编在我们大二之前并没有开过课,虽然看着人家的讲解,很容易明白单片机的每一时刻的具体工作情况,但是一合上 书或者资料,自己却什么也不知道了,根本不用说自己写程序了。于是,我最终还是决定学C51,毕竟C51和我们课上讲的C语言,有些类似, 编程的思想可以说是相通的。而且C51还有更大的优点就是编写大程序时的优越性更不言而喻,当然在那时,我并没有想的那么深远,C51的特 点,还是在后来的实践过程中,渐渐体会到的!朋友如果你选择了C51,那么请继续往下看,如果你选择了A51,那么你可以不要看了!因为下面讲 的全是C方面的,完全在浪费你的时间! 呵呵 ^_^ 第二,既然你想学好单片机,你必须得舍得花钱,如果不买些芯片回来自己动手焊焊拆拆的(但是在后期会介绍给大家一个很好用的硬件 仿真软件,并不需要你用实验板和仿真器了,直接在你的PC上完成,但是软件毕竟是软件,从某个特定的意义上来说是并不能代替硬件的),即使 你每天捧着本书,把那本书翻烂,也永远学不会单片机的!刚接触单片机的朋友,看了资料,一定会对以下几个词见的比较多,但是具体的概

红绿灯C语言程序

红绿灯C语言程序(P0口接数码管,平口接发光二极管) #include #define uchar unsigned char #define uint unsigned int uchar i=0,c=0,s=1;// m_flag=1;// ////////////////////////////////////// void dxlv1_nbh1(void) // { P1=0x5a; } void dx0_nbh1(void) // { P1=0x0a; } void dxh1_nbl1(void) // { P1=0xa5; } void dxh1_nb0(void) // { P1=0xa0; } void nbs(void) // 南北灯闪 { if(m_flag==1){dxh1_nb0();} else {dxh1_nbl1();} } void dxs(void){ // 东西灯闪 if(m_flag==1){dx0_nbh1();} else {dxlv1_nbh1();} } //////主程序////////////////// void main() { TMOD=0x01;//定时器0工作在方式1 TH0=-5000/256;//50ms

TL0=-5000%256;//20ms IE=0x82;///允许定时器0中断 TR0=1;///启动定时器0 while(1){ //0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f if(s==10){P0=0x3f;} // 东西绿灯亮,南北红灯亮倒计时开始 if(s==9)P0=0x06; if(s==8)P0=0x5b; if(s==7)P0=0x4f; if(s==6)P0=0x66; if(s==5)P0=0x6d; if(s==4)P0=0x7d; if(s==3)P0=0x07; if(s==2)P0=0x7f; if(s==1){P0=0x6f;P1=0x5a;} if(s>9&&s<13){dxs();} //10秒结束南北红灯继续,东西绿灯一秒一闪闪三次 if(s==13){dxh1_nbl1(); P0=0x6f; }//东西红灯亮,南北绿灯亮倒计时开始 if(s==22){P0=0x3f;} if(s==21)P0=0x06; if(s==20)P0=0x5b; if(s==19)P0=0x4f; if(s==18)P0=0x66; if(s==17)P0=0x6d; if(s==16)P0=0x7d; if(s==15)P0=0x07; if(s==14)P0=0x7f; if(s>21&&s<25){nbs();} //10秒结束东西向红灯亮继续,南北绿灯一秒一闪三次 if(s==25){s=1; }// s归位 } } /////T0中断子程序//////////// void T0_INT()interrupt 1 { TH0=-50000/256;//50ms TL0=-50000%256; if(c==10)m_flag=0; c++;if(c==20)//50ms*20=1s {m_flag=1; c=0;

PID控制算法的C语言实现完整版精编版

P I D控制算法的C语言 实现完整版 文件编码(008-TTIG-UTITD-GKBTT-PUUTI-WYTUI-8256)

P I D控制算法的C语言实现一P I D算法原理最近两天在考虑一般控制算法的C语言实现问题,发现网络上尚没有一套完整的比较体系的讲解。于是总结了几天,整理一套思路分享给大家。 在工业应用中PID及其衍生算法是应用最广泛的算法之一,是当之无愧的万能算法,如果能够熟练掌握PID算法的设计与实现过程,对于一般的研发人员来讲,应该是足够应对一般研发问题了,而难能可贵的是,在我所接触的控制算法当中,PID控制算法又是最简单,最能体现反馈思想的控制算法,可谓经典中的经典。经典的未必是复杂的,经典的东西常常是简单的,而且是最简单的,想想牛顿的力学三大定律吧,想想爱因斯坦的质能方程吧,何等的简单!简单的不是原始的,简单的也不是落后的,简单到了美的程度。先看看PID算法的一般形式: PID的流程简单到了不能再简单的程度,通过误差信号控制被控量,而控制器本身就是比例、积分、微分三个环节的加和。这里我们规定(在t 时刻): 1.输入量为rin(t); 2.输出量为rout(t); 3.偏差量为err(t)=rin(t)-rout(t); pid的控制规律为

理解一下这个公式,主要从下面几个问题着手,为了便于理解,把控制环境具体一下: 1.规定这个流程是用来为直流电机调速的; 2.输入量rin(t)为电机转速预定值; 3.输出量rout(t)为电机转速实际值; 4.执行器为直流电机; 5.传感器为光电码盘,假设码盘为10线; 6.直流电机采用PWM调速转速用单位转/min表示; 不难看出以下结论: 1.输入量rin(t)为电机转速预定值(转/min); 2. 输出量rout(t)为电机转速实际值(转/min); 3.偏差量为预定值和实际值之差(转/min); 那么以下几个问题需要弄清楚: 1.通过PID环节之后的U(t)是什么值呢 2.控制执行器(直流电机)转动转速应该为电压值(也就是PWM占空比)。

C语言实现控制电机加减速正反转(飞思卡尔C代码)

用单片机控制直流电动机的正反转、加减速的程序如何用C语言写 参考一下这个例子吧。 #include #define uchar unsigned char #define uint unsigned int sbit PW1=P2^0 ; sbit PW2=P2^1 ; //控制电机的两个输入 sbit accelerate=P2^2 ; //调速按键 sbit stop=P2^3 ; //停止按键 sbit left=P2^4 ; //左转按键 sbit right=P2^5 ; //右转按键 #define right_turn PW1=0;PW2=1 //顺时针转动 #define left_turn PW1=1;PW2=0 //逆向转动 #define end_turn PW1=1;PW2=1 //停转 uint t0=25000,t1=25000; //初始时占空比为50% uint a=25000; // 设置定时器装载初值 25ms 设定频率为20Hz uchar flag=1; //此标志用于选择不同的装载初值 uchardflag; //左右转标志 uchar count; //用来标志速度档位 void keyscan(); //键盘扫描 void delay(uchar z); void time_init(); //定时器的初始化 void adjust_speed(); //通过调整占空比来调整速度 //**********************************// void main() { time_init(); //定时器的初始化 while(1) { keyscan(); //不断扫描键盘程序,以便及时作出相应的响应 } }

C语言实验报告第六章

实验报告 课程名称_____ C语言程序设计_____ 实验项目___数组(2)___ 实验仪器______计算机___________ 系别_____信息与通信工程学院_______ 专业______通信工程________ 班级/学号_____ 学生姓名______ ________ 实验日期____2013年6月25日___ 成绩_______________________ 指导教师______李文杰_________

一、实验目的 1、掌握二维数组的定义。 2、掌握二维数组元素的应用。 3、掌握字符数组的定义和元素的引用。 4、掌握字符数组元素和字符串的应用。 二、实验内容 1、描述 输入一个字符串str和一个子串s,统计str中子串s的个数。 输入 输入数据有2行,第一行为str,第二行为s,字符串长度不超过128。输出 输出子串的个数 样例输入 输入样例1: sdf$$$sdf$$ sdf 输入样例2: abcabcaaannnnbbbnc abc 样例输出 样例输出1: 2

样例输出2: 2 提示 所有的测试样例都不包含类似于下面的统计:输入:aaaabbbaaabbabaaaa aa 程序代码: #include "stdio.h" char st[500],str[500]; int ji; int shu1,shu2; int pd; int strl(char tt[1000]) { int sum=0; while (tt[sum]!='\0') sum++; return sum; } int main(void) { scanf("%s",&st); scanf("%s",&str); shu1=strl(st); shu2=strl(str); int i,j; int kk; for(i=0;i<=shu1-shu2;i++) { pd=0; kk=0; for(j=i;j

C语言基础教程经典100例

【程序1】 题目:有1、2、3、4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少? 1.程序分析:可填在百位、十位、个位的数字都是1、2、3、4。组成所有的排列后再去 掉不满足条件的排列。 2.程序源代码: main() { int i,j,k; printf("\n"); for(i=1;i<5;i++)/*以下为三重循环*/ for(j=1;j<5;j++) for (k=1;k<5;k++) { if (i!=k&&i!=j&&j!=k) /*确保i、j、k三位互不相同*/ printf("%d,%d,%d\n",i,j,k); } } =========================================================== === 【程序2】

题目:企业发放的奖金根据利润提成。利润(I)低于或等于10万元时,奖金可提10%;利润高 于10万元,低于20万元时,低于10万元的部分按10%提成,高于10万元的部分,可可提 成7.5%;20万到40万之间时,高于20万元的部分,可提成5%;40万到60万之间时高于 40万元的部分,可提成3%;60万到100万之间时,高于60万元的部分,可提成1.5%,高于 100万元时,超过100万元的部分按1%提成,从键盘输入当月利润I,求应发放奖金总数? 1.程序分析:请利用数轴来分界,定位。注意定义时需把奖金定义成长整型。 2.程序源代码: main() { long int i; int bonus1,bonus2,bonus4,bonus6,bonus10,bonus; scanf("%ld",&i); bonus1=100000*0.1;bonus2=bonus1+100000*0.75; bonus4=bonus2+200000*0.5; bonus6=bonus4+200000*0.3; bonus10=bonus6+400000*0.15;

PID控制算法的C语言实现

PID控制算法的C语言实现一PID算法原理 最近两天在考虑一般控制算法的C语言实现问题,发现网络上尚没有一套完整的比较体系的讲解。于是总结了几天,整理一套思路分享给大家。 在工业应用中PID及其衍生算法是应用最广泛的算法之一,是当之无愧的万能算法,如果能够熟练掌握PID算法的设计与实现过程,对于一般的研发人员来讲,应该是足够应对一般研发问题了,而难能可贵的是,在我所接触的控制算法当中,PID控制算法又是最简单,最能体现反馈思想的控制算法,可谓经典中的经典。经典的未必是复杂的,经典的东西常常是简单的,而且是最简单的,想想牛顿的力学三大定律吧,想想爱因斯坦的质能方程吧,何等的简单!简单的不是原始的,简单的也不是落后的,简单到了美的程度。先看看PID算法的一般形式: PID的流程简单到了不能再简单的程度,通过误差信号控制被控量,而控制器本身就是比例、积分、微分三个环节的加和。这里我们规定(在t时刻): 1.输入量为rin(t); 2.输出量为rout(t); 3.偏差量为err(t)=rin(t)-rout(t); pid的控制规律为

理解一下这个公式,主要从下面几个问题着手,为了便于理解,把控制环境具体一下: 1.规定这个流程是用来为直流电机调速的; 2.输入量rin(t)为电机转速预定值; 3.输出量rout(t)为电机转速实际值; 4.执行器为直流电机; 5.传感器为光电码盘,假设码盘为10线; 6.直流电机采用PWM调速转速用单位转/min表示; 不难看出以下结论: 1.输入量rin(t)为电机转速预定值(转/min); 2. 输出量rout(t)为电机转速实际值(转/min); 3.偏差量为预定值和实际值之差(转/min); 那么以下几个问题需要弄清楚: 1.通过PID环节之后的U(t)是什么值呢 2.控制执行器(直流电机)转动转速应该为电压值(也就是PWM占空比)。 3.那么U(t)与PWM之间存在怎样的联系呢

相关文档
相关文档 最新文档