文档库 最新最全的文档下载
当前位置:文档库 › 单片机实验c语言编程

单片机实验c语言编程

单片机实验c语言编程
单片机实验c语言编程

流水灯

效果:发关二级管依次独个被点亮,一直循环下去。

C语言程序如下:

#include

unsigned char i;

unsigned char temp;

void delay(void) //延时子程序

{

unsigned char m,n,s;

for(m=20;m>0;m--)

for(n=20;n>0;n--)

for(s=248;s>0;s--);

}

void main(void) //主程序

{

while(1) //循环条件永远为真,以下程序一直执行下去。{

temp=0xfe;

P3=temp; //直接对I/O 口P3 赋值,使.P3.0 输出低点平。delay(); //延时

for(i=1;i<8;i++) //实现灯的移动

{

temp=(temp<<1)|0x01; //P3 口I/O 轮流低电平

P3=temp;

delay(); //延时,肉眼可以看到

}

}

}

闪烁灯

效果:发光二极管维持一闪一闪的状态。

C语言程序如下:

#include

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

第一行是一个"文件包含"处理。

所谓"文件包含"是指一个文件将另外一个文件的内容全部包含进来,所以这里的程序虽然只有4 行,但C 编译器在处理的时候却要处理几十或几百行。这里程序中包含REG51.h文件的目的是为了要使用P1 这符号即通知C 编译器,程序中所写的P1 是指80C51 单片机的P1 端口而不是其它变量。

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

void delay02s(void) //延时0.2 秒子程序

{

unsigned char i,j,k; //定义3 个无符号字符型数据。

for(i=20;i>0;i--) //作循环延时

for(j=20;j>0;j--)

for(k=248;k>0;k--);

}

void main(void) //每一个C 语言程序有且只有一个主函数,

{

while(1) //循环条件永远为真,以下程序一直执行下去。

{

P3_0=0; // I/O 口P3.0 输出低电平,小灯被点亮。

delay02s(); //延时经过0.2 秒。

P3_0=1; // I/O 口P3.0 输出高电平,小灯熄灭。

delay02s(); //延时经过0.2 秒。

}

}

按键识别

效果:按下开关,D1变亮并保持。再按开关,D1熄灭,并保持。C语言程序如下:

#include

sbit INT_0=P3^2; //定义按键的输入端注意此处按键判断使用的是扫

//描方式而表示中断判断方式

sbit D1=P3^0; //D1 小灯定义

void delay10ms(void) //延时程序

{

unsigned char i,j;

for(i=20;i>0;i--)

for(j=248;j>0;j--);

}

key() /按键判断程序

{

if(INT_0==0) //判断是否按下键盘

{

delay10ms(); //延时,软件去干扰

if(INT_0==0) //确认按键按下

{

D1=!D1; //D1 亮灭交替变化

}

while(INT_0==0); //按键锁定,每按一次D1 只变化一次.

}

}

main()

{

while(1) //永远循环,扫描判断按键是否按下

{

key(); //对于此处CPU 对按键判断一直扫描;

}

}

按键中断识别

效果:一开始显示“0”,每按一次开关,显示的数字就加1。

C语言程序如下:

#include

unsigned char code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; unsigned char dispcount=0; //计数

sbit gewei=P3^1; //个位选通定义

sbit shiwei=P3^0; //十位选通定义

void Delay(unsigned int tc) //延时程序

{

while( tc != 0 )

{

unsigned int i;

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

tc--;

}

}

void ExtInt0() interrupt 0 //中断服务程序

{

dispcount++;

if (dispcount==100)

{dispcount=0;}

}

void LED( ) //LED显示函数

{

if(dispcount>=10) //显示两位数

{

shiwei=1;

P2=table[dispcount/10];

Delay(8);

shiwei=0;

gewei=1;

P2=table[dispcount%10];

Delay(5);

gewei=0;

}

else //显示一位数

{

shiwei=0;

gewei=1;

P2=table[dispcount];

Delay(8);

}

}

void main()

{ TCON=0x01; // INT0为0 电平触发为1负边沿触发IE=0x81; //开总中断和允许INT0外部中断

while(1) //循环执行

{ LED(); } //调用显示函数

}

4×4 矩阵式键盘识别

效果:按下不同的按键将显示不同的内容,从右到左,从上到下,按键分别代表0,1,2,3,4,5,6,7,8,9,A,b,C,d,E,F.C语言程序如下:

#include

unsigned char code seg7code[]={0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07,

0x7f,0x6f,0x77,0x7c, 0x39,0x5e,0x79,0x71};

unsigned char k;

void delay10ms(void) //延时程序

{

unsigned char i,j;

for(i=20;i>0;i--)

for(j=248;j>0;j--);

}

void Getch ( )

{

unsigned char X,Y,Z;

P2=0xff;

P2=0x0f; //先对P2 置数行扫描

if(P2!=0x0f) //判断是否有键按下

{

delay10ms(); //延时,软件去干扰

if(P2!=0x0f) //确认按键按下;

{

X=P2; //保存行扫描时有键按下时状态P2=0xf0; //列扫描

Y=P2; //保存列扫描时有键按下时状态Z=X|Y; //取出键值

switch ( Z ) //判断键值(那一个键按下){

case 0x77: k=0; break; //对键值赋值case 0x7b: k=1; break;

case 0x7d: k=2; break;

case 0x7e: k=3; break;

case 0xb7: k=4; break;

case 0xbb: k=5; break;

case 0xbd: k=6; break;

case 0xbe: k=7; break;

case 0xd7: k=8; break;

case 0xdb: k=9; break;

case 0xdd: k=10;break;

case 0xde: k=11;break;

case 0xe7: k=12;break;

case 0xeb: k=13;break;

case 0xed: k=14;break;

case 0xee: k=15;break;

}

}

}

}

void main(void)

{

while(1)

{ P2=0xff;

Getch();

P3=seg7code[k]; //查表LED 输出

P1=0xf0; //输出相同的四位数据。

}

}

数码管动态显示

效果:液晶显示器显示“1234”。

C语言程序如下:

#include

sbit qian=P1^0;

sbit bai=P1^1;

sbit shi=P1^2;

sbit ge=P1^3;

code unsigned char seg7code[10]={0x3f,0x06,0x5b,0x4f,0x66, 0x6d,0x7d,0x07,0x7f,0x6f}; //显示段码

void Delay(unsigned int tc) //延时程序

{

while( tc != 0 ) //如果tc 为0 则终止延时

{

unsigned int i; //局部正整数变量i

for(i=0; i<100; i++); //执行400 次将耗时1 毫秒

tc--; //tc 计数减一

}

}

void Led(int date) //显示函数

{

qian=0; //P1.0 输出低电平,选通千位数

P3=seg7code[date/1000]; //取出千位数,查表,输出。Delay(10); //延时

qian=1; //销隐

bai=0; //P1.1 输出低电平,选通百位数

P3=seg7code[date%1000/100]; //取出百位数,查表,输出。Delay(10); //延时

bai=1; //销隐

shi=0; //P1.2 输出低电平,选通十位数

P3=seg7code[date%100/10]; //取出十位数,查表,输出。Delay(10); //延时

shi=1; //销隐

ge=0; //P1.3 输出低电平,选通十位数

P3=seg7code[date%10]; //取出个位数,查表,输出。Delay(10); //延时

ge=1; //销隐

}

main()

{

int display_date=1234; //定义并赋值要显示的数据

while(1)

{

Led(display_date);//调用显示函数显示数据display_date

}

}

数码管静态显示

效果:液晶显示器最左边第一位将显示“4”

C语言程序如下:

#include

sbit GE=P1^3;

code unsigned char seg7code[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d, 0x7d,0x07,0x7f,0x6f}; //显示段码

main()

{

unsigned char display_date=4; //定义并赋值要显示的数据

while(1)

{

P3=seg7code[display_date]; //查表,输出

GE=0; //P1^3 为低电平,相当于把数码管的4H 端接地

}

}

相关文档