80C51单片机C语言常用模块子程序.docx

上传人:b****4 文档编号:5002766 上传时间:2022-12-12 格式:DOCX 页数:18 大小:18.68KB
下载 相关 举报
80C51单片机C语言常用模块子程序.docx_第1页
第1页 / 共18页
80C51单片机C语言常用模块子程序.docx_第2页
第2页 / 共18页
80C51单片机C语言常用模块子程序.docx_第3页
第3页 / 共18页
80C51单片机C语言常用模块子程序.docx_第4页
第4页 / 共18页
80C51单片机C语言常用模块子程序.docx_第5页
第5页 / 共18页
点击查看更多>>
下载资源
资源描述

80C51单片机C语言常用模块子程序.docx

《80C51单片机C语言常用模块子程序.docx》由会员分享,可在线阅读,更多相关《80C51单片机C语言常用模块子程序.docx(18页珍藏版)》请在冰豆网上搜索。

80C51单片机C语言常用模块子程序.docx

80C51单片机C语言常用模块子程序

常见的单片机模块应用程序

武夷学院的同学们,这是你学姐辛辛苦苦积累下来的,我们大学四年要用到的所有80C51单片机的常用模块子程序(都是C语言的哦,我们学校就流行C语言啊,因为汇编的难啊,应该理解的),这里有数码管显示模块、流水灯、监控程序、键盘显示、音频控制模块等。

下面由我来先介绍写基本子程序,都是上述那几个模块要用到的哦。

1、延时子程序设计:

voiddelay(uintt)//延时函数

{

uinti,j;

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

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

}

2、数码管扫描子程序:

ucharkeyscan()

{

chari,j;

j=0;

clear164();

P0=0xff;//清除没有用到的位显示

DIN=0;

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

{

CLK=0;

CLK=1;

DIN=1;

if(key==0)//判断检测端口是否为0,若是就为按键值

{

delay(10);

if(key==0)

{

while(!

key);//松手检测

j=i+1;

}

}

}

returnj;

}

 

3、利用74Ls164输出脉冲继续数码管显示的计数:

voidclear164()//将164输出所以清零

{

chark;

for(k=0;k<8;k++)

{

DIN=1;

CLK=0;

CLK=1;

}

}

4、数码管显示子程序:

voiddisplay(charwei,charshu)

{

ucharm,n;

clear164();

DIN=0;

for(n=wei;n>0;n--)//去掉没有显示的位数

{CLK=0;

CLK=1;

DIN=1;

}

CLK=0;

CLK=1;

P0=table[shu];//显示号码的位数

delay(5);

for(m=8-wei;m>0;m--)//去掉剩下的位数

{

DIN=1;

CLK=0;

CLK=1;

}

}

5、中断子程序:

voidinit()//初始化函数

{

TMOD=0x11;//定时器0工作方式1

TH0=(65535-50000)/256;

TL0=(65535-50000)%256;

EA=1;//开总中断

ET0=1;//开定时器中断

TR0=1;

下面这些是大家将来要用到的重要子模块程序

(1)数码管动态显示模块设计

程序:

#include

#defineuintunsignedint

#defineucharunsignedchar

sbitCLK=P3^4;

sbitDIN=P2^3;

bitflag;

ucharshi,ge;

ucharnum,num1;

ucharcodetable[]={0x03,0x9F,0x25,0x0D,0x99,0x49,0x41,0x1F,0x01,0x09,0x11,0xC1,0x63,0x85,0x61,0x71,0xFD};//0到F的代码

ucharcodetable1[]={0x09,0x99,0x03,0x01,0x9f,0x03,0x25,0x0d};//学号的代码94081013

voidinit();//初始化函数声明

voiddelay(uintt)//延时函数

{

uinti,j;

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

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

}

voidwei(uintx)//数码管第X位显示

{

uchary,z;

for(y=8;y>9-x;y--)

{

DIN=1;

CLK=0;

CLK=1;

}

DIN=0;

CLK=0;

CLK=1;

for(z=8;z>x;z--)

{

DIN=1;

CLK=0;

CLK=1;

}

}

voidmain()

{

init();//初始化

while

(1)

{

uchari;

if(flag==0)

{

shi=num/10;//取倒计时的十位

wei(7);//取数码管第7位

P0=table[shi];//送数据显示

delay

(1);//延时

P0=0xff;//消隐

ge=num%10;//取倒计时的个位

wei(8);//取数码管第8位

P0=table[ge];

delay

(1);

P0=0xff;

}

if(flag==1)

{

for(i=0;i<8;i++)//循环扫描学号

{

wei(i+1);

P0=table1[i];

delay

(1);

P0=0xff;

}

}

}

}

voidtime0()interrupt1//时间为1S的定时器中断函数

{

TH0=(65535-50000)/256;

TL0=(65535-50000)%256;

num1++;

if(num1==20)

{

num1=0;

num--;

if(num<0)

{

TR0=0;//定时器0停止工作

flag=1;//置标志位为1

}

}

}

voidinit()//初始化函数

{

TMOD=0x11;//定时器0工作方式1

TH0=(65535-50000)/256;

TL0=(65535-50000)%256;

EA=1;//开总中断

ET0=1;//开定时器中断

TR0=1;//定时器0开始工作

num=33;//赋倒计时初值

}

(2)单片机并口简单应用(流水灯)

#include

typedefunsignedintunit16;

main()

{

unit16i;

while

(1)

{

P0=0xFE;

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

P0=0xFD;

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

P0=0xFB;

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

P0=0xF7;

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

P0=0xEF;

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

P0=0xDF;

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

P0=0xBF;

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

P0=0x7F;

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

}

}

(3)单片机监控程序设计

#include

#defineuintunsignedint

#defineucharunsignedchar

sbitCLK=P3^4;

sbitDIN=P2^3;

sbitkey=P1^0;

ucharn,num,temp;

ucharcodetable[]={0x03,0x9f,0x25,0x0d,0x99,0x49,0x41,0x1f,0x01,0x09,0xfe};

voiddis(uchara,b);

voiddelay(uintz)

{

uintx,y;

for(x=z;x>0;x--)

for(y=125;y>0;y--);

}

/*

voidinit()

{

tt=0;

EA=1;

TMOD=0x01;

ET0=1;

TR0=1;

TH0=(65536-50000)/256;

TL0=(65536-50000)%256;

}

*/

voiddis(uchara,b)//显示//

{

ucharx,y;

for(y=8;y>9-a;y--)

{

DIN=1;

CLK=0;

CLK=1;

}

DIN=0;

CLK=0;

CLK=1;

for(x=8;x>a;x--)

{

DIN=1;

CLK=0;

CLK=1;

}

P0=table[b];

delay(1000);

P0=0xff;

}

voidone()

{

dis(1,0);

}

voidtwo()

{

dis(2,1);

}

voidthree()

{

dis(3,2);

}

voidfour()

{

dis(4,3);

}

voidfive()

{

dis(5,4);

}

voidsix()

{

dis(6,5);

}

voidseven()

{

dis(7,6);

}

voideight()

{

dis(8,7);

}

voidmain()

{

while

(1)

{

num=27;

for(n=0;n<8;n++)

{

temp=num&0x01;

num>>=1;

if(temp==0x01)

{

switch(n)

{

case0:

one();break;

case1:

two();break;

case2:

three();break;

case3:

four();break;

case4:

five();break;

case5:

six();break;

case6:

seven();break;

case7:

eight();break;

}

}

}

}

}

/*

voidtime0()interrupt1

{

TH0=(65536-50000)/256;

TL0=(65536-50000)%256;

tt++;

}

*/

(4)键盘显示程序设计

#include

#defineuintunsignedint

#defineucharunsignedchar

sbitCLK=P3^4;

sbitDIN=P2^3;

sbitkey=P1^0;

charnum1=0;num=1;num2;

chark;

ucharcodetable[]={

0x03,0x9F,0x25,0x0D,

0x99,0x49,0x41,0x1F,

0x01,0x09,0x11,0xC1,

0x63,0x85,0x61,0x71,0xFE

};//0到F及off的代码

voidwei(ucharx);//声明函数

voiddelay(ucharms);

voiddisplay(charwei,charshu);

voidclear164();

ucharkeyscan();

voidmain()

{

clear164();

wei

(1);

P0=0x03;//初始化显示的数为0,位数为第一位

while

(1)

{

k=keyscan();

switch(k)

{

case8:

{++num2;if(num2>7)num2=0;}break;//最左边按键(原理图中的第七个):

小数点循环移位

case1:

{++num;if(num>7)num=0;};break;//按向右键(原理图中的第六个):

显示数字右移一位

case5:

{num1--;if(num1<0)num1=9;}break;//按向下键:

最右边一位数码管数值减加1(9-0),到0时减1回到9

case4:

{num1++;if(num1>9)num1=0;}break;//按向上键:

最右边一位数码管数值加1(0-9),到9时加1回到0

case7:

{--num;if(num<0)num=7;};break;//按向左键:

显示数字左移一位

}

display(num2,16);

display(num,num1);

delay

(2);

}

}

voidwei(charx)//数码管第X位显示

{charj;

for(j=1;j<9;j++)

{

if(x==j)

{DIN=0;

CLK=0;

CLK=1;

}

else

{

DIN=1;

CLK=0;

CLK=1;

}

}

P0=0xFE;

}

voiddelay(ucharms)//延时子程序(晶振12M)

{

uchari;

while(ms--)

{

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

}

}

ucharkeyscan()

{

chari,j;

j=0;

clear164();

P0=0xff;//清除没有用到的位显示

DIN=0;

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

{

CLK=0;

CLK=1;

DIN=1;

if(key==0)//判断检测端口是否为0,若是就为按键值

{

delay(10);

if(key==0)

{

while(!

key);//松手检测

j=i+1;

}

}

}

returnj;

}

voidclear164()//将164输出所以清零

{

chark;

for(k=0;k<8;k++)

{

DIN=1;

CLK=0;

CLK=1;

}

}

voiddisplay(charwei,charshu)

{

ucharm,n;

clear164();

DIN=0;

for(n=wei;n>0;n--)//去掉没有显示的位数

{

CLK=0;

CLK=1;

DIN=1;

}

CLK=0;

CLK=1;

P0=table[shu];//显示号码的位数

delay(5);

for(m=8-wei;m>0;m--)//去掉剩下的位数

{

DIN=1;

CLK=0;

CLK=1;

}

}

(5)音频控制

#include

#defineuintunsignedint

#defineucharunsignedchar

sbitBEEP=P1^2;

uinth,i;

uinthz;

ucharjiep;

bitflag;

uintcodefre[]={64400,64524,64580,64684,64777,64820,64898,64968,65030,65058,65110,65157,65178,65217};

ucharcodesong[]={6,9,6,3,7,12,6,12,9,12,8,24,6,9,6,3,7,12,

6,12,10,12,9,24,6,9,6,3,13,12,11,12,8,12,7,12,

12,9,12,3,11,12,9,12,10,12,9,24

};//歌谱2个一组(0,0)(音调,节拍)

 

voidinit()//初始化

{

EA=1;

TMOD=0x11;

ET0=1;

ET1=1;

i=0;

flag=1;

}

voidsing()

{if(flag==1)

{

h=song[i];

jiep=song[i+1];

i=i+2;

if(i>46)

i=0;

hz=fre[h];

TH0=(hz)/256;

TL0=(hz)%256;

flag=0;

TR0=1;

TR1=1;

}

}

voidmain()

{

init();

while

(1)

{

sing();

}

}

 

voidtime0()interrupt1//定时器0

{

TH0=(hz)/256;

TL0=(hz)%256;

if(!

flag)BEEP=!

BEEP;

elseTR0=0;

}

 

voidtime1()interrupt3

{

TH1=(15536)/256;

TL1=(15536)%256;

--jiep;

if(jiep==0)

flag=1;

}

好啦,这些都是我们大学要用到的重要常见的程序模块,大家好好借鉴借鉴啊!

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

当前位置:首页 > 求职职场 > 简历

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

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