LED 一般是恒流操作的,如何改变 LED 的亮度呢?答案就是 PWM 控制。在一定的 频率的方波中,调整高电平和低电平的占空比,即可实现。比如我们用低电平点亮一个 LED 灯,我们假设把一个频率周期分为 10 个时间等份,如果方波中的高低电平占空比是 9:1, 这是就是一个比较暗的亮度,如果方波中高低电平占空比是 10:0,这时,全部是高电平, 灯是灭的。如果占空比是 5:5,就是一个中间亮度,如果高低比是 1:9,是一个比较亮的 亮度,如果高低是 0:10,这时全部是低电平,就是最亮的。 实际上应用中,电视屏幕墙中的几十百万 LED 象素都是这样控制的,而且每一个象素 都有红绿蓝 3 个 LED,每个 LED 可以变化的亮度是几百到几万或者更多的级别,以实现真 彩色的显示。还有在您的手机中,背光灯的亮度如果是可以变化的,也应该是这种工作方式。 目前的城市彩灯也有很多都使用了 LED,需要控制亮度是也是 PWM 控制。 下面来分析我们的例程,在这个例程中,我们将定时器 2 溢出定为 1/1200 秒。每 10 次脉冲输出一个 120HZ 频率。这每 10 次脉冲再用来控制高低电平的 10 个比值。这样,在 每个 1/120 秒的方波周期中,我们都可以改变方波的输出占空比,从而控制 LED 灯的 10 个 级别的亮度。 为什么输出方波的频率要 120HZ 这么高?因为如果频率太低,人眼就会看到闪烁感 觉。一般起码要在 60HZ 以上才感觉好点,120HZ 就基本上看不到闪烁,只能看到亮度的变 化了。 下面请看程序,程序中有比较多的注释: ――――――――――――――――――――――― #define uchar unsigned char //定义一下方便使用 #define uInt unsigned Int #define ulong unsigned long #include <reg52.h> //包括一个 52 标准内核的头文件 sbit P10 = P1^0; //要控制的 LED 灯 sbit K1= P3^2; //按键 K1 uchar scale;//用于保存占空比的输出 0 的时间份额,总共 10 份 char code dx516[3] _at_ 0x003b;//这是为了仿真设置的 //模拟 PWM 输出控制灯的 10 个亮度级别 void main(void) // 主程序 { uInt n; RCAP2H =0xF3; //赋 T2 的预置值,溢出 1 次是 1/1200 秒钟 RCAP2L =0x98; TR2=1; //启动定时器 ET2=1; //打开定时器 2 中断 EA=1; //打开总中断 while(1) //程序循环 { ;//主程序在这里就不断自循环,实际应用中,这里是做主要工作 for(n=0;n<50000;n++); //每过一会儿就自动加一个档次的亮度 scale++; if(scale==10)scale=0; } } //1/1200 秒定时器 2 中断 timer2() Interrupt 5 { static uchar tt; //tt 用来保存当前时间在一秒中的比例位置 TF2=0; tt++; if(tt==10) //每 1/120 秒整开始输出低电平 { tt=0; if(scale!=0) //这里加这一句是为了消除灭灯状态产生的鬼影 P10=0; } if(scale==tt) //按照当前占空比切换输出高电平 P10=1; } ―――――――――――――――――― 在主程序中,每延时一段时间,就自动换一个占空比,以使亮度自动变化,方便观察。 编译,运行,看结果。 可以看到,LED 的亮度以每种亮度 1 秒左右不断变化,共有 10 个级别。
上传时间: 2017-11-06
上传用户:szcyclone
链表习题 1. 编程实现链表的基本操作函数。 (1). void CreatList(LinkList &La,Int m) //依次输入m个数据,并依次建立各个元素结点,逐个插入到链表尾;建立带表头结点的单链表La; (2). void ListPrInt(LinkList La) //将单链表La的数据元素从表头到表尾依次显示。 (3).void ListInsert (LinkList &L,Int i,ElemType e){ //在带头结点的单链表L中第i个数据元素之前插入数据元素e (4). void ListDelete(LinkList &La, Int n, ElemType &e) //删除链表的第n个元素,并用e返回其值。 (5). Int Search(LinkList L, ElemType x) //在表中查找是否存在某个元素x,如存在则返回x在表中的位置,否则返回0。 (6). Int ListLength(LinkList L) //求链表L的表长 (7). void GetElem(LinkList L, Int i, ElemType &e) //用e返回L中第i个元素的值 链表的结点类型定义及指向结点的指针类型定义可以参照下列代码: typedef struct Node{ ElemType data; // 数据域 struct Node *next; // 指针域 }LNode, *LinkList;
标签: 单链表
上传时间: 2017-11-15
上传用户:BIANJIAXIN
1. 编程实现链表的基本操作函数。 (1). void CreatList(LinkList &La,Int m) //依次输入m个数据,并依次建立各个元素结点,逐个插入到链表尾;建立带表头结点的单链表La; (2). void ListPrInt(LinkList La) //将单链表La的数据元素从表头到表尾依次显示。 (3).void ListInsert (LinkList &L,Int i,ElemType e){ //在带头结点的单链表L中第i个数据元素之前插入数据元素e (4). void ListDelete(LinkList &La, Int n, ElemType &e) //删除链表的第n个元素,并用e返回其值。 (5). Int Search(LinkList L, ElemType x) //在表中查找是否存在某个元素x,如存在则返回x在表中的位置,否则返回0。 (6). Int ListLength(LinkList L) //求链表L的表长 (7). void GetElem(LinkList L, Int i, ElemType &e) //用e返回L中第i个元素的值 链表的结点类型定义及指向结点的指针类型定义可以参照下列代码: typedef struct Node{ ElemType data; // 数据域 struct Node *next; // 指针域 }LNode, *LinkList;
标签: 单链表
上传时间: 2017-11-15
上传用户:BIANJIAXIN
1. 声明病人 Patient 类,此类对象包括 name(String)、sex(char)、age(Int)、weight(float)、allergies(boolean)。 声明 setName 存取及修改方法。在一个单独的类中,声明测试方法,并生成两个 Patient 对象,设置其 状态并将其信息显示在屏幕上。声明并测试 toString()方法,显示一个病人 age、sex、name 及 allergies
标签: allergies Patient name age sex toString boolean setName String weight
上传时间: 2017-11-27
上传用户:x138178
题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少? //这是一个菲波拉契数列问题 public class lianxi01 { public static void main(String[] args) { System.out.prIntln("第1个月的兔子对数: 1"); System.out.prIntln("第2个月的兔子对数: 1"); Int f1 = 1, f2 = 1, f, M=24; for(Int i=3; i<=M; i++) { f = f2; f2 = f1 + f2; f1 = f; System.out.prIntln("第" + i +"个月的兔子对数: "+f2); } } } 【程序2】 题目:判断101-200之间有多少个素数,并输出所有素数。 程序分析:判断素数的方法:用一个数分别去除2到sqrt(这个数),如果能被整除, 则表明此数不是素数,反之是素数。 public class lianxi02 { public static void main(String[] args) { Int count = 0; for(Int i=101; i<200; i+=2) { boolean b = false; for(Int j=2; j<=Math.sqrt(i); j++) { if(i % j == 0) { b = false; break; } else { b = true; } } if(b == true) {count ++;System.out.prIntln(i );} } System.out.prIntln( "素数个数是: " + count); } } 【程序3】 题目:打印出所有的 "水仙花数 ",所谓 "水仙花数 "是指一个三位数,其各位数字立方和等于该数本身。例如:153是一个 "水仙花数 ",因为153=1的三次方+5的三次方+3的三次方。 public class lianxi03 { public static void main(String[] args) { Int b1, b2, b3;
上传时间: 2017-12-24
上传用户:Ariza
程序显示: 一年内总降雨量、平均每月的降雨量、降雨量最大的月份和最小的月份。 #include<iostream> using namespace std; #include<stdlib.h> Int main() .. .. .. cout<<"降雨量最小的月份是:"<<minyue<<"月 "<<"降雨量为:"<<min<<endl; }
上传时间: 2018-03-27
上传用户:shayusha
#include <stdio.h> #include <stdlib.h> ///链式栈 typedef struct node { Int data; struct node *next; }Node,*Linklist; Linklist Createlist() { Linklist p; Linklist h; Int data1; scanf("%d",&data1); if(data1 != 0) { h = (Node *)malloc(sizeof(Node)); h->data = data1; h->next = NULL; } else if(data1 == 0) return NULL; scanf("%d",&data1); while(data1 != 0) { p = (Node *)malloc(sizeof(Node)); p -> data = data1; p -> next = h; h = p; scanf("%d",&data1); } return h; } void Outputlist(Node *head) { Linklist p; p = head; while(p != NULL ) { prIntf("%d ",p->data); p = p->next; } prIntf("\n"); } void Freelist(Node *head) { Node *p; Node *q = NULL; p = head; while(p != NULL) { q = p; p = p->next; free(q); } } Int main() { Node *head; head = Createlist(); Outputlist(head); Freelist(head); return 0; } 2.顺序栈 [cpp] view plain copy #include <iostream> #include <stdio.h> #include <stdlib.h> ///顺序栈 #define MaxSize 100 using namespace std; typedef
上传时间: 2018-05-09
上传用户:123456..
#include <iostream> #include <stdio.head> #include <stdlib.head> #include <string.head> #define ElemType Int #define max 100 using namespace std; typedef struct node1 { ElemType data; struct node1 *next; }Node1,*LinkList;//链栈 typedef struct { ElemType *base; Int top; }SqStack;//顺序栈 typedef struct node2 { ElemType data; struct node2 *next; }Node2,*LinkQueue; typedef struct node22 { LinkQueue front; LinkQueue rear; }*LinkList;//链队列 typedef struct { ElemType *base; Int front,rear; }SqQueue;//顺序队列 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 //1.采用链式存储实现栈的初始化、入栈、出栈操作。 LinkList CreateStack()//创建栈 { LinkList top; top=NULL; return top; } bool StackEmpty(LinkList s)//判断栈是否为空,0代表空 { if(s==NULL) return 0; else return 1; } LinkList Pushead(LinkList s,Int x)//入栈 { LinkList q,top=s; q=(LinkList)malloc(sizeof(Node1)); q->data=x; q->next=top; top=q; return top; } LinkList Pop(LinkList s,Int &e)//出栈 { if(!StackEmpty(s)) { prIntf("栈为空。"); } else { e=s->data; LinkList p=s; s=s->next; free(p); } return s; } void DisplayStack(LinkList s)//遍历输出栈中元素 { if(!StackEmpty(s)) prIntf("栈为空。"); else { wheadile(s!=NULL) { cout<<s->data<<" "; s=s->next; } cout<<endl; } } 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 //2.采用顺序存储实现栈的初始化、入栈、出栈操作。 Int StackEmpty(Int t)//判断栈S是否为空 { SqStack.top=t; if (SqStack.top==0) return 0; else return 1; } Int InitStack() { SqStack.top=0; return SqStack.top; } Int pushead(Int t,Int e) { SqStack.top=t; SqStack.base[++SqStack.top]=e; return SqStack.top; } Int pop(Int t,Int *e)//出栈 { SqStack.top=t; if(!StackEmpty(SqStack.top)) { prIntf("栈为空."); return SqStack.top; } *e=SqStack.base[s.top]; SqStack.top--; return SqStack.top; } 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 //3.采用链式存储实现队列的初始化、入队、出队操作。 LinkList InitQueue()//创建 { LinkList head; head->rear=(LinkQueue)malloc(sizeof(Node)); head->front=head->rear; head->front->next=NULL; return head; } void deleteEle(LinkList head,Int &e)//出队 { LinkQueue p; p=head->front->next; e=p->data; head->front->next=p->next; if(head->rear==p) head->rear=head->front; free(p); } void EnQueue(LinkList head,Int e)//入队 { LinkQueue p=(LinkQueue)malloc(sizeof(Node)); p->data=e; p->next=NULL; head->rear->next=p; head->rear=p; } 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 //4.采用顺序存储实现循环队列的初始化、入队、出队操作。 bool InitQueue(SqQueue &head)//创建队列 { head.data=(Int *)malloc(sizeof(Int)); head.front=head.rear=0; return 1; } bool EnQueue(SqQueue &head,Int e)//入队 { if((head.rear+1)%MAXQSIZE==head.front) { prIntf("队列已满\n"); return 0; } head.data[head.rear]=e; head.rear=(head.rear+1)%MAXQSIZE; return 1; } Int QueueLengthead(SqQueue &head)//返回队列长度 { return (head.rear-head.front+MAXQSIZE)%MAXQSIZE; } bool deleteEle(SqQueue &head,Int &e)//出队 { if(head.front==head.rear) { cout<<"队列为空!"<<endl; return 0; } e=head.data[head.front]; head.front=(head.front+1)%MAXQSIZE; return 1; } Int gethead(SqQueue head)//得到队列头元素 { return head.data[head.front]; } Int QueueEmpty(SqQueue head)//判断队列是否为空 { if (head.front==head.rear) return 1; else return 0; } void travelQueue(SqQueue head)//遍历输出 { wheadile(head.front!=head.rear) { prIntf("%d ",head.data[head.front]); head.front=(head.front+1)%MAXQSIZE; } cout<<endl; } 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 //5.在主函数中设计一个简单的菜单,分别测试上述算法。 Int main() { LinkList top=CreateStack(); Int x; wheadile(scanf("%d",&x)!=-1) { top=Pushead(top,x); } Int e; wheadile(StackEmpty(top)) { top=Pop(top,e); prIntf("%d ",e); }//以上是链栈的测试 Int top=InitStack(); Int x; wheadile(cin>>x) top=pushead(top,x); Int e; wheadile(StackEmpty(top)) { top=pop(top,&e); prIntf("%d ",e); }//以上是顺序栈的测试 LinkList Q; Q=InitQueue(); Int x; wheadile(scanf("%d",&x)!=-1) { EnQueue(Q,x); } Int e; wheadile(Q) { deleteEle(Q,e); prIntf("%d ",e); }//以上是链队列的测试 SqQueue Q1; InitQueue(Q1); Int x; wheadile(scanf("%d",&x)!=-1) { EnQueue(Q1,x); } Int e; wheadile(QueueEmpty(Q1)) { deleteEle(Q1,e); prIntf("%d ",e); } return 0; }
上传时间: 2018-05-09
上传用户:123456..
#include "iostream" using namespace std; class Matrix { private: double** A; //矩阵A double *b; //向量b public: Int size; Matrix(Int ); ~Matrix(); friend double* Dooli(Matrix& ); void Input(); void Disp(); }; Matrix::Matrix(Int x) { size=x; //为向量b分配空间并初始化为0 b=new double [x]; for(Int j=0;j<x;j++) b[j]=0; //为向量A分配空间并初始化为0 A=new double* [x]; for(Int i=0;i<x;i++) A[i]=new double [x]; for(Int m=0;m<x;m++) for(Int n=0;n<x;n++) A[m][n]=0; } Matrix::~Matrix() { cout<<"正在析构中~~~~"<<endl; delete b; for(Int i=0;i<size;i++) delete A[i]; delete A; } void Matrix::Disp() { for(Int i=0;i<size;i++) { for(Int j=0;j<size;j++) cout<<A[i][j]<<" "; cout<<endl; } } void Matrix::Input() { cout<<"请输入A:"<<endl; for(Int i=0;i<size;i++) for(Int j=0;j<size;j++){ cout<<"第"<<i+1<<"行"<<"第"<<j+1<<"列:"<<endl; cin>>A[i][j]; } cout<<"请输入b:"<<endl; for(Int j=0;j<size;j++){ cout<<"第"<<j+1<<"个:"<<endl; cin>>b[j]; } } double* Dooli(Matrix& A) { double *Xn=new double [A.size]; Matrix L(A.size),U(A.size); //分别求得U,L的第一行与第一列 for(Int i=0;i<A.size;i++) U.A[0][i]=A.A[0][i]; for(Int j=1;j<A.size;j++) L.A[j][0]=A.A[j][0]/U.A[0][0]; //分别求得U,L的第r行,第r列 double temp1=0,temp2=0; for(Int r=1;r<A.size;r++){ //U for(Int i=r;i<A.size;i++){ for(Int k=0;k<r-1;k++) temp1=temp1+L.A[r][k]*U.A[k][i]; U.A[r][i]=A.A[r][i]-temp1; } //L for(Int i=r+1;i<A.size;i++){ for(Int k=0;k<r-1;k++) temp2=temp2+L.A[i][k]*U.A[k][r]; L.A[i][r]=(A.A[i][r]-temp2)/U.A[r][r]; } } cout<<"计算U得:"<<endl; U.Disp(); cout<<"计算L的:"<<endl; L.Disp(); double *Y=new double [A.size]; Y[0]=A.b[0]; for(Int i=1;i<A.size;i++ ){ double temp3=0; for(Int k=0;k<i-1;k++) temp3=temp3+L.A[i][k]*Y[k]; Y[i]=A.b[i]-temp3; } Xn[A.size-1]=Y[A.size-1]/U.A[A.size-1][A.size-1]; for(Int i=A.size-1;i>=0;i--){ double temp4=0; for(Int k=i+1;k<A.size;k++) temp4=temp4+U.A[i][k]*Xn[k]; Xn[i]=(Y[i]-temp4)/U.A[i][i]; } return Xn; } Int main() { Matrix B(4); B.Input(); double *X; X=Dooli(B); cout<<"~~~~解得:"<<endl; for(Int i=0;i<B.size;i++) cout<<"X["<<i<<"]:"<<X[i]<<" "; cout<<endl<<"呵呵呵呵呵"; return 0; }
标签: 道理特分解法
上传时间: 2018-05-20
上传用户:Aa123456789
#include<stdio.h> #include<windows.h> Int xuanxiang; Int studentcount; Int banjihao[100]; Int xueqihao[100][10]; char xm[100][100]; Int xuehao[100][10]; Int score[100][3]; Int yuwen; Int shuxue[000]; Int yingyu[100]; Int c[100]; Int p; char x[1000][100]="",y[100][100]="";/*x学院 y专业 z班级*/ Int z[100]; main() { void input(); void inputsc(); void alter(); void scbybannji(); prIntf("--------学生成绩管理-----\n"); prIntf("请按相应数字键来实现相应功能\n"); prIntf("1.录入学生信息 2.录入学生成绩 3.修改学生成绩\n"); prIntf("4.查询学生成绩 5.不及格科目及名单 6.按班级输出学生成绩单\n"); prIntf("请输入你要实现的功能所对应的数字:"); scanf("%d",&xuanxiang); system("cls"); getchar(); switch (xuanxiang) { case 1:input(); case 2:inputsc(); case 3:alter(); /*case 4:select score(); case 5:bujigekemujimingdan();*/ case 6:scbybanji; } } void input() { Int i; prIntf("请输入你的学院名称:"); gets(x); prIntf("请输入你的专业名称:"); gets(y); prIntf("请输入你的班级号:"); scanf("%d",&z); prIntf("请输入你们一个班有几个人:"); scanf("%d",&p); system("cls"); for(i=0;i<p;i++) { prIntf("请输入第%d个学生的学号:",i+1); scanf("%d",xuehao[i]); getchar(); prIntf("请输入第%d个学生的姓名:",i+1); gets(xm[i]); system("cls"); } prIntf("您已经录入完毕您的班级所有学生的信息!\n"); prIntf("您的班级为%s%s%s\n",x,y,z); /*alter(p);*/ } void inputsc() { Int i; for(i=0;i<p;i++) { prIntf("\n"); prIntf("--------------------------------------------------------------------------------\n\n"); prIntf("\t\t\t\t录入学生的成绩\n\n\n"); prIntf("--------------------------------------------------------------------------------\n\n"); prIntf("\t\t\t\t%s\n",xm[i]); prIntf("\n"); prIntf("\t\t\t\t数学:"); scanf("%d",&shuxue[i]); prIntf("\n"); getchar(); prIntf("\t\t\t\t英语:"); scanf("%d",&yingyu[i]); prIntf("\n"); getchar(); prIntf("\t\t\t\tc语言:"); scanf("%d",&c[i]); system("cls"); } } void alter() { Int i;/*循环变量*/ Int m[10000];/*要查询的学号*/ Int b;/*修改后的成绩*/ char kemu[20]=""; prIntf("请输入你要修改的学生的学号"); scanf("%d",&m); for (i=0;i<p;i++) { if (m==xuehao[i]) { prIntf("%s的数学成绩为%d,英语成绩为%d,c语言成绩为%d,xm[i],shuxue[i],yingyu[i],c[i]"); prIntf("请输入你想修改的科目");} } gets(kemu); getchar(); if (kemu=="数学"); { scanf("%d",&b); shuxue[i]=b;} if (kemu=="英语"); { scanf("%d",&b); yingyu[i]=b;} if (kemu=="c语言"); { scanf("%d",&b); c[i]=b; } prIntf("%s的数学成绩为%d,英语成绩为%d,c语言成绩为%d,xm[i],shuxue[i],yingyu[i],c[i]"); } void scbybannji() { Int i; char zyname[20]; Int bjnumber; prIntf("请输入你的专业名称"); scanf("%s",&zyname); prIntf("请输入你的班级号"); scanf("%d",&bjnumber); for (i=0;i<p;i++) { if (zyname==y[i]); if (bjnumber==z[i]); prIntf("专业名称%s班级号%d数学成绩%d英语成绩%dc语言成绩%d,y[i],z[i],shuxue[i],yingyu[i],c[i]"); } }
标签: c语言
上传时间: 2018-06-08
上传用户:2369043090