80C51单片机C语言常用模块子程序.docx
- 文档编号:5002766
- 上传时间:2022-12-12
- 格式:DOCX
- 页数:18
- 大小:18.68KB
80C51单片机C语言常用模块子程序.docx
《80C51单片机C语言常用模块子程序.docx》由会员分享,可在线阅读,更多相关《80C51单片机C语言常用模块子程序.docx(18页珍藏版)》请在冰豆网上搜索。
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;
}
好啦,这些都是我们大学要用到的重要常见的程序模块,大家好好借鉴借鉴啊!
!
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 80 C51 单片机 语言 常用 模块 子程序