单片机代码.docx
《单片机代码.docx》由会员分享,可在线阅读,更多相关《单片机代码.docx(28页珍藏版)》请在冰豆网上搜索。
![单片机代码.docx](https://file1.bdocx.com/fileroot1/2022-12/7/4a5606c6-f2c7-4e26-9ca7-2a0963261a6a/4a5606c6-f2c7-4e26-9ca7-2a0963261a6a1.gif)
单片机代码
注:
一下代码都没有51头文件
#include
没有延时函数体,如果51的频率为12MHz延时函数体为
voiddelay_ms(uintz)
{
uintx,y;
for(x=z;x>0;x--)
for(y=123;y>0;y--);
}
#defineuintunsignedint
#defineucharunsignedchar
第一次实验二极管
二极管以500ms闪烁显示
sbitD0=P0^0;
voidmain()
{
while
(1)
{
D0=0;
delay_ms(250);//分为2段延时才闪烁
D0=1;
delay_ms(250);
}
}
流水灯以1000ms轮流闪烁
#include//需要使用移位函数调用的头文件
voidmain()
{
uchartmp=0xfe;
while
(1)
{
delay_ms(1000);
tmp=_crol_(tmp,1);//向左移一位
P0=tmp;
}
}
花样流水灯显示(130种花样显示)
//数组定义
voidmain()
{
while
(1)
{
uinti=0;
while(i<130)
{
P0=led_light[i];
delay_ms(200);
i++;
}
}
}
第二次实验数码管的应用
8个数码管同时以1秒的速度变化显示0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F。
//7位数码管一同显示共阴极接
ucharcodeled_dm[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x76}
voidmain()
{
uinti;
while
(1)
{
P0=0x00;
for(i=0;i<16;i++)
{
WM=0;
P0=led_dm[i];
delay_ms(400);//延时400ms
}
}
}
第一秒钟右边第一位显示0,第二秒钟右边两位显示1,第三秒钟右边三位显示2,第八秒钟所有数码管同时显示7,然后循环显示。
ucharcodeled_dm[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};
//0到f
ucharcodeled_wm[]={0x01,0x03,0x07,0x0f,0x1f,0x3f,0x7f,0xff};
voidmain()
{
uinti,j;
while
(1)
{
for(i=0;i<16;i++)
{
P2=led_wm[i%8];
P0=led_dm[i];
delay_ms(500);
}
};
}
0~999999范围内的计数器。
数字变化频率自定
ucharcodeled_dm[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
ucharcodeled_wm[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
uintcount=0;
uintlight=0;
voiddelay(uint);
voidshow(uint);
voidinit();
sbitKEY=P3^6;
voidmain()
{
uintcount=0;
while
(1)
{
show(count);
count++;
};
}
voidshow(uintnum)//显示数字
{
uinti=0;
uinttnum=num;
while(tnum/10){
tnum/=10;
++i;
}
switch(i)
{
case5:
//显示第六位
KEY=0;
P0=led_dm[num/100000];
P2=led_wm[5];
delay_ms
(1);
KEY=1;
case4:
KEY=0;
P0=led_dm[(num/10000)%10];
P2=led_wm[4];
delay_ms
(1);
KEY=1;
case3:
KEY=0;
P0=led_dm[(num/1000)%10];
P2=led_wm[3];
delay_ms
(1);
KEY=1;
case2:
KEY=0;
P0=led_dm[(num/100)%10];
P2=led_wm[2];
delay_ms
(1);
KEY=1;
case1:
KEY=0;
P0=led_dm[(num/10)%10];
P2=led_wm[1];
delay_ms
(1);
KEY=1;
case0:
//显示第一位
KEY=0;//关闭锁存器
P0=led_dm[num%10];
P2=led_wm[0];
delay_ms
(1);
KEY=1;//打开锁存器
}
delay_ms(10);//延时10ms
}
第三次定时计数器的应用
第一题:
流水灯以1s的速度变化
//共阳极接法
ucharcodeled_light[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};
voidinit();
uintcount=0;
voidmain()
{
uinti=0;
init();
while
(1){
if(count==20){//1s延时50ms*20
count=0;
P3=led_light[i];
i++;
if(i==16){
i=0;
}
}
}
}
voidinit()//定时器初始化
{
TMOD=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1;
ET0=1;
TR0=1;
}
voidtimer0()interrupt1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
count++;
}
第二题:
数码管依次以1s显示0到f
voidmain()
{
uinti=0;
init();
while
(1){
if(count==20){
count=0;
P3=led_light[i];
i++;
if(i==16){
i=0;
}
}
}
}
{延时代码通上题}
第四次使用
按键依次显示0-f
ucharcodeled[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e}
voidmain()
{
uinti=0;
while
(1){
if(key==0){
delay_ms(5);
if(key==0){
P0=led[i];
i++;
if(i==16)
i=0;
}
while(!
key);//延时清除
}
}
}
矩阵键盘的应用
//共阳极接法
ucharcodeled_dm[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e}
uchartemp;
uintNUM=0;
voidmain()
{
While
(1){
keyword();
};
}
voidkeyword(void)//键盘函数
{
while
(1){
//显示0-3
P3=0xfe;
temp=P3;
temp=temp&0xf0;
if(temp!
=0xf0){
delay_ms(5);
temp=P3;
temp=temp&0xf0;
if(temp!
=0xf0){
switch(P3){
case0xee:
NUM=0;break;
case0xde:
NUM=1;break;
case0xbe:
NUM=2;break;
case0x7e:
NUM=3;break;
}
}
}
//显示4-7
P3=0xfd;
temp=P3;
temp=temp&0xf0;
if(temp!
=0xf0){
delay_ms(5);
temp=P3;
temp=temp&0xf0;
if(temp!
=0xf0){
switch(P3){
case0xed:
NUM=4;break;
case0xdd:
NUM=5;break;
case0xbd:
NUM=6;break;
case0x7d:
NUM=7;break;
}
}
}
//显示8-11
P3=0xfb;
temp=P3;
temp=temp&0xf0;
if(temp!
=0xf0){
delay_ms(5);
temp=P3;
temp=temp&0xf0;
if(temp!
=0xf0){
switch(P3){
case0xeb:
NUM=8;break;
case0xdb:
NUM=9;break;
case0xbb:
NUM=10;break;
case0x7b:
NUM=11;break;
}
}
}
//显示12-15
P3=0xf7;
temp=P3;
temp=temp&0xf0;
if(temp!
=0xf0){
delay_ms(5);
temp=P3;
temp=temp&0xf0;
if(temp!
=0xf0){
switch(P3){
case0xe7:
NUM=12;break;
case0xd7:
NUM=13;break;
case0xb7:
NUM=14;break;
case0x77:
NUM=15;break;
}
}
}
P0=led_dm[NUM];
}
}
第5次实验
1602的时钟显示
//日期位置
#defineYEAR0x80+0x00+0x02
#defineMONTH0x80+0x00+0x07
#defineDAY0x80+0x00+0x0a
//时间位置
#defineHOUR0x80+0x40+0x03
#defineMINUTE0x80+0x40+0x06
#defineSEC0x80+0x40+0x09
sbitRS=P2^0;
sbitRW=P2^1;
sbitE=P2^2;
//时钟初始值
uintcount=0;
uinthours=23;//小时
uintminute=59;//分钟
uintsec=0;//秒
//按钮
sbitmenu=P3^0;//功能键
sbitnext=P3^1;//调上
sbitpre=P3^2;//调下
uintclick=0;
voidwirte_position(ucharindex,ucharvalue);
voidinit();
voiddelay_ms(uint);
voidwrite_common(uchar);
voidwrite_data(uchar);
voidt_init();//定时器初始化50ms
voidshowtime();//显示时间
voidclickDown();//按下按钮
voidaddmin(uintc);
/*
*第一步显示模式设置初始化0x38
*第二步显示开/关光标设置
*第三步光标指针移动左移或右移
*第四步数据指针设置(光标显示位置)
*/
voidmain()
{
t_init();
init();
while
(1)
{
clickDown();
addmin(click);
};
}
voidwrite_data(uchardat)
{
RS=1;
P0=dat;
delay_ms(5);
E=1;
delay_ms(5);
E=0;
}
voidinit()
{
RW=0;//写指令和写数据的状态的状态的都是低电平
write_common(0x38);//1.初始化指令
write_common(0x0c);//2.开显示,显示光标,光标闪烁
write_common(0x06);//3.指针光标加一且左移
//日期初始化
wirte_position(YEAR,'2');
write_data('0');
write_data('1');
write_data('1');
write_data('-');
write_data('1');
write_data('1');
write_data('-');
write_data('1');
write_data('9');
write_data('p');
write_data('m');
//时钟初始化
wirte_position(HOUR,'0');
write_data('0');
write_data(':
');
write_data('0');
write_data('0');
write_data(':
');
write_data('0');
write_data('0');
}
voidwirte_position(ucharindex,ucharvalue)//定位值写入
{
write_common(index);
write_data(value);
}
voidwrite_common(ucharcom)//写入配置
{
RS=0;
P0=com;
delay_ms(5);
E=1;
delay_ms(5);
E=0;
}
voidtimer0()interrupt1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
count++;
if(count==20)
{
count=0;
sec++;
if(sec>59){
sec=0;
minute++;
if(minute>59){
minute=0;
hours++;
if(hours>23){
hours=0;
}
}
}
showtime();
}
}
voidshowtime()//显示时钟
{
wirte_position(HOUR,(hours)/10+0x30);
wirte_position(HOUR+0x01,(hours)%10+0x30);
wirte_position(MINUTE,(minute/10+0x30));
wirte_position(MINUTE+0x01,(minute%10+0x30));
wirte_position(SEC,(sec/10+0x30));
wirte_position(SEC+0x01,(sec%10+0x30));
}
voidclickDown()//功能键按下
{
//staticuintclick=0;
if(menu==0){
delay_ms(5);
if(menu==0){
delay_ms(5);
click++;
if(click==1){
TR0=0;//定时器停止
write_common(0x0f);
write_common(SEC+0x01);
}elseif(click==2){
write_common(MINUTE+0x01);
}elseif(click==3){
write_common(HOUR+0x01);
if(next==0){
delay_ms(5);
if(next==0){
delay_ms(5);
hours++;
showtime();
}
}
if(pre==0){
delay_ms(5);
if(pre==0){
delay_ms(5);
hours--;
showtime();
}
}
}else{
click=0;
TR0=1;
write_common(0x0c);
}
}
}if(menu==0){
delay_ms(5);
while(menu==0);
}
}
voidaddmin(uintc)//增加或者减少键按下
{
switch(c){
case1:
if(next==0){//按下加一
delay_ms(10);
if(next==0){
delay_ms(10);
sec++;
if(sec>59)
sec=0;
showtime();
}
}while(next==0){
delay_ms(5);
};
if(pre==0){//按下减一
delay_ms(10);
if(pre==0){
delay_ms(10);
sec--;
if(sec==-1)
sec=59;
showtime();
}
}while(pre==0){
delay_ms(5);
};
break;
case2:
if(next==0){//按下加一
delay_ms(10);
if(next==0){
delay_ms(10);
minute++;
if(minute>59)
minute=0;
showtime();
write_common(MINUTE+0x01);
}
}while(next==0){
delay_ms(5);
};
if(pre==0){//按下减一
delay_ms(10);
if(pre==0){
delay_ms(10);
minute--;
if(minute==-1)
minute=59;
showtime();
write_common(MINUTE+0x01);
}
}while(pre==0){
delay_ms(5);
};
break;
case3:
if(next==0){//按下加一
delay_ms(10);
if(next==0){
delay_ms(10);
hours++;
if(hours>23)
hours=0;
showtime();
write_common(HOUR+0x01);
}
}while(next==0){
delay_ms(5);
};
if(pre==0){//按下减一
delay_ms(10);
if(pre==0){
delay_ms(10);
hours--;
if(hours==-1)
hours=23;
showtime();
write_common(HOUR+0x01);
}
}while(pre==0){
delay_ms(5);
};
break;
}
}