百度
360搜索
搜狗搜索

单片机c语言应用100例,单片机C语言程序设计实训100例:基于PIC+Proteus仿真的目录详细介绍

本文目录一览: 单片机C语言应用100例的内容简介

《单片机C语言应用100例》在编写时力求通俗、易懂,硬件原理讲解以“有用、够用”为原则,内容讲解以“紧密结合实践”为特色。因此,《单片机C语言应用100例》特别适合单片机零起点的初学者使用,可作为高等院校控制类专业学生、电子爱好者及各类工程技术人员的参考用书,也可作为高职高专及中专院校的单片机课程教学用书。

单片机C语言程序设计实训100例的内容简介

基于AVR Studio+WinAVR(GCC)组合环境和Proteus硬件仿真平台,精心安排了100个AVR单片机C程序设计案例。全书提供了所有寨例完整的C语言源程序,各案例设计了难易适中的实训目标。基础设计类案例涵盏AVR单片机最基本的端口编程、定时/计数器应用、中断程序设计、A/D转换、比较器程序设计、EEPROM、Flash、USART及看门狗程序设计;硬件应用类案例涉及单片机存储器扩展、接口扩展、译码、编码、驱动、光电、机电、传感器、IsC/TWl及SPl接口器件、MMC、红外等器件;综合设计类案例涉及消费类电子产品、仪器仪表及智能控制设备相关技术,相关案例涉及485及RTL8019的应用。本书适合用作大专院校学生学匀实践AVR单片机C语言程序设计技术的参考书,也可用作电子工程技术人员、单片机技术爱好者的学习参考书。

o你好,能给我发一份《单片机C语言程序设计实训100例

【程序80】
题目:海滩上有一堆桃子,五只猴子来分。第一只猴子把这堆桃子凭据分为五份,多了一个,这只猴子把多的一个扔入海中,拿走了一份。第二只猴子把剩下的桃子又平均分成五份,又多了一个,它同样把多的一个扔入海中,拿走了一份,第三、第四、第五只猴子都是这样做的,问海滩上原来最少有多少个桃子?
1.程序分析:
2.程序源代码:
main()
{int i,m,j,k,count;
for(i=4;i<10000;i+=4)
{ count=0;
m=i;
for(k=0;k<5;k++)
{
 j=i/4*5+1;
 i=j;
 if(j%4==0)
  count++;
 else
  break;
}
 i=m;
 if(count==4)
 {printf("%d\n",count);
  break;}
}
}
【程序81】
题目:809*??=800*??+9*??+1 其中??代表的两位数,8*??的结果为两位数,9*??的结果为3位数。求??代表的两位数,及809*??后的结果。
1.程序分析:
2.程序源代码:
output(long b,long i)
{ printf("\n%ld/%ld=809*%ld+%ld",b,i,i,b%i);
}
main()
{long int a,b,i;
a=809;
for(i=10;i<100;i++)
{b=i*a+1;
if(b>=1000&&b<=10000&&8*i<100&&9*i>=100)
output(b,i); }
}
==============================================================
【程序82】
题目:八进制转换为十进制
1.程序分析:           
2.程序源代码:
main()
{ char *p,s[6];int n;
p=s;
gets(p);
n=0;
while(*(p)!='\0')
{n=n*8+*p-'0';
p++;}
printf("%d",n);
}
==============================================================
【程序83】
题目:求0—7所能组成的奇数个数。
1.程序分析:
2.程序源代码:
main()
{
long sum=4,s=4;
int j;
for(j=2;j<=8;j++)/*j is place of number*/ { printf("\n%ld",sum);
if(j<=2)
s*=7;
else
s*=8;
sum+=s;}
printf("\nsum=%ld",sum);
}
==============================================================
【程序84】
题目:一个偶数总能表示为两个素数之和。
1.程序分析:
2.程序源代码:
#i nclude "stdio.h"
#i nclude "math.h"
main()
{ int a,b,c,d;
scanf("%d",&a);
for(b=3;b<=a/2;b+=2)
{ for(c=2;c<=sqrt(b);c++)
if(b%c==0) break;
if(c>sqrt(b))
d=a-b;
else
break;
for(c=2;c<=sqrt(d);c++)
if(d%c==0) break;
if(c>sqrt(d))
printf("%d=%d+%d\n",a,b,d);
}
}
==============================================================
【程序85】
题目:判断一个素数能被几个9整除
1.程序分析:
2.程序源代码:
main()
{ long int m9=9,sum=9;
int zi,n1=1,c9=1;
scanf("%d",&zi);
while(n1!=0)
{ if(!(sum%zi))
n1=0;
else
{m9=m9*10;
sum=sum+m9;
c9++;
}
}
printf("%ld,can be divided by %d \"9\"",sum,c9);
}
==============================================================
【程序86】
题目:两个字符串连接程序
1.程序分析:
2.程序源代码:
#i nclude "stdio.h"
main()
{char a[]="acegikm";
char b[]="bdfhjlnpq";
char c[80],*p;
int i=0,j=0,k=0;
while(a[i]!='\0'&&b[j]!='\0')
{if (a[i] { c[k]=a[i];i++;}
else
c[k]=b[j++];
k++;
}
c[k]='\0';
if(a[i]=='\0')
p=b+j;
else
p=a+i;
strcat(c,p);
puts(c);
}
==============================================================
【程序87】
题目:回答结果(结构体变量传递)
1.程序分析:     
2.程序源代码:
#i nclude "stdio.h"
struct student
{ int x;
char c;
} a;
main()
{a.x=3;
a.c='a';
f(a);
printf("%d,%c",a.x,a.c);
}
f(struct student b)
{
b.x=20;
b.c='y';
}
==============================================================
【程序88】
题目:读取7个数(1—50)的整数值,每读取一个值,程序打印出该值个数的*。
1.程序分析:
2.程序源代码:
main()
{int i,a,n=1;
while(n<=7)
{ do {
   scanf("%d",&a);
   }while(a<1||a>50);
for(i=1;i<=a;i++)
 printf("*");
printf("\n");
n++;}
getch();
}
==============================================================
【程序89】
题目:某个公司采用公用电话传递数据,数据是四位的整数,在传递过程中是加密的,加密规则如下:每位数字都加上5,然后用和除以10的余数代替该数字,再将第一位和第四位交换,第二位和第三位交换。
1.程序分析:
2.程序源代码:
main()
{int a,i,aa[4],t;
scanf("%d",&a);
aa[0]=a%10;
aa[1]=a%100/10;
aa[2]=a%1000/100;
aa[3]=a/1000;
for(i=0;i<=3;i++)
 {aa[i]+=5;
 aa[i]%=10;
 }
for(i=0;i<=3/2;i++)
 {t=aa[i];
 aa[i]=aa[3-i];
 aa[3-i]=t;
 }
for(i=3;i>=0;i--)
printf("%d",aa[i]);
}
==============================================================
【程序90】
题目:专升本一题,读结果。
1.程序分析:
2.程序源代码:
#i nclude "stdio.h"
#define M 5
main()
{int a[M]={1,2,3,4,5};
int i,j,t;
i=0;j=M-1;
while(i {t=*(a+i);
*(a+i)=*(a+j);
*(a+j)=t;
i++;j--;
}
for(i=0;i printf("%d",*(a+i));
}
【程序91】
题目:时间函数举例1
1.程序分析:
2.程序源代码:
#i nclude "stdio.h"
#i nclude "time.h"
void main()
{ time_t lt; /*define a longint time varible*/ lt=time(NULL);/*system time and date*/ printf(ctime(<)); /*english format output*/ printf(asctime(localtime(<)));/*tranfer to tm*/ printf(asctime(gmtime(<))); /*tranfer to Greenwich time*/ }
==============================================================
【程序92】
题目:时间函数举例2
1.程序分析:           
2.程序源代码:
/*calculate time*/ #i nclude "time.h"
#i nclude "stdio.h"
main()
{ time_t start,end;
int i;
start=time(NULL);
for(i=0;i<3000;i++)
{ printf("\1\1\1\1\1\1\1\1\1\1\n");}
end=time(NULL);
printf("\1: The different is %6.3f\n",difftime(end,start));
}
==============================================================
【程序93】
题目:时间函数举例3
1.程序分析:
2.程序源代码:
/*calculate time*/ #i nclude "time.h"
#i nclude "stdio.h"
main()
{ clock_t start,end;
int i;
double var;
start=clock();
for(i=0;i<10000;i++)
{ printf("\1\1\1\1\1\1\1\1\1\1\n");}
end=clock();
printf("\1: The different is %6.3f\n",(double)(end-start));
}
==============================================================
【程序94】
题目:时间函数举例4,一个猜数游戏,判断一个人反应快慢。
1.程序分析:
2.程序源代码:
#i nclude "time.h"
#i nclude "stdlib.h"
#i nclude "stdio.h"
main()
{char c;
clock_t start,end;
time_t a,b;
double var;
int i,guess;
srand(time(NULL));
printf("do you want to play it.('y' or 'n') \n");
loop:
while((c=getchar())=='y')
{
i=rand()%100;
printf("\nplease input number you guess:\n");
start=clock();
a=time(NULL);
scanf("%d",&guess);
while(guess!=i)
{if(guess>i)
{printf("please input a little smaller.\n");
scanf("%d",&guess);}
else
{printf("please input a little bigger.\n");
scanf("%d",&guess);}
}
end=clock();
b=time(NULL);
printf("\1: It took you %6.3f seconds\n",var=(double)(end-start)/18.2);
printf("\1: it took you %6.3f seconds\n\n",difftime(b,a));
if(var<15)
printf("\1\1 You are very clever! \1\1\n\n");
else if(var<25)
printf("\1\1 you are normal! \1\1\n\n");
else
printf("\1\1 you are stupid! \1\1\n\n");
printf("\1\1 Congradulations \1\1\n\n");
printf("The number you guess is %d",i);
}
printf("\ndo you want to try it again?(\"yy\".or.\"n\")\n");
if((c=getch())=='y')
goto loop;
}
==============================================================
【程序95】
题目:家庭财务管理小程序
1.程序分析:
2.程序源代码:
/*money management system*/ #i nclude "stdio.h"
#i nclude "dos.h"
main()
{
FILE *fp;
struct date d;
float sum,chm=0.0;
int len,i,j=0;
int c;
char ch[4]="",ch1[16]="",chtime[12]="",chshop[16],chmoney[8];
pp: clrscr();
sum=0.0;
gotoxy(1,1);printf("|---------------------------------------------------------------------------|");
gotoxy(1,2);printf("| money management system(C1.0) 2000.03 |");
gotoxy(1,3);printf("|---------------------------------------------------------------------------|");
gotoxy(1,4);printf("| -- money records -- | -- today cost list -- |");
gotoxy(1,5);printf("| ------------------------ |-------------------------------------|");
gotoxy(1,6);printf("| date: -------------- | |");
gotoxy(1,7);printf("| | | | |");
gotoxy(1,8);printf("| -------------- | |");
gotoxy(1,9);printf("| thgs: ------------------ | |");
gotoxy(1,10);printf("| | | | |");
gotoxy(1,11);printf("| ------------------ | |");
gotoxy(1,12);printf("| cost: ---------- | |");
gotoxy(1,13);printf("| | | | |");
gotoxy(1,14);printf("| ---------- | |");
gotoxy(1,15);printf("| | |");
gotoxy(1,16);printf("| | |");
gotoxy(1,17);printf("| | |");
gotoxy(1,18);printf("| | |");
gotoxy(1,19);printf("| | |");
gotoxy(1,20);printf("| | |");
gotoxy(1,21);printf("| | |");
gotoxy(1,22);printf("| | |");
gotoxy(1,23);printf("|---------------------------------------------------------------------------|");
i=0;
getdate(&d);
sprintf(chtime,"%4d.%02d.%02d",d.da_year,d.da_mon,d.da_day);
for(;;)
{
gotoxy(3,24);printf(" Tab __browse cost list Esc __quit");
gotoxy(13,10);printf(" ");
gotoxy(13,13);printf(" ");
gotoxy(13,7);printf("%s",chtime);
j=18;
ch[0]=getch();
if(ch[0]==27)
break;
strcpy(chshop,"");
strcpy(chmoney,"");
if(ch[0]==9)
{
mm:i=0;
fp=fopen("home.dat","r+");
gotoxy(3,24);printf(" ");
gotoxy(6,4);printf(" list records ");
gotoxy(1,5);printf("|-------------------------------------|");
gotoxy(41,4);printf(" ");
gotoxy(41,5);printf(" |");
while(fscanf(fp,"%10s%14s%f\n",chtime,chshop,&chm)!=EOF)
{ if(i==36)
{ getch();
i=0;}
if ((i%36)<17)
{ gotoxy(4,6+i);
printf(" ");
gotoxy(4,6+i);}
else
if((i%36)>16)
{ gotoxy(41,4+i-17);
printf(" ");
gotoxy(42,4+i-17);}
i++;
sum=sum+chm;
printf("%10s %-14s %6.1f\n",chtime,chshop,chm);}
gotoxy(1,23);printf("|---------------------------------------------------------------------------|");
gotoxy(1,24);printf("| |");
gotoxy(1,25);printf("|---------------------------------------------------------------------------|");
gotoxy(10,24);printf("total is %8.1f$",sum);
fclose(fp);
gotoxy(49,24);printf("press any key to.....");getch();goto pp;
}
else
{
while(ch[0]!='\r')
{ if(j<10)
{ strncat(chtime,ch,1);
j++;}
if(ch[0]==8)
{
len=strlen(chtime)-1;
if(j>15)
{ len=len+1; j=11;}
strcpy(ch1,"");
j=j-2;
strncat(ch1,chtime,len);
strcpy(chtime,"");
strncat(chtime,ch1,len-1);
gotoxy(13,7);printf(" ");}
gotoxy(13,7);printf("%s",chtime);ch[0]=getch();
if(ch[0]==9)
goto mm;
if(ch[0]==27)
exit(1);
}
gotoxy(3,24);printf(" ");
gotoxy(13,10);
j=0;
ch[0]=getch();
while(ch[0]!='\r')
{ if (j<14)
{ strncat(chshop,ch,1);
j++;}
if(ch[0]==8)
{ len=strlen(chshop)-1;
strcpy(ch1,"");
j=j-2;
strncat(ch1,chshop,len);
strcpy(chshop,"");
strncat(chshop,ch1,len-1);
gotoxy(13,10);printf(" ");}
gotoxy(13,10);printf("%s",chshop);ch[0]=getch();}
gotoxy(13,13);
j=0;
ch[0]=getch();
while(ch[0]!='\r')
{ if (j<6)
{ strncat(chmoney,ch,1);
j++;}
if(ch[0]==8)
{ len=strlen(chmoney)-1;
strcpy(ch1,"");
j=j-2;
strncat(ch1,chmoney,len);
strcpy(chmoney,"");
strncat(chmoney,ch1,len-1);
gotoxy(13,13);printf(" ");}
gotoxy(13,13);printf("%s",chmoney);ch[0]=getch();}
if((strlen(chshop)==0)||(strlen(chmoney)==0))
continue;
if((fp=fopen("home.dat","a+"))!=NULL);
fprintf(fp,"%10s%14s%6s",chtime,chshop,chmoney);
fputc('\n',fp);
fclose(fp);
i++;
gotoxy(41,5+i);
printf("%10s %-14s %-6s",chtime,chshop,chmoney);
}}}
==============================================================
【程序96】
题目:计算字符串中子串出现的次数
1.程序分析:
2.程序源代码:
#i nclude "string.h"
#i nclude "stdio.h"
main()
{ char str1[20],str2[20],*p1,*p2;
int sum=0;
printf("please input two strings\n");
scanf("%s%s",str1,str2);
p1=str1;p2=str2;
while(*p1!='\0')
{
if(*p1==*p2)
{while(*p1==*p2&&*p2!='\0')
{p1++;
p2++;}
}
else
p1++;
if(*p2=='\0')
sum++;
p2=str2;
}
printf("%d",sum);
getch();}
==============================================================
【程序97】
题目:从键盘输入一些字符,逐个把它们送到磁盘上去,直到输入一个#为止。
1.程序分析:     
2.程序源代码:
#i nclude "stdio.h"
main()
{ FILE *fp;
char ch,filename[10];
scanf("%s",filename);
if((fp=fopen(filename,"w"))==NULL)
{printf("cannot open file\n");
exit(0);}
ch=getchar();
ch=getchar();
while(ch!='#')
{fputc(ch,fp);putchar(ch);
ch=getchar();
}
fclose(fp);
}
==============================================================
【程序98】
题目:从键盘输入一个字符串,将小写字母全部转换成大写字母,然后输出到一个磁盘文件“test”中保存。输入的字符串以!结束。
1.程序分析:
2.程序源代码:
#i nclude "stdio.h"
main()
{FILE *fp;
char str[100],filename[10];
int i=0;
if((fp=fopen("test","w"))==NULL)
{ printf("cannot open the file\n");
exit(0);}
printf("please input a string:\n");
gets(str);
while(str[i]!='!')
{ if(str[i]>='a'&&str[i]<='z')
str[i]=str[i]-32;
fputc(str[i],fp);
i++;}
fclose(fp);
fp=fopen("test","r");
fgets(str,strlen(str)+1,fp);
printf("%s\n",str);
fclose(fp);
}
==============================================================
【程序99】
题目:有两个磁盘文件A和B,各存放一行字母,要求把这两个文件中的信息合并(按字母顺序排列),输出到一个新文件C中。
1.程序分析:
2.程序源代码:
#i nclude "stdio.h"
main()
{ FILE *fp;
int i,j,n,ni;
char c[160],t,ch;
if((fp=fopen("A","r"))==NULL)
{printf("file A cannot be opened\n");
exit(0);}
printf("\n A contents are :\n");
for(i=0;(ch=fgetc(fp))!=EOF;i++)
{c[i]=ch;
putchar(c[i]);
}
fclose(fp);
ni=i;
if((fp=fopen("B","r"))==NULL)
{printf("file B cannot be opened\n");
exit(0);}
printf("\n B contents are :\n");
for(i=0;(ch=fgetc(fp))!=EOF;i++)
{c[i]=ch;
putchar(c[i]);
}
fclose(fp);
n=i;
for(i=0;i
<n;i++)
for(j=i+1;j
<n;j++)
if(c[i]>c[j])

{t=c[i];c[i]=c[j];c[j]=t;}

printf("\n C file is:\n");

fp=fopen("C","w");

for(i=0;i
<n;i++)
{ putc(c[i],fp);

putchar(c[i]);

}

fclose(fp);

}

==============================================================

【程序100】

题目:有五个学生,每个学生有3门课的成绩,从键盘输入以上数据(包括学生号,姓名,三门课成绩),计算出平均成绩,况原有的数据和计算出的平均分数存放在磁盘文件"stud"中。

1.程序分析:

2.程序源代码:

#i nclude "stdio.h"

struct student

{ char num[6];

char name[8];

int score[3];

float avr;

} stu[5];

main()

{int i,j,sum

发给我一份源代码特别是综合部分的

已发

可以给我也发一个吗?52510712@qq.com

有C的程序要么?
</n;i++)
</n;j++)
</n;i++)

阅读更多 >>>  c语言编程网课,C语言基础知识总结大全

单片机c语言编程100个实例

51单片机C语言编程实例 基础知识:51单片机编程基础 单片机的外部结构: 1. DIP40双列直插; 2. P0,P1,P2,P3四个8位准双向I/O引脚;(作为I/O输入时,要先输出高电平) 3. 电源VCC(PIN40)和地线GND(PIN20); 4. 高电平复位RESET(PIN9);(10uF电容接VCC与RESET,即可实现上电复位) 5. 内置振荡电路,外部只要接晶体至X1(PIN18)和X0(PIN19);(频率为主频的12倍) 6. 程序配置EA(PIN31)接高电平VCC;(运行单片机内部ROM中的程序) 7. P3支持第二功能:RXD、TXD、INT0、INT1、T0、T1 单片机内部I/O部件:(所为学习单片机,实际上就是编程控制以下I/O部件,完成指定任务) 1. 四个8位通用I/O端口,对应引脚P0、P1、P2和P3; 2. 两个16位定时计数器;(TMOD,TCON,TL0,TH0,TL1,TH1) 3. 一个串行通信接口;(SCON,SBUF) 4. 一个中断控制器;(IE,IP) 针对AT89C52单片机,头文件AT89x52.h给出了SFR特殊功能寄存器所有端口的定义。 C语言编程基础: 1. 十六进制表示字节0x5a:二进制为01011010B;0x6E为01101110。 2. 如果将一个16位二进数赋给一个8位的字节变量,则自动截断为低8位,而丢掉高8位。 3. ++var表示对变量var先增一;var—表示对变量后减一。 4. x |= 0x0f;表示为 x = x | 0x0f; 5. TMOD = ( TMOD & 0xf0 ) | 0x05;表示给变量TMOD的低四位赋值0x5,而不改变TMOD的高四位。 6. While( 1 ); 表示无限执行该语句,即死循环。语句后的分号表示空循环体,也就是{;} 在某引脚输出高电平的编程方法:(比如P1.3(PIN4)引脚) 代码 1. #include

//该头文档中有单片机内部资源的符号化定义,其中包含P1.3 2. void main( void ) //void 表示没有输入参数,也没有函数返值,这入单片机运行的复位入口 3. { 4. P1_3 = 1; //给P1_3赋值1,引脚P1.3就能输出高电平VCC 5. While( 1 ); //死循环,相当 LOOP: goto LOOP; 6. } 注意:P0的每个引脚要输出高电平时,必须外接上拉电阻(如4K7)至VCC电源。 在某引脚输出低电平的编程方法:(比如P2.7引脚) 代码 1. #include

//该头文档中有单片机内部资源的符号化定义,其中包含P2.7 2. void main( void ) //void 表示没有输入参数,也没有函数返值,这入单片机运行的复位入口 3. { 4. P2_7 = 0; //给P2_7赋值0,引脚P2.7就能输出低电平GND 5. While( 1 ); //死循环,相当 LOOP: goto LOOP; 6. } 在某引脚输出方波编程方法:(比如P3.1引脚) 代码 1. #include

//该头文档中有单片机内部资源的符号化定义,其中包含P3.1 2. void main( void ) //void 表示没有输入参数,也没有函数返值,这入单片机运行的复位入口 3. { 4. While( 1 ) //非零表示真,如果为真则执行下面循环体的语句 5. { 6. P3_1 = 1; //给P3_1赋值1,引脚P3.1就能输出高电平VCC 7. P3_1 = 0; //给P3_1赋值0,引脚P3.1就能输出低电平GND 8. } //由于一直为真,所以不断输出高、低、高、低……,从而形成方波 9. } 将某引脚的输入电平取反后,从另一个引脚输出:( 比如 P0.4 = NOT( P1.1) ) 代码 1. #include

//该头文档中有单片机内部资源的符号化定义,其中包含P0.4和P1.1 2. void main( void ) //void 表示没有输入参数,也没有函数返值,这入单片机运行的复位入口 3. { 4. P1_1 = 1; //初始化。P1.1作为输入,必须输出高电平 5. While( 1 ) //非零表示真,如果为真则执行下面循环体的语句 6. { 7. if( P1_1 == 1 ) //读取P1.1,就是认为P1.1为输入,如果P1.1输入高电平VCC 8. { P0_4 = 0; } //给P0_4赋值0,引脚P0.4就能输出低电平GND 2 51单片机C语言编程实例 9. else //否则P1.1输入为低电平GND 10. //{ P0_4 = 0; } //给P0_4赋值0,引脚P0.4就能输出低电平GND 11. { P0_4 = 1; } //给P0_4赋值1,引脚P0.4就能输出高电平VCC 12. } //由于一直为真,所以不断根据P1.1的输入情况,改变P0.4的输出电平 13. } 将某端口8个引脚输入电平,低四位取反后,从另一个端口8个引脚输出:( 比如 P2 = NOT( P3 ) ) 代码 1. #include

//该头文档中有单片机内部资源的符号化定义,其中包含P2和P3 2. void main( void ) //void 表示没有输入参数,也没有函数返值,这入单片机运行的复位入口 3. { 4. P3 = 0xff; //初始化。P3作为输入,必须输出高电平,同时给P3口的8个引脚输出高电平 5. While( 1 ) //非零表示真,如果为真则执行下面循环体的语句 6. { //取反的方法是异或1,而不取反的方法则是异或0 7. P2 = P3^0x0f //读取P3,就是认为P3为输入,低四位异或者1,即取反,然后输出 8. } //由于一直为真,所以不断将P3取反输出到P2 9. } 注意:一个字节的8位D7、D6至D0,分别输出到P3.7、P3.6至P3.0,比如P3=0x0f,则P3.7、P3.6、P3.5、P3.4四个引脚都输出低电平,而P3.3、P3.2、P3.1、P3.0四个引脚都输出高电平。同样,输入一个端口P2,即是将P2.7、P2.6至P2.0,读入到一个字节的8位D7、D6至D0。 第一节:单数码管按键显示 单片机最小系统的硬件原理接线图: 1. 接电源:VCC(PIN40)、GND(PIN20)。加接退耦电容0.1uF 2. 接晶体:X1(PIN18)、X2(PIN19)。注意标出晶体频率(选用12MHz),还有辅助电容30pF 3. 接复位:RES(PIN9)。接上电复位电路,以及手动复位电路,分析复位工作原理 4. 接配置:EA(PIN31)。说明原因。 发光二极的控制:单片机I/O输出 将一发光二极管LED的正极(阳极)接P1.1,LED的负极(阴极)接地GND。只要P1.1输出高电平VCC,LED就正向导通(导通时LED上的压降大于1V),有电流流过LED,至发LED发亮。实际上由于P1.1高电平输出电阻为10K,起到输出限流的作用,所以流过LED的电流小于(5V-1V)/10K = 0.4mA。只要P1.1输出低电平GND,实际小于0.3V,LED就不能导通,结果LED不亮。 开关双键的输入:输入先输出高 一个按键KEY_ON接在P1.6与GND之间,另一个按键KEY_OFF接P1.7与GND之间,按KEY_ON后LED亮,按KEY_OFF后LED灭。同时按下LED半亮,LED保持后松开键的状态,即ON亮OFF灭。 代码 1. #include

2. #define LED P1^1 //用符号LED代替P1_1 3. #define KEY_ON P1^6 //用符号KEY_ON代替P1_6 4. #define KEY_OFF P1^7 //用符号KEY_OFF代替P1_7 5. void main( void ) //单片机复位后的执行入口,void表示空,无输入参数,无返回值 6. { 7. KEY_ON = 1; //作为输入,首先输出高,接下KEY_ON,P1.6则接地为0,否则输入为1 8. KEY_OFF = 1; //作为输入,首先输出高,接下KEY_OFF,P1.7则接地为0,否则输入为1 9. While( 1 ) //永远为真,所以永远循环执行如下括号内所有语句 10. { 11. if( KEY_ON==0 ) LED=1; //是KEY_ON接下,所示P1.1输出高,LED亮 12. if( KEY_OFF==0 ) LED=0; //是KEY_OFF接下,所示P1.1输出低,LED灭 13. } //松开键后,都不给LED赋值,所以LED保持最后按键状态。 14. //同时按下时,LED不断亮灭,各占一半时间,交替频率很快,由于人眼惯性,看上去为半亮态 15. } 数码管的接法和驱动原理 一支七段数码管实际由8个发光二极管构成,其中7个组形构成数字8的七段笔画,所以称为七段数码管,而余下的1个发光二极管作为小数点。作为习惯,分别给8个发光二极管标上记号:a,b,c,d,e,f,g,h。对应8的顶上一画,按顺时针方向排,中间一画为g,小数点为h。 我们通常又将各二极与一个字节的8位对应,a(D0),b(D1),c(D2),d(D3),e(D4),f(D5),g(D6),h(D7),相应8个发光二极管正好与单片机一个端口Pn的8个引脚连接,这样单片机就可以通过引脚输出高低电平控制8个发光二极的亮与灭,从而显示各种数字和符号;对应字节,引脚接法为:a(Pn.0),b(Pn.1),c(Pn.2),d(Pn.3),e(Pn.4),f(Pn.5),g(Pn.6),h(Pn.7)。 如果将8个发光二极管的负极(阴极)内接在一起,作为数码管的一个引脚,这种数码管则被称为共阴数码管,共同的引脚则称为共阴极,8个正极则为段极。否则,如果是将正极(阳极)内接在一起引出的,则称为共阳数码管,共同的引脚则称为共阳极,8个负极则为段极。 以单支共阴数码管为例,可将段极接到某端口Pn,共阴极接GND,则可编写出对应十六进制码的七段码表字节数据

阅读更多 >>>  描述算法常用工具

单片机C语言程序设计实训100例:基于PIC+Proteus仿真的目录

第1章PIC单片机C语言程序设计概述1.1 PIC单片机简介1.2 MPLAB+C语言程序开发环境安装及应用1.3 PICC/PICC18/MCC18程序设计基础1.4 PIC单片机内存结构1.5 PIC单片机配置位1.6 基本的I/O端口编程1.7 中断服务程序设计1.8 PIC单片机外设相关寄存器1.9 C语言程序设计在PIC单片机应用系统开发中的优势第2章PROTEUS操作基础2.1 PROTEUS操作界面简介2.2 仿真电路原理图设计2.3 元件选择2.4 仿真运行2.5 MPLAB IDE与PROTEUS的联合调试2.6 PROTEUS在PIC单片机应用系统开发中的优势第3章 基础程序设计3.1 闪烁的LED3.2 用双重循环控制LED左右来回滚动显示3.3 多花样流水灯3.4 LED模拟交通灯3.5 单只数码管循环显示0~93.6 4只数码管滚动显示单个数字3.7 8只数码管扫描显示多个不同字符3.8 K1~K5控制两位数码管的开关、加减与清零操作3.9 数码管显示4×4键盘矩阵按键3.10 数码管显示拨码开关编码3.11 继电器及双向可控硅控制照明设备3.12 INT中断计数3.13 RB端口电平变化中断控制两位数码管开关与加减显示3.14 TIMER0控制单只LED闪烁3.15 TIMER0控制流水灯3.16 TIMER0控制数码管扫描显示3.17 TIMER1控制交通指示灯3.18 TIMER1与TIMER2控制十字路口秒计时显示屏3.19 用工作于同步计数方式的TMR1实现按键或脉冲计数3.20 用定时器设计的门铃3.21 报警器与旋转灯3.22 用工作于捕获方式的CCP1设计的频率计3.23 用工作于比较模式的CCP1控制音阶播放3.24 CCP1 PWM模式应用3.25 模拟比较器测试3.26 数码管显示两路A/D转换结果3.27 EEPROM读写与数码管显示3.28 睡眠模式及看门狗应用测试3.29 单片机与PC双向串口通信仿真3.30 PIC单片机并行从动端口PSP读写测试第4章 硬件应用4.1 74HC138与74HC154译码器应用4.2 74HC595串入并出芯片应用4.3 用74HC164驱动多只数码管显示4.4 数码管BCD解码驱动器7447与4511应用4.5 8×8LED点阵屏显示数字4.6 8位数码管段位复用串行驱动芯片MAX6951应用4.7 串行共阴显示驱动器MAX7219与7221应用4.8 14段与16段数码管串行驱动显示4.9 16键解码芯片74C922应用4.10 1602LCD字符液晶测试程序4.11 1602液晶显示DS1302实时时钟4.12 1602液晶工作于4位模式实时显示当前时间4.13 带RAM内存的实时时钟与日历芯片PCF8583应用4.14 2×20串行字符液晶演示4.15 LGM12864液晶显示程序4.16 PG160128A液晶图文演示4.17 TG126410液晶串行模式显示4.18 HDG12864系列液晶演示4.19 Nokia7110液晶菜单控制程序4.20 8通道模拟开关74HC4051应用测试4.21 用带I2C接口的MCP23016扩展16位通用I/O端口4.22 用带SPI接口的MCP23S17扩展16位通用I/O端口4.23 用I2C接口控制MAX6953驱动4片5×7点阵显示器4.24 用I2C接口控制MAX6955驱动16段数码管显示4.25 用带SPI接口的数/模转换器MCP4921生成正弦波形4.26 用带SPI接口的数/模转换器MAX515控制LED亮度循环变化4.27 正反转可控的直流电机4.28 PWM控制MOSFET搭建的H桥电路驱动直流电机运行4.29 正反转可控的步进电机4.30 用L297+L298控制与驱动步进电机4.31 PC通过RS-485器件MAX487远程控制单片机4.32 I2C接口DS1621温度传感器测试4.33 SPI接口温度传感器TC72应用测试4.34 温度传感器LM35全量程应用测试4.35 K型热电偶温度计4.36 用铂电阻温度传感器PT100设计的测温系统4.37 DS18B20温度传感器测试4.38 SHT75温湿度传感器测试4.39 1-Wire式可寻址开关DS2405应用测试4.40 光敏电阻应用测试4.41 MPX4250压力传感器测试4.42 用I2C接口读写存储器AT24C044.43 用SPI接口读写AT25F10244.44 PIC18 I2C接口存储器及USART接口测试程序4.45 PIC18 SPI接口存储器测试程序4.46 PIC18定时器及A/D转换测试4.47 用PIC18控制Microwire接口继电器驱动器MAX48204.48 MMC存储卡测试4.49 ATA硬盘数据访问4.50 微芯VLS5573液晶显示屏驱动器演示第5章 综合设计5.1 用DS1302/DS18B20+MAX6951设计的多功能电子日历牌5.2 用PCF8583设计高仿真数码管电子钟5.3 用4×20LCD与DS18B20设计的单总线多点温度监测系统5.4 用内置EEPROM与1602液晶设计的加密电子密码锁5.5 用PIC单片机与1601LCD设计的计算器5.6 电子秤仿真设计5.7 数码管显示的GP2D12仿真测距警报器5.8 GPS全球定位系统仿真5.9 能接收串口信息的带中英文硬字库的80×16点阵显示屏5.10 用M145026与M145027设计的无线收发系统5.11 红外遥控收发仿真5.12 交流电压检测与数字显示仿真5.13 带位置感应器的直流无刷电机PMW控制仿真5.14 3端可调正稳压器LM317应用测试5.15 模拟射击训练游戏5.16 带触摸屏的国际象棋游戏仿真5.17 温室监控系统仿真5.18 PIC单片机MODBUS总线通信仿真5.19 PIC单片机内置CAN总线通信仿真5.20 基于PIC18+Microchip TCP/IP协议栈的HTTP服务器应用参考文献

单片机C语言程序设计实训100例综合设计中的用1602LCD与DS18B20设计的温度报警器中源程序,求急用!

#include

#include

#define uchar unsigned char

#define uint unsigned int

void Initialize_LCD();

void DelayMS(uint ms);

void ShowString(uchar,uchar,uchar *);

sbit K1=P3^0;

sbit K2=P3^1;

sbit K3=P3^2;

uchar code Prompt[]="Press K1 - K3 To Start Demo Prog";

//待滚动显示的信息段落,每行不超过80个字符,共6行

uchar const Line_Count=6;

uchar code Msg[][80]=

{

"Many CAD users dismiss schematic capture as a necessary evil in the ",

"process of creating PCB layout but we have always disputed this point ",

"of view. With PCB layout now offering automation of both component ",

"can often be the most time consuming element of the exercise.",

"And if you use circuit simulation to develop your ideas, ",

"you are going to spend even more time working on the schematic."

};

//显示缓冲(2行)

uchar Disp_Buffer[32];

//垂直滚动显示

void V_Scroll_Display()

{

uchar i,j,k=0;

uchar *p=Msg[0];

uchar *q=Msg[Line_Count]+strlen(Msg[Line_Count]);

//以下仅使用显示缓冲的前16字节空间

while(p
<q)
{

for(i=0;i<16&&p
<q;i++)
{ //消除显示缓冲中待显示行首尾可能出现的空格

if((i==0||i==15)&&*p==' ') p++;

if(*p!='\0')

{

Disp_Buffer[i]=*p++;

}

else

{

if(++k>Line_Count) break;

p=Msg[k]; //p指向下一串的首地址

Disp_Buffer[i]=*p++;

}

}

//不足16个字符时空格补充

for(j=i;j<16;j++) Disp_Buffer[j]=' ';

//垂直滚动显示

while(F0) DelayMS(5);

ShowString(0,0," ");

DelayMS(150);

while(F0) DelayMS(5);

ShowString(0,1,Disp_Buffer);

DelayMS(150);

while(F0) DelayMS(5);

ShowString(0,0,Disp_Buffer);

ShowString(0,1," ");

DelayMS(150);

}

//最后清屏

ShowString(0,0," ");

ShowString(0,1," ");

}

//水平滚动显示

void H_Scroll_Display()

{

uchar i,j,k=0,L=0;

uchar *p=Msg[0];

uchar *q=Msg[Line_Count]+strlen(Msg[Line_Count]);

//将32个字符的显示缓冲前16个字符设为空格

for(i=0;i<16;i++) Disp_Buffer[i]=' ';

while(p
<q)
{

//忽略缓冲中首尾可能出现的空格

if((i==16||i==31)&&*p==' ') p++;

for(i=16;i<32&&p
<q;i++)
{

if(*p!='\0')

{

Disp_Buffer[i]=*p++;

}

else

{

if(++k>Line_Count) break;

p=Msg[k]; //p指向下一串的首地址

Disp_Buffer[i]=*p++;

}

}

//不足32个字符时空格补充

for(j=i;j<32;j++) Disp_Buffer[j]=' ';

//水平滚动显示

for(i=0;i<=16;i++)

{

while(F0) DelayMS(5);

ShowString(0,L,Disp_Buffer+i);

while(F0) DelayMS(5);

DelayMS(20);

}

L=(L==0)?1:0; //行号在0,1间交替

DelayMS(300);

}

//如果显示结束时停留在第0行,则清除第1行的内容

if(L==1) ShowString(0,1," ");

}

//外部中断0,由K3控制暂停与继续显示

void EX_INT0() interrupt 0

{

F0=!F0; //暂停与继续显示控制标志位

}

//主程序

void main()

{

uint Count=0;

IE=0x81; //允许外部中断0

IT0=1; //下降沿触发

F0=0; //暂停与继续显示控制标志位

Initialize_LCD();

ShowString(0,0,Prompt);

ShowString(0,1,Prompt+16);

while(1)

{

if(K1==0)

{

V_Scroll_Display();

DelayMS(300);

}

else

if(K2==0)

{

H_Scroll_Display();

DelayMS(300);

}

}

}

//LCD1602.c

/* 名称:液晶控制与显示程序

说明:本程序是通用的1602液晶控制程序。

*/

#include

阅读更多 >>>  shell中文翻译,shell怎么翻译

#include

#define uchar unsigned char

#define uint unsigned int

sbit RS=P2^0;

sbit RW=P2^1;

sbit EN=P2^2;

//延时

void DelayMS(uint ms)

{

uchar i;

while(ms--) for(i=0;i<120;i++);

}

//忙检查

uchar Busy_Check()

{

uchar LCD_Status;

RS=0; //寄存器选择

RW=1; //读状态寄存器

EN=1; //开始读

DelayMS(1);

LCD_Status=P0;

EN=0;

return LCD_Status;

}

//写LCD命令

void Write_LCD_Command(uchar cmd)

{

while((Busy_Check()&0x80)==0x80); //忙等待

RS=0; //选择命令寄存器

RW=0; //写

EN=0;

P0=cmd;EN=1;DelayMS(1);EN=0;

}

//发送数据

void Write_LCD_Data(uchar dat)

{

while((Busy_Check()&0x80)==0x80); //忙等待

RS=1;RW=0;EN=0;P0=dat;EN=1;DelayMS(1);EN=0;

}

//LCD初始化

void Initialize_LCD()

{

Write_LCD_Command(0x38);DelayMS(1);

Write_LCD_Command(0x01);DelayMS(1); //清屏

Write_LCD_Command(0x06);DelayMS(1); //字符进入模式:屏幕不动,字符后移

Write_LCD_Command(0x0c);DelayMS(1); //显示开,光标关

}

//显示字符串

void ShowString(uchar x,uchar y,uchar *str)

{

uchar i=0;

if(y==0) Write_LCD_Command(0x80|x); //设置显示起始位置

if(y==1) Write_LCD_Command(0xc0|x);

for(i=0;i<16;i++) //输出字符串

{

Write_LCD_Data(str[i]);

}

}

</q;i++)
</q)
</q;i++)
</q)

单片机C语言程序设计实训100例:基于8051+Proteus仿真的内容简介

《单片机C语言程序设计实训100例:基于8051+Proteus仿真》讲述了:第一章用简短篇幅介绍8051单片机的特点、应用,以及Keil C语言程序设计,在语言程序设计中重点介绍8051内部资源;第二章介绍Proteus的入门操作;第三~五章全部为单片机的C程序设计案例;第三章为基础案例,涉及C语言基础部分,基本IO部分,中断与定时器,串口控制,模数与数模转换部分等;第四章在前面的基础上对扩展的外围硬件应用进行编程,包括译码器、串并转换芯片、存储器、中英文液晶屏、IIC等;第五章是综合设计部分,涉及一些具体的应用型产品的设计。读者对象:《单片机C语言程序设计实训100例:基于8051+Proteus仿真》适用于计算机专业或电子类专业在校学生,特别是职业技术院校学生,实验室投入不足的学校,电子工程技术人员,以及社会上希望学习单片机技术但还没有购置单片机硬件实验设备的人员。

求 单片机简单的C语言程序例子(越多越好)

这是我刚写的一个用按键控制流水灯的例子,很适合初学者的
/*硬件电路连接:流水灯接在P0口, 阳极接高电平,
阴极接P0口,4个按键分别接P3.4,P3.5, P3.6,P3.7 ,按下时是低电平 */
#include

sbit key1=P3^4;

sbit key2=P3^5;

sbit key3=P3^6;

sbit key4=P3^7;

int a[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//左流水灯数组

int b[]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};//右流水灯数组

int c[]={0xfe,0xfc,0xf8,0xf0,0xe0,0xc0,0x80,0x00,0x80,0xc0,0xe0,0xf0,0xf8,0xfc,0xfe,0xff}; //逐盏点亮,逐盏灭掉数组

//************************************************************************************************************

void delay() //延时子程序

{int i;

for(i=0;i<30000;i++);

}

//**********************************************************************************************************

void aa() //实现要求(1)的子程序(key1按下时流水灯,弹开时全灭)

{ int i=0;

while(!key1) //判断是否有键按下

{P0=a[i];delay();i++;if(i==8)i=0;}//流水灯

}

//*************************************************************************************************************

void bb() // 实现要求(2)的子程序(key2按下时实现计数功能,弹开时停止计数;)

{

while(!key2){P0--;delay();if(P0==0)P0=0xff;} //判断是否有键按下,按下则计数器加1

}

//*************************************************************************************************************

void cc() // 实现要求(3)的子程序(key3按下时实现逐盏点亮,逐盏灭掉)

{ int i=0;

P0=0xff ;// 发光二极管全灭

while(!key3) //判断是否有键按下

{P0=c[i];delay();i++;if(i==16)i=0;}//逐盏点亮,逐盏灭掉

}

//*************************************************************************************************************

void dd() // 实现要求(4)的子程序(key4按第一次按下,左流水,第二次按下,右流水,第三次按下,熄灭)

{ int i=0,j=0,k=0,h=0;

loop:P0=0xff;

if(key4==0) //第一次判断是否有键按下

{for(i=0;i<30000;i++); //延时防抖动

if(key4==1) //判断按键是否弹起

while(1){P0=a[j];delay();j++;if(j==8)j=0; //左流水灯

if(key4==0) //第二次判断是否有键按下

{for(i=0;i<30000;i++); //延时防抖动

if(key4==1) //判断按键是否弹起

while(1){P0=b[k];delay();k++;if(k==8)k=0; //右流水灯

if(key4==0) //第三次判断是否有键按下

{for(i=0;i<30000;i++); //延时防抖动

if(key4==1) //判断按键是否弹起

goto loop; //跳转到LOOP处,即P3=0xff,此时灯全灭

}}}}}}

//****************************************************************************************************************

main()

{while(1){P0=0xff;

while(!key1)aa();

while(!key2)bb();

while(!key3)cc();

while(!key4)dd();

}}

我前几天刚在网上看到的,不知道对你有没有用》

1. 闪烁灯

1. 实验任务

如图4.1.1所示:在P1.0端口上接一个发光二极管L1,使L1在不停地一亮一灭,一亮一灭的时间间隔为0.2秒。

2. 电路原理图

图4.1.1

3. 系统板上硬件连线

把“单片机系统”区域中的P1.0端口用导线连接到“八路发光二极管指示模块”区域中的L1端口上。

4. 程序设计内容

(1). 延时程序的设计方法

作为单片机的指令的执行的时间是很短,数量大微秒级,因此,我们要求的闪烁时间间隔为0.2秒,相对于微秒来说,相差太大,所以我们在执行某一指令时,插入延时程序,来达到我们的要求,但这样的延时程序是如何设计呢?下面具体介绍其原理:

如图4.1.1所示的石英晶体为12MHz,因此,1个机器周期为1微秒

机器周期 微秒

MOV R6,#20 2个机器周期 2

D1: MOV R7,#248 2个机器周期 2 2+2×248=498 20×

DJNZ R7,$ 2个机器周期 2×248 498

DJNZ R6,D1 2个机器周期 2×20=40 10002

因此,上面的延时程序时间为10.002ms。

由以上可知,当R6=10、R7=248时,延时5ms,R6=20、R7=248时,延时10ms,以此为基本的计时单位。如本实验要求0.2秒=200ms,10ms×R5=200ms,则R5=20,延时子程序如下:

DELAY: MOV R5,#20D1: MOV R6,#20D2: MOV R7,#248DJNZ R7,$DJNZ R6,D2DJNZ R5,D1RET

(2). 输出控制

如图1所示,当P1.0端口输出高电平,即P1.0=1时,根据发光二极管的单向导电性可知,这时发光二极管L1熄灭;当P1.0端口输出低电平,即P1.0=0时,发光二极管L1亮;我们可以使用SETB P1.0指令使P1.0端口输出高电平,使用CLR P1.0指令使P1.0端口输出低电平。

5. 程序框图

如图4.1.2所示

图4.1.2

6. 汇编源程序ORG 0START: CLR P1.0LCALL DELAYSETB P1.0LCALL DELAYLJMP STARTDELAY: MOV R5,#20 ;延时子程序,延时0.2秒D1: MOV R6,#20D2: MOV R7,#248DJNZ R7,$DJNZ R6,D2DJNZ R5,D1RETEND7. C语言源程序#include

sbit L1=P1^0;void delay02s(void) //延时0.2秒子程序{unsigned char i,j,k;for(i=20;i>0;i--)for(j=20;j>0;j--)for(k=248;k>0;k--);}void main(void){while(1){L1=0;delay02s();L1=1;delay02s();}}

2. 模拟开关灯

1. 实验任务

如图4.2.1所示,监视开关K1(接在P3.0端口上),用发光二极管L1(接在单片机P1.0端口上)显示开关状态,如果开关合上,L1亮,开关打开,L1熄灭。

2. 电路原理图

图4.2.1

3. 系统板上硬件连线

(1). 把“单片机系统”区域中的P1.0端口用导线连接到“八路发光二极管指示模块”区域中的L1端口上;

(2). 把“单片机系统”区域中的P3.0端口用导线连接到“四路拨动开关”区域中的K1端口上;

4. 程序设计内容

(1). 开关状态的检测过程

单片机对开关状态的检测相对于单片机来说,是从单片机的P3.0端口输入信号,而输入的信号只有高电平和低电平两种,当拨开开关K1拨上去,即输入高电平,相当开关断开,当拨动开关K1拨下去,即输入低电平,相当开关闭合。单片机可以采用JB BIT,REL或者是JNB BIT,REL指令来完成对开关状态的检测即可。

(2). 输出控制

如图3所示,当P1.0端口输出高电平,即P1.0=1时,根据发光二极管的单向导电性可知,这时发光二极管L1熄灭;当P1.0端口输出低电平,即P1.0=0时,发光二极管L1亮;我们可以使用SETB P1.0指令使P1.0端口输出高电平,使用CLR P1.0指令使P1.0端口输出低电平。

5. 程序框图

图4.2.2

6. 汇编源程序 ORG 00HSTART: JB P3.0,LIGCLR P1.0SJMP STARTLIG: SETB P1.0SJMP STARTEND

7. C语言源程序#include

sbit K1=P3^0;sbit L1=P1^0;void main(void){while(1){if(K1==0){L1=0; //灯亮}else{L1=1; //灯灭}}}

3. 多路开关状态指示

1. 实验任务

如图4.3.1所示,AT89S51单片机的P1.0-P1.3接四个发光二极管L1-L4,P1.4-P1.7接了四个开关K1-K4,编程将开关的状态反映到发光二极管上。(开关闭合,对应的灯亮,开关断开,对应的灯灭)。

2. 电路原理图

图4.3.1

3. 系统板上硬件连线

(1. 把“单片机系统”区域中的P1.0-P1.3用导线连接到“八路发光二极管指示模块”区域中的L1-L4端口上;

(2. 把“单片机系统”区域中的P1.4-P1.7用导线连接到“四路拨动开关”区域中的K1-K4端口上;

4. 程序设计内容

(1. 开关状态检测

对于开关状态检测,相对单片机来说,是输入关系,我们可轮流检测每个开关状态,根据每个开关的状态让相应的发光二极管指示,可以采用JB P1.X,REL或JNB P1.X,REL指令来完成;也可以一次性检测四路开关状态,然后让其指示,可以采用MOV A,P1指令一次把P1端口的状态全部读入,然后取高4位的状态来指示。

(2. 输出控制

根据开关的状态,由发光二极管L1-L4来指示,我们可以用SETB P1.X和CLR P1.X指令来完成,也可以采用MOV P1,#1111XXXXB方法一次指示。

5. 程序框图

读P1口数据到ACC中

ACC内容右移4次

ACC内容与F0H相或

ACC内容送入P1口



图4.3.2

6. 方法一(汇编源程序)ORG 00HSTART: MOV A,P1ANL A,#0F0HRR ARR ARR ARR AORl A,#0F0HMOV P1,ASJMP STARTEND7. 方法一(C语言源程序)#include

unsigned char temp;void main(void){while(1){temp=P1>>4;temp=temp | 0xf0;P1=temp;}}8. 方法二(汇编源程序)ORG 00HSTART: JB P1.4,NEXT1CLR P1.0SJMP NEX1NEXT1: SETB P1.0NEX1: JB P1.5,NEXT2CLR P1.1SJMP NEX2NEXT2: SETB P1.1NEX2: JB P1.6,NEXT3CLR P1.2SJMP NEX3NEXT3: SETB P1.2NEX3: JB P1.7,NEXT4CLR P1.3SJMP NEX4NEXT4: SETB P1.3NEX4: SJMP STARTEND9. 方法二(C语言源程序)#include

void main(void){while(1){if(P1_4==0){P1_0=0;}else{P1_0=1;}if(P1_5==0){P1_1=0;}else{P1_1=1;}if(P1_6==0){P1_2=0;}else{P1_2=1;}if(P1_7==0){P1_3=0;}else{P1_3=1;}}}

先给你,传不上 太多了

网站数据信息

"单片机c语言应用100例,单片机C语言程序设计实训100例:基于PIC+Proteus仿真的目录"浏览人数已经达到18次,如你需要查询该站的相关权重信息,可以点击进入"Chinaz数据" 查询。更多网站价值评估因素如:单片机c语言应用100例,单片机C语言程序设计实训100例:基于PIC+Proteus仿真的目录的访问速度、搜索引擎收录以及索引量、用户体验等。 要评估一个站的价值,最主要还是需要根据您自身的需求,如网站IP、PV、跳出率等!