跑马灯实验
/* 实验目的:初步了解单片机I/O口的工作原理,进一步掌握51单片机的汇编指令。
* 实验内容:用汇编指令对单片机I/O口进行编程,控制8个发光二极管的流水亮灭。
*/
/* 程序详细功能介绍:
*做单一灯的左移右移,八个发光二极管L0-L7分别接在单片机的P0.0-P0.7接口上,
*输出“0”时,发光二极管亮,开始时P0.0→P0.1→P0.2→P0.3→┅→P0.7→P0.6→┅→P0.0亮,重复循环。
*/
ORG 0000H
LJMP START
ORG 0030H
START:
MOV R2,#8 ;左移次数
MOV A,#0FEH ;A的初始值,即 P0.0的L0 点亮
SETB C
LOOP: MOV P0,A
LCALL DELAY
RLC A ;左移流水灯(带进位的左移),即亮点向P0口的高位移动
DJNZ R2,LOOP
MOV R2,#8 ;右移次数
LOOP1: RRC A ;右移流水灯
MOV P0,A
LCALL DELAY
DJNZ R2,LOOP1
LJMP START
DELAY: MOV R5,#10 ;延时子程序,改变R5,R6,R7 的值,可以改变延时的时间,从而改变流水灯移动速度
D1: MOV R6,#20
D2: MOV R7,#248
DJNZ R7,$
DJNZ R6,D2
DJNZ R5,D1
RET
END
⑵ 编写简单的单片机c语言程序 1、指定数组找最大值 2、排序
#include<stdio.h>
#defineNR10//数组元素个数
/*从主函数开始*/
intmain(intargc,char**argv)
{
intar[NR];
inti;
fprintf(stdout,"请输入%d个整数: ",NR);
/*获取并检查用户输入*/
while(1)
{
/*循环获取NR个数据*/
for(i=0;i<NR;i++)
{
if(fscanf(stdin,"%d",&ar[i])!=1)
{
fprintf(stdout,"输入错误!请重新输入: ");
while(getchar()!=' ');//丢弃多余非法字符
break;//打破内层for循环
}
}
/*检查是否获取到NR个数据*/
if(i!=NR)
{
continue;
}
else
{
break;
}
}
/*查找最大值和最小值*/
intmax,min;
max=ar[0];//假定第一个数为最大值
min=ar[0];//同时假定也第一个数为最大值
/*从第二个数开始比较查找最值*/
for(i=1;i<NR;i++)
{
if(ar[i]>max)//最大值
{
max=ar[i];
}
if(ar[i]<min)//最小值,不能使用elseif,否则会跳过比较
{
min=ar[i];
}
}
fprintf(stdout,"最大值为:%d最小值为:%d ",max,min);
/*接下来:查找第二大值*/
intsecond;
/*先获取前两个数的第一大和第二大值*/
ar[0]>ar[1]?(max=ar[0],second=ar[1]):
(max=ar[1],second=ar[0]);
/*从第2个数开始比较查找*/
for(i=2;i<NR;i++)
{
if(ar[i]>max)//查找最大值:目的是为了比较第二大值
{
second=max;//先把最大值保存给第二大值
max=ar[i];
}
elseif(second<ar[i])//比最大值小的数再看看是否大于第二大值
{
second=ar[i];
}
}
fprintf(stdout,"第二大值为:%d ",second);
return0;
}
(2)最简单的单片机程序扩展阅读
一、c语言程序求数组内所有数的和:
1、通过索引的方式就可以访问到数组内部的元素,索引是从0到数组长度-1。
2、数组点Lenth就是数组的长度。
二、c语言程序冒泡排序:
1、比较相邻的两个元素的大小,如果第一个比第二个大就互换一下。
2、然后每一对都做如上操作,如此一来最后一个元素肯定是最大的数了。
3、除了最后一个元素,重复以上步骤。然后倒数第二个就是次大的值了
4、一次按照这个逻辑直到没有任何数字可以比较了。
⑶ 求一个简单的单片机时钟程序
#include<reg51.h>
#defineucharunsignedchar
ucharcodeledtab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//0-9
unsignedcharsec=0,min=0,hour=0,scanled;
unsignedcharkey,time;
unsignedchardisdat[6];
sbitK=P1^0;
voiddischg()
{
disdat[0]=sec%10;
disdat[1]=sec/10;
disdat[2]=min%10;
disdat[3]=min/10;
disdat[4]=hour%10;
disdat[5]=hour/10;
}
voidt0isr()interrupt1 //秒计时
{
TR0=0;
TH0=0x3c;
TL0=0xb0;
TR0=1;
time++;
if(time==20)
{
time=0;
sec++;
if(sec>59)
{
sec=0;
min++;
if(min>59)
{
min=0;
hour++;
if(hour>23)hour=0;
}
}
}
dischg();
}
voidt1isr()interrupt3 //显示
{
TH1=0xec;
TL1=0x78;
switch(scanled)
{
case0:
P2=0x01;
P0=~ledtab[disdat[5]];
break;
case1:
P2=0x02;
P0=~ledtab[disdat[4]]&0x7f;
break;
case2:
P2=0x04;
P0=~ledtab[disdat[3]];
break;
case3:
P2=0x08;
P0=~ledtab[disdat[2]]&0x7f;
break;
case4:
P2=0x10;
P0=~ledtab[disdat[1]];
break;
case5:
P2=0x20;
P0=~ledtab[disdat[0]];
break;
default:break;
}
scanled++;
scanled%=6;
}
main()
{
TMOD=0x11;
TH0=0x3c;
TL0=0xb0;
TH1=0xec;
TL1=0x78;
EA=1;
TR1=1;
ET0=1;
ET1=1;
sec=0;
min=0;
hour=0;
scanled=0;
time=0;
key=0;
dischg();
while(1)
{
if(K==0)
{
while(K==0);
key++;
key%=2;
}
switch(key)
{
case0:
TR0=1;
break;
case1:
TR0=0;
break;
}
}
}
⑷ 51单片机的一个简单程序
51单片机的一个简单程序如下:
ORG 0000H
LJMP MAIN
ORG 0030H
MAIN:
MOV A,P0
ANL A,#1EH
CJNE A,#02H,MAIN1
SETB P1.1
CLR P1.2
CLR P1.8
SJMP MAIN
MAIN1:
CJNE A,#04H,MAIN2
CLR P1.1
SETB P1.2
CLR P1.8
SJMP MAIN
MAIN2:
CJNE A,#1EH,MAIN3
CLR P1.1
CLR P1.2
SETB P1.8
SJMP MAIN
MAIN3:
CLR P1.1
CLR P1.2
CLR P1.8
LJMP MAIN
END