㈠ 求秒表c语言 结构:P0口控制数码,P2.7控制十位,P2.5控制个位,P2.3按下秒表静止,P2
你好!这是仿真还是做实物,程序可以尝试完成
㈡ 求单片机C语言编程p1.0,p1.1分别控制led1,led2. p3.2控制按键开关,求详细C程序
#include<reg51.h>
#define uchar unsigned char
uchar sec,min,num;
sbit led1=P1^0;
sbit led2=P1^1;
sbit key=P3^2;
bit flag;
void delay(uchar x)
{
uchar i,j;
for(i=0;i<x;i++)
for(j=0;j<120;j++);
}
void t0isr() interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
num++;
if(num>=20)
{
num=0;
sec++;
if(sec>59)
{
sec=0;
min++;
switch(min)
{
case 0:led1=0;break;
case 1:if(flag){led1=0;min=0;flag=0;}
break;
case 4:led1=1;led2=0;break;
case 8:led2=1;break;
default:break;
}
if(min>=20)min=0;
}
}
}
void ext0() interrupt 0
{
delay(30);
if(key==0)
{
while(!key);
flag=1;
sec=0;
min=0;
num=0;
led1=1;
led2=1;
}
}
main()
{
TMOD=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
ET0=1;
EA=1;
EX0=1;
IT0=1;
TR0=1;
led1=0;
led2=1;
flag=0;
while(1);
}
㈢ C语言编程求解!~
/**
* 描述:解决网络知道中一位网友提出的问题
* 作者:QQwen
*/
#include <stdio.h>
#define M 3 //定义数组的一维
#define N 5 //定义数组的二维
//定义一个测试用数组,用来调试程序
int testArray[3][5] =
{
{ 11, 12, 13, 14, 15 },
{ 21, 22, 23, 24, 25 },
{ 31, 32, 33, 34, 35 }, };
/**
* 数组转换函数
* @param int (*a)[N] 需要转换的二维数组
* @param int k 从第k列左移
*/
//在这里第一个参数是很有说法的,这个直接影响到函数中的写法,如果函数中出现“a[i][j]”塌培这种操作的时候
//一定要这样定义参数,码昌否则编译器会提示你对a的下标操作是错误的,也就是说只有这样定义第一个个参数在函数
//体中才能以下标的形式操作数组中的元素
void fun(int (*a)[N], int k)
{
//int i, j, p, temp; //ij为循环变量,temp用来存储每行第一个元素,p这个变量意义不大用来配合k使用
int i, j, temp;
for (; k>0; k--)
//for (p = 1; p <= k; p++) //这里的p定义的有些多余,改团模唯为上面的方式更好
for (i = 0; i < M; i++)
{//行循环
temp = a[i][0]; //将每行的第一个元素先存储在临时的变量中,
//这样就空出了自己的位置,即使后面的变量覆盖了数据也不会丢失
//下面的操作是将数组中后一个元素搬运到前面一个位置,比如testArray[0][0] = 11,在执行
//完下面操作一次之后testArray[0][0] = 12。
for (j = 0; j < N - 1; j++)
a[i][j] = a[i][j + 1];
//再一行的元素都向前移动一位之后将先前保存的第0个元素赋值给本行最后的
a[i][N - 1] = temp;
}
}
/**
* 打印数组中的元素
*/
void printArray()
{
int i, j;
for (i = 0; i < M; i++)
{
for (j = 0; j < N; j++)
{
printf("%d \t", testArray[i][j]);
}
printf("\n"); //换行
}
}
int main()
{
int column = 0; //从哪列左移
printf("请输入要从第几列左移(1--5):\n");
scanf("%d",&column);
printf("二维数组转换之前为:\n");
printArray();
fun(testArray, column);
printf("二维数组转换之后为:\n");
printArray();
return 0;
}
程序输出为:
请输入要从第几列左移(1--5):
2
二维数组转换之前为:
11 12 13 14 15
21 22 23 24 25
31 32 33 34 35
二维数组转换之后为:
13 14 15 11 12
23 24 25 21 22
33 34 35 31 32
㈣ 单片机C语言 两个按键控制8位花样流水灯,P1.0接按键k1,P1.1接按键k2,P0口的8位接8个发光二极管
汇编程序如下:
; 花样流水灯(8个发光二极管以各种形式循环点亮)
; 功能:流水灯(8个发光二极管循环以1S间隔以各种形式循环点亮)
ORG H ;伪指令,指定程序从H开始存放
LJMP MAIN ;跳转指令,程序跳转至MAIN处执行
ORG H ;伪指令,指定程序从H开始存放
MAIN: MO SP, #60H ;给堆栈指针赋初值
MO P1,#0FFH ;给P1口赋值
MO DPTR,#TABLE;查表
LIGHT: MO R4,#42 ;设置循环次数
LOOP: MO A,#42 ;给A赋初值
SUBB A,R4 ;将A的值与R4的值相减,结果存在A中
MOC A,@A+DPTR ;将A+DPTR的值所坦好大对应的TABLE中的值赋给A
MO P1,A ;将A的值赋给P1口
LCALL DEL1S ;调用1S延时子程序
DJNZ R4,LOOP ;判断R4是否为0,不为0跳转,为0顺序执行
LJMP LIGHT ;跳转指令,跳转至LIGHT处继续执行
;1S延时子程序(11.MHz晶振,误差0微秒)
DEL1S: MO R5, #H
DL1S0: MO R6, #0A4H
DL1S1: MO R7, #H
DJNZ R7, $
DJNZ R6, DL1S1
DJNZ R5, DL1S0
RET
TABLE: ;定义表格数据
DB 0FFH ;全灭
DB 0FEH 0FDH 0FBH 0F7H 0EFH 0DFH 0BFH 07FH ;依次逐个点亮
DB 0FEH 0FCH 0F8H 0F0H 0E0H 0C0H H H ;依次逐个叠加
DB H 0C0H 0E0H 0F0H 0F8H 0FCH 0FEH 0FFH ;依次逐个递减
DB 07EH 0BDH 0DBH 0E7H 0E7H 0DBH 0BDH 07EH ;两边靠拢后分开
DB 07EH 03CH H H H H 03CH 07EH ;两边叠加后递减
DB H ;全亮
END ;程序结束指令
C语言程序如下:
/* 该实验是花样流水灯(8个发光二极管以各种袜敏方式循让竖环点亮),功能是花样流水灯(8个发光二极管以1S间隔以各种方式循环点亮) */
#include//包含reg.52文件
#define uint unsigned int//宏定义
#define uchar unsigned char//宏定义
void delay(uint z);//声明延时函数
uint a;//定义循环用变量
uchar code table[]={
0xff,//全灭
0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f,//依次逐个点亮
0xfe,0xfc,0xf8,0xf0,0xe0,0xc0,0x80,0x00,//依次逐个叠加
0x80,0xc0,0xe0,0xf0,0xf8,0xfc,0xfe,0xff,//依次逐个递减
0x7e,0xbd,0xdb,0xe7,0xe7,0xdb,0xbd,0x7e,//两边靠拢后分开
0x7e,0x3c,0x18,0x00,0x00,0x18,0x3c,0x7e,//两边叠加后递减
0x00,//全亮
;//¶¨ҥѭ»·Ӄʽ¾ݱ
/*Aµď֏ȊLj«ð£¬ȻºΖぁ£¬ȻºΖ
ȻºΖݼ»º߿¿£ºª£¬Ȼºߵݼ
ºa£ѭ»·£¡*/
void in()//inº¯ʽ
{
a=0;//¸
while(1)//whileѭ»·
{
P1=table[a];//½«a˹ԚµableµĖµ¸³¸
delay();//1Sѓʱד³̐ɠ a ;//aµĖµ¼Ӓ»
if(a==42)//²⊔aʇ·Ƥ2
a=0;//¸µ
}
}
void delay(uint z)//1msѓʱד³̐¨¹±䑓ʱʱ¼F{
uint x,y;
for(x=z;x
㈤ C语言中%p,%u,%lu都有什么用处
C语言“格式控制字符”:p是pointer(指针缩写);u是unsigned(无符号的)缩写无正负号
1. %p会把值作为一个地址输出。
2. %u对int型和unsigned int型都可以,表示输入输出格式为无符号int型。
3. %lu对unsigned long型,无符号长整数型。
%p举例:int i=0; printf("%p",&i); 执行结果: 0xbffb2d6a 。%p是将&i这个值作为地址输出,并以0x开头16进制类型输出出来。
%u举例: int a=-1; unsigned int b ;
b=a; printf("%d\t %u\t %d\t %u",a,a,b,b); \\ \t是制表符,
执行结果:-1 4294967295 -1 4294967295
㈥ 谁能帮我用c语言写个51单片机p0.0控制p0.7高低变化的程序
#include<reg51.h>
#defineucharunsignedchar
bittemp;
sbitLED1=P0^7;
sbitKEY=P0^0;
voiddelay(unsignedintms)
{
unsignedchari;
while(ms--)
for(i=0;i<123;i++);
}
voiddisp1()
{
LED1=1;
}
voiddisp2()
{
LED1=0;
}
voidmain()
{
KEY=0;
while(1)
{
while(KEY)
段绝局{
delay(10);
if(!KEY)
temp=!temp;
宏兄if(!temp)
disp1();
else
disp2();
握让}
}
}
㈦ 51单片机c语言编程:编写一段程序,P1.0控制LED,P1.1控制LED的亮和灭(P1.7口接按键,按下时LED亮,弹起LED灭
P1.0、P1.1,都余盯凳是控制 LED 的?则空
试试竖旅下面的程序:
#include <reg51.h>
sbit led = P1^0;
sbit key = P1^7;
void main()
{
while(1) led = key;
}
P1.1,不知道怎么用。
㈧ c语言中%p是什么意思
格式控制符“%p”中的p是pointer(指针)的缩写。指针的值是语言实现(编译程序)相关的,但几乎所有实现中,指针的值都是一个表示地址空间中某个存储器单元的整数。printf函数族中对于%p一般以十六进制整数方式输出指针的值,附加前缀0x。
%p是打印地址的, %x是以十六进制形式打印, 完全不同!另外在64位下结果会不一样, 所以打印指针老老实实用%p 。
(8)c语言p控制扩展阅读:
%x同样输出16进制形式,不过%x对应的是int型,也就是说,其输出长度与系统int型占的字节数相等回。如32位编译器,int型占4位字节,那么%x输出的结果最多为16个16进制字符。
而%p输出宽度取决于系统地址总线位数,即16位最多输出4位16进制字符,32位最多输出8位16进制字符,64位最多输出16位16进制字符。
㈨ C语言编程,怎么计算PID控制
Step 7写的PID控制的FC模块。带"_IN"与带"_OUT"的变量,如果前缀是一样的,要求连接同一个变量。
FUNCTION FC1 : VOID
VAR_INPUT
Run:BOOL; //True-运行,False-停止
Auto:BOOL; //True-自动,False-手动
ISW:BOOL; //True-积分有效,False-积分无效
DSW:BOOL; //True-微分有效,False-微分无效
SetMV:REAL; //手动时的开度设定值
SVSW:REAL; //当设定值低于SVSW时,开度为零
PV:REAL; //测量值
SV:REAL; //设定值
DeadBand:REAL; //死区大小
PBW:REAL; //比例带大小
IW:REAL; //积分带大小
DW:REAL; //微分带大小
dErr_IN:REAL; //误差累积
LastPV_IN:REAL; //上一控制周期的测量值
END_VAR
VAR_OUTPUT
MV:REAL; //输出开度
dErr_OUT:REAL; //误差累积
LastPV_OUT:REAL;//上一控制周期的测量值
END_VAR
VAR
Err:REAL; //误差
dErr:REAL; //误差累积
PBH:REAL; //比例带上限
PBL:REAL; //比例带下限
PVC:REAL; //测量值在一个控制周期内的变化率,即测量值变化速率
P:REAL; //比例项
I:REAL; //积分项
D:REAL; //微分项
END_VAR
IF Run=1 THEN
IF Auto=1 THEN
IF SV>=SVSW THEN
Err:=SV-PV;
PBH:=SV+PBW;
PBL:=SV-PBW;
IF PV<PBL THEN
MV:=1;
ELSIF PV>PBH THEN
MV:=0;
ELSE
P:=(PBH-PV)/(PBH-PBL); //计算比例项
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////以下为积分项的计算//////////////////////////////////////////////////////////////
IF ISW=1 THEN
dErr:=dErr_IN;
IF (PV<(SV-DeadBand)) OR (PV>(SV+DeadBand)) THEN
IF (dErr+Err)<(0-IW) THEN
dErr:=0-IW;
ELSIF (dErr+Err)>IW THEN
dErr:=IW;
ELSE
dErr:=dErr+Err;
END_IF;
END_IF;
I:=dErr/IW;
dErr_OUT:=dErr;
ELSE
I:=0;
END_IF;
/////////////////////////////////////////////以上为积分项的计算//////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////以下为微分项的计算//////////////////////////////////////////////////////////////
IF DSW=1 THEN
PVC:=LastPV_IN-PV;
D:=PVC/DW;
LastPV_OUT:=PV;
ELSE
D:=0;
END_IF;
/////////////////////////////////////////////以上为微分项的计算//////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
IF (P+I+D)>1 THEN
MV:=1;
ELSIF (P+I+D)<0 THEN
MV:=0;
ELSE
MV:=P+I+D;
END_IF;
END_IF;
ELSE
MV:=0;
END_IF;
ELSE
MV:=SetMV;
END_IF;
ELSE
MV:=0;
END_IF;
END_FUNCTION
进行整定时先进行P调节,使I和D作用无效,观察温度变化曲线,若变化曲线多次出现波形则应该放大比例(P)参数,若变化曲线非常平缓,则应该缩小比例(P)参数。比例(P)参数设定好后,设定积分(I)参数,积分(I)正好与P参数相反,曲线平缓则需要放大积分(I),出现多次波形则需要缩小积分(I)。比例(P)和积分(I)都设定好以后设定微分(D)参数,微分(D)参数与比例(P)参数的设定方法是一样的。
当初写这段程序的就是为了使用调功器来控制炉子的温度的,已经在我单位的调功器上运行成功了,还有就是我单位的调功器没有使用微分(D),只是用了比例(P)和积分(I)。
㈩ 单片机c语言如何控制第五只数码管亮显示p
共阳极数枯世蠢码管码段返虚(带小数点):{0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10,0x08,0x03,0x66,0x21,0x06,0x0e,0x0c,0x09,0x11}分别代表
0 , 1, 2, 3, 4,没陪 5, 6, 7, 8, 9, A, B, C, D, E, F, P, H, Y
共阴极数码管码段(带小数点):
{0xbf ,0x86,0xdb,0xcf, 0xeb,0xed,0xfd, 0x87, 0xff, 0xef, 0xf7,0xfc, 0x99,0xde,0xf9, 0xf1,0xf3,0xf6,0xee}分别表示
0 , 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F, P, H, Y
采用动态扫描