单片机.docx
《单片机.docx》由会员分享,可在线阅读,更多相关《单片机.docx(15页珍藏版)》请在冰豆网上搜索。
![单片机.docx](https://file1.bdocx.com/fileroot1/2023-1/3/67bda74f-2912-40c5-819f-73a5885042da/67bda74f-2912-40c5-819f-73a5885042da1.gif)
单片机
流水灯实验代码:
#include
#include
#defineuintunsignedint
#defineucharunsignedchar
voiddelayms(uintxms)
{
uinti,j;
for(i=xms;i>0;i--)
for(j=110;j>0;j--);
}
voidmain()
{
uinta=0xfe;
while
(1)
{
P1=a;
delayms(1000);
a=_crol_(a,1);
}
}
双向流水灯实验代码:
#include
#include
#defineuintunsignedint
#defineucharunsignedchar
sbitkey=P3^2;
voiddelayms(uintxms)
{
uinti,j;
for(i=xms;i>0;i--)
for(j=110;j>0;j--);
}
voidmain()
{
uinta=0xfe;
uchari;
while
(1)
{
for(i=1;i<=7;i++)
{
P1=a;
delayms(1000);
a=_crol_(a,1);
}
for(i=1;i<=7;i++)
{
P1=a;
delayms(1000);
a=_cror_(a,1);
}
}
}
日期显示实验代码:
#include
#include
#defineuintunsignedint
#defineucharunsignedchar
ucharcodeDIS_CODE[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
voiddelayms(uintxms)
{
uinti,j;
for(i=xms;i>0;i--)
for(j=110;j>0;j--);
}
voidmain()
{
uchari=0;
uchara=0x11;
while
(1)
{
P1=0x01;
P2=DIS_CODE[2];
delayms(5);
P1=0x02;
P2=DIS_CODE[0];
delayms(5);
P1=0x04;
P2=DIS_CODE[1];
delayms(5);
P1=0x08;
P2=DIS_CODE[6];
delayms(5);
P1=0x10;
P2=DIS_CODE[0];
delayms(5);
P1=0x20;
P2=DIS_CODE[9];
delayms(5);
P1=0x40;
P2=DIS_CODE[1];
delayms(5);
P1=0x80;
P2=DIS_CODE[2];
delayms(5);
}
}
日期显示代码优化
#include
#include
#defineuintunsignedint
#defineucharunsignedchar
仿真实验
ucharcodeDIS_CODE[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
voiddelayms(uintxms)
{
uinti,j;
for(i=xms;i>0;i--)
for(j=110;j>0;j--);
}
voidshow_time(uintyear,uintmonth,uintday)
{
uinttemp;
//显示年份
temp=year/1000;
P1=0x01;
P2=DIS_CODE[temp];
delayms(5);
temp=year%1000;
temp=temp/100;
P1=0x02;
P2=DIS_CODE[temp];
delayms(5);
temp=year%100;
temp=temp/10;
P1=0x04;
P2=DIS_CODE[temp];
delayms(5);
temp=year%10;
P1=0x08;
P2=DIS_CODE[temp];
delayms(5);
//显示月份
temp=month/10;
P1=0x10;
P2=DIS_CODE[temp];
delayms(5);
temp=month%10;排阻知识讲解
P1=0x20;
P2=DIS_CODE[temp];
delayms(5);
//显示日
temp=day/10;
P1=0x40;
P2=DIS_CODE[temp];
delayms(5);
temp=day%10;否
P1=0x80;
P2=DIS_CODE[temp];
delayms(5);是
}
否
voidmain()
{
while
(1)
{是
show_time(1993,9,16);
}
}
按键控制流水灯实验代码
#include按键消抖流程图
#include
#defineuintunsignedint
#defineucharunsignedchar
sbitkey=P3^2;
voiddelayms(uintxms)
{
uinti,j;
for(i=xms;i>0;i--)
for(j=110;j>0;j--);按键控制流水灯实验原理图
}
voidmain()
{
uchari=0;
ucharkey_val=1;
bitbFlash=1;
ucharflag=0xfe;
key=1;
while
(1)
{
for(i=0;i<8;i++)
{
if(key_val!
=key)
{
key_val=key;
if(key==0)
bFlash=~bFlash;
}
if(bFlash)
{
P1=flag;
delayms(100);
flag=_crol_(flag,1);
}
}
}
}
functionaldescription:
按key时,数码管显示数字1且LED1亮,LED2灭;按key1时,数码管显示数字2且LED2亮,LED1灭。
#include
#include
#defineuintunsignedint
#defineucharunsignedchar
sbitkey=P3^2;
sbitkey1=P3^3;
sbitLED1=P1^0;
sbitLED2=P1^1;仿真电路图
ucharcodeDIS_CODE[12]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff,0x0c};
voiddelayms(uintxms)
{
uinti,j;
for(i=xms;i>0;i--)
for(j=110;j>0;j--);
}
voidmain()
{
ucharkey_val=0;
P0=0xff;
P3=0xff;
key_val=0xff;
P0=DIS_CODE[11];
while
(1)
{
if(key_val!
=P3)
{
key_val=P3;
if(key==0)
{
delayms(10);
if(key==0)
{
LED1=0;
LED2=1;
P0=DIS_CODE[1];
}
}
if(key1==0)
{
delayms(10);
if(key1==0)
{
LED1=1;
LED2=0;
P0=DIS_CODE[2];
}
}
}
}
}
如何实现软件“消抖”
外部中断控制实验代码:
外部中断0的响应是让数码管加1,外部中断1的响应是让数码管原先显示的数字清零。
#include
#defineucharunsignedchar
#defineuintunsignedint
uintg_unDisNum;
ucharcodeDIS_CODE[12]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff,0x0c};
voiddelayms(uintxms)
{
uinti,j;
for(i=xms;i>0;i--)
for(j=110;j>0;j--);
}
仿真实验电路图
voiddisp_num(uintnum)
{
ucharsep_num=0;
ucharten_num=0;
ucharhund_num=0;
ucharthou_num=0;
sep_num=num%10;
ten_num=(num%100)/10;
hund_num=(num/100)%10;
thou_num=num/1000;
P2=0x01;
P0=DIS_CODE[thou_num];
delayms(5);
P2=0x02;
P0=DIS_CODE[hund_num];
delayms(5);
P2=0x04;
P0=DIS_CODE[ten_num];
delayms(5);
P2=0x08;
P0=DIS_CODE[sep_num];
delayms(5);
}
voidint0_inter()interrupt0//interruptfunction
{
g_unDisNum++;
}
voidint1_inter()interrupt2
{
g_unDisNum=0;
}
voidmain()
{
g_unDisNum=0;
P0=0xff;
P2=0xff;
P3=0xff;
IT0=1;
IT1=1;
EX0=1;
EX1=1;
EA=1;
while
(1)
{
disp_num(g_unDisNum);
}
}
说明:
在该程序代码中并没有对按键做抖动处理,但是在实际应用中会在中断函数中做一个按键触发的标志,而在主函数中处理按键的抖动问题。
另外中断都是比较紧急的任务,不能在中断处理函数中做太多的工作,特别是不能在中断函数中使用延时函数。
定时器中断实验代码:
外部中断0开启定时器中断,外部中断1关闭定时器中断。
定时时长1s.
#include
#defineucharunsignedchar
#defineuintunsignedint
sbitLED=P2^0;
ucharg_ucNum;
voidint0_inter()interrupt0//starttimer
{
g_ucNum=0;
TH0=0x3c;
TL0=0xb0;
TR0=1;
}
voidint1_inter()interrupt2//closetimer
{
TR0=0;
}
voidtimer0_inter()interrupt1//timer0
{
g_ucNum++;
TH0=0x3c;
TL0=0xb0;
}
voidmain()
{
g_ucNum=0;
P2=0xff;//initial
IT0=1;
IT1=1;//外部中断下降沿触发
EX0=1;
EX1=1;//opentheinterruptexternally
TMOD=0x01;
TH0=0x3c;
TL0=0xb0;
ET0=1;
EA=1;
while
(1)
{
if(g_ucNum>=20)//1s
{
g_ucNum=0;
LED=~LED;
}
}
}