单片机实验C语言编程.docx
《单片机实验C语言编程.docx》由会员分享,可在线阅读,更多相关《单片机实验C语言编程.docx(16页珍藏版)》请在冰点文库上搜索。
单片机实验C语言编程
流水灯
效果:
发关二级管依次独个被点亮,一直循环下去。
C语言程序如下:
#include
unsignedchari;
unsignedchartemp;
voiddelay(void)//延时子程序
{
unsignedcharm,n,s;
for(m=20;m>0;m--)
for(n=20;n>0;n--)
for(s=248;s>0;s--);
}
voidmain(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端口而不是其它变量。
******************************************************************************/
voiddelay02s(void)//延时0.2秒子程序
{
unsignedchari,j,k;//定义3个无符号字符型数据。
for(i=20;i>0;i--)//作循环延时
for(j=20;j>0;j--)
for(k=248;k>0;k--);
}
voidmain(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
sbitINT_0=P3^2;//定义按键的输入端注意此处按键判断使用的是扫
//描方式而表示中断判断方式
sbitD1=P3^0;//D1小灯定义
voiddelay10ms(void)//延时程序
{
unsignedchari,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
unsignedcharcodetable[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
unsignedchardispcount=0;//计数
sbitgewei=P3^1;//个位选通定义
sbitshiwei=P3^0;//十位选通定义
voidDelay(unsignedinttc)//延时程序
{
while(tc!
=0)
{
unsignedinti;
for(i=0;i<100;i++);
tc--;
}
}
voidExtInt0()interrupt0//中断服务程序
{
dispcount++;
if(dispcount==100)
{dispcount=0;}
}
voidLED()//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);
}
}
voidmain()
{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
unsignedcharcodeseg7code[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
unsignedchark;
voiddelay10ms(void)//延时程序
{
unsignedchari,j;
for(i=20;i>0;i--)
for(j=248;j>0;j--);
}
voidGetch()
{
unsignedcharX,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)//判断键值(那一个键按下)
{
case0x77:
k=0;break;//对键值赋值
case0x7b:
k=1;break;
case0x7d:
k=2;break;
case0x7e:
k=3;break;
case0xb7:
k=4;break;
case0xbb:
k=5;break;
case0xbd:
k=6;break;
case0xbe:
k=7;break;
case0xd7:
k=8;break;
case0xdb:
k=9;break;
case0xdd:
k=10;break;
case0xde:
k=11;break;
case0xe7:
k=12;break;
case0xeb:
k=13;break;
case0xed:
k=14;break;
case0xee:
k=15;break;
}
}
}
}
voidmain(void)
{
while
(1)
{P2=0xff;
Getch();
P3=seg7code[k];//查表LED输出
P1=0xf0;//输出相同的四位数据。
}
}
数码管动态显示
效果:
液晶显示器显示“1234”。
C语言程序如下:
#include
sbitqian=P1^0;
sbitbai=P1^1;
sbitshi=P1^2;
sbitge=P1^3;
codeunsignedcharseg7code[10]={0x3f,0x06,0x5b,0x4f,0x66,
0x6d,0x7d,0x07,0x7f,0x6f};//显示段码
voidDelay(unsignedinttc)//延时程序
{
while(tc!
=0)//如果tc为0则终止延时
{
unsignedinti;//局部正整数变量i
for(i=0;i<100;i++);//执行400次将耗时1毫秒
tc--;//tc计数减一
}
}
voidLed(intdate)//显示函数
{
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()
{
intdisplay_date=1234;//定义并赋值要显示的数据
while
(1)
{
Led(display_date);//调用显示函数显示数据display_date
}
}
数码管静态显示
效果:
液晶显示器最左边第一位将显示“4”
C语言程序如下:
#include
sbitGE=P1^3;
codeunsignedcharseg7code[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,
0x7d,0x07,0x7f,0x6f};//显示段码
main()
{
unsignedchardisplay_date=4;//定义并赋值要显示的数据
while
(1)
{
P3=seg7code[display_date];//查表,输出
GE=0;//P1^3为低电平,相当于把数码管的4H端接地
}
}