单片机代码.docx

上传人:b****6 文档编号:4685028 上传时间:2022-12-07 格式:DOCX 页数:28 大小:272.74KB
下载 相关 举报
单片机代码.docx_第1页
第1页 / 共28页
单片机代码.docx_第2页
第2页 / 共28页
单片机代码.docx_第3页
第3页 / 共28页
单片机代码.docx_第4页
第4页 / 共28页
单片机代码.docx_第5页
第5页 / 共28页
点击查看更多>>
下载资源
资源描述

单片机代码.docx

《单片机代码.docx》由会员分享,可在线阅读,更多相关《单片机代码.docx(28页珍藏版)》请在冰豆网上搜索。

单片机代码.docx

单片机代码

注:

一下代码都没有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;

}

}

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高中教育 > 理化生

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1