Keil及C语言常用程序.docx
- 文档编号:14573336
- 上传时间:2023-06-24
- 格式:DOCX
- 页数:114
- 大小:1.35MB
Keil及C语言常用程序.docx
《Keil及C语言常用程序.docx》由会员分享,可在线阅读,更多相关《Keil及C语言常用程序.docx(114页珍藏版)》请在冰点文库上搜索。
Keil及C语言常用程序
在个人的单片机开发板c语言程序及模块设计总结
*LED显示输出*
很明显,要点亮使发光二极管,必须使单片机的I/O口P1.0输出低电平。
于是我们的任务就是编程序使P1.0输出地电平。
#include
sbitP1_0=P1^0;/*定义p1.0为p1_0*/
sbitP1_1=P2^1;/*定义p2.1为p1_1*/
sbitP1_2=P3^2;/*定义p3.2为p1_2*/
sbitP1_3=P0^3;/*定义p0.3为p1_3*/
main()
{
P1_0=0;/*输出高电平即:
灯亮*/
P1_1=0;
P1_2=0;
P1_3=0;
}
#include
main()
{
P1=0;/*输出高电平*/
P2=0;
P3=0;
P0=0;
AT89S52单片机从简单到复杂程序演示。
一.闪烁灯
[实验任务]
在P1.0端口上接一个发光二极管L1,使L1在不停地一亮一灭,一亮一灭
的时间间隔为0.2秒。
[硬件电路]
与上面点亮小灯的连接完全相同。
#include
del()/*延时0.2秒*/
{
unsignedchari,j,k;
for(i=20;i>0;i--)
for(j=20;j>0;j--)
for(k=248;k>0;k--);
}
sbitP1_0=P1^0;
main()
{
while
(1)/*永远为真,一直执行下去*/
{
P1_0=0;
del();
P1_0=1;
del();
}
}
#include"reg52.h"
//#defineucharunsignedchar
//#defineuintunsignedint
sbitP10=P1^0;
voidmDelay(unsignedintDelay)
{unsignedinti;
for(;Delay>0;Delay--)
{for(i=0;i<124;i++)
{;}
}
}
voidmain()
{for(;;)
{P10=!
P10;//取反P1.0
mDelay(1000);//延时1秒。
如果是2000那么是2秒
}
}
二.广告灯的左移右移
[实验任务]
做广告灯的左移右移,八个发光二极管分别接在单片机的P3.0-P3.7接口
上,输出“0”时,发光二极管亮,开始时P3.0→P3.1→P3.2→P3.3→┅→P3.7
→P3.6→┅→P3.0亮,重复循环。
(当然,四个输出口可以同时实现广告灯)
[硬件电路]
#include
unsignedchari;
unsignedchartemp;
unsignedchara,b;
delay()//延时程序
{unsignedcharm,n,s;
for(m=20;m>0;m--)
for(n=20;n>0;n--)
for(s=248;s>0;s--);
}
main()
{
while
(1)
{
temp=0xfe;
P3=P2=P0=P1=temp;//直接对1/0口p3赋值,使批p3.0输出低电平。
delay();//延时
for(i=1;i<8;i++)//实现广告灯的从右到左移动
{
a=temp<
b=temp>>(8-i);
P3=P2=P0=P1=a|b;
delay();
}
for(i=1;i<8;i++)//实现广告灯的从左到右移动
{
a=temp>>i;
b=temp<<(8-i);
P3=P2=P0=P1=a|b;
delay();
}
}
}
、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、
#include"reg52.h"
#include"intrins.h"
#defineucharunsignedchar
#defineuintunsignedint
voidmDelay(unsignedintDelay)
{unsignedinti;
for(;Delay>0;Delay--)
{for(i=0;i<124;i++)
{;}
}
}
voidmain()
{unsignedcharOutData=0xfe;
for(;;)
{
P1=OutData;
OutData=_crol_(OutData,1);//循环左移
mDelay(1000);//1000延时1s
}
}
\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
#include
unsignedchari;
unsignedchartemp;
unsignedchara,b;
delay()//延时程序
{unsignedcharm,n,s;
for(m=20;m>0;m--)
for(n=20;n>0;n--)
for(s=248;s>0;s--);
}
main()
{
while
(1)
{
temp=0xfe;
P1=temp;//直接对1/0口p3赋值,使批p3.0输出低电平。
delay();//延时
for(i=1;i<8;i++)//实现广告灯的从右到左移动
{
a=temp<
b=temp>>(8-i);
P1=b;
//P1=a|b;
delay();
}
for(i=1;i<8;i++)//实现广告灯的从左到右移动
{
a=temp>>i;
b=temp<<(8-i);
P1=b;
//P1=a|b;
delay();
}
}
}
三.按键识别
[实验任务]
通过按下一次按键,使广告灯向左移动一位,直到最后一位,在向右移动。
[硬件电路]
(大家注意到这一个电路图与上一个实验的电路图只多了一个按键和一个5.1K的电阻。
)
[实验原理]
从图中可以看出P2.1在按键没有按下时接的是高电平,按键按下时接的就是低电平了。
所以我们只要判断P2.1的电平就可以知道按键是否被按下了。
而在按键按下的过程中,由于抖动,将产生干扰,在按下的过程中,一旦有干扰过来,可能造成误触发过程,这并不是我们所想要的。
因此在按键按下的时候,要把我们手上的干扰信号以及按键的机械接触等干扰信号给滤除掉,一般情况下,我们可以采用软件滤波的方法去除这些干扰信号,一般情况下,一个按键按下的时候,总是在按下的时刻存在着一定的干扰信号,按下之后就基本上进入了稳定的状态。
我们在程序设计时,从按键被识别按下之后,延时5ms以上,从而避开了干扰信号区域,我们再来检测一次,看按键是否真得已经按下,若真得已经按下,这时肯定输出为低电平,若这时检测到的是高电平,证明刚才是由于干扰信号引起的误触发,CPU就认为是误触发信号而舍弃这次的按键识别过程。
[C语言源程序]
#include
sbitBY1=P2^1;//定义按键的输入端
unsignedcharcount;//按键计数,每按一下,count加1
unsignedchartemp;
unsignedchara,b;
voiddelay10ms(void)//延时程序
{
unsignedchari,j;
for(i=20;i>0;i--)
for(j=248;j>0;j--);
}
key()//按键判断程序
{
if(BY1==0)//判断是否按下键盘
{
delay10ms();//延时,软件去干扰
if(BY1==0)//确认按键按下
{
count++;//按键计数加1
if(count==8)//计8次重新计数
{count=0;}//将count清零
}
while(BY1==0);//按键锁定,每按一次count只加1.
}
}
move()
{
a=temp< b=temp>>(8-count); P3=a|b; } main() { count=0; temp=0xfe; P3=0xff; P3=temp; while (1) { key(); move(); } } 四.数码管动态显示 [实验任务] P0端口接动态数码管的字形码笔段,P2端口接动态数码管的数位选择端, 动态显示“1234”字样; [硬件电路] 注意: a接P0.0;b接P0.1;c接P0.3…… 注意: 4H接P2.4;3H接P2.5;2H接P2.6;1H接P2.7 [实验原理] 七段LED显示器内部由七个条形发光二极管和一个小圆点发光二极管组成,根据各管的极管的接线形式,可分成共阴极型和共阳极型。 LED数码管的a-dp七个发光二极管因以不同亮暗的组合就能形成不同的字形,这种组合称之为字形码。 下面给出共阴极的字形码: TKVZ, 0123456789abcdef0 0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10,0x08,0x03,0x46,0x21,0x06,0x0e 123456789abcdef [C语言源程序] #include codeunsignedcharseg7code[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92, 0x82,0xf8,0x80,0x90};//显示段码数码管字跟: //0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0x40, //0123456789abcdef0 //0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10,0x08,0x03,0x46,0x21,0x06,0x0e //123456789abcdef Delay(unsignedinttc)//延时程序 { while(tc! =0)//如果tc为0则终止延时 { unsignedinti;//局部正整数变量i for(i=0;i<100;i++);//执行100次将耗时1毫秒 tc--;//tc计数减一 } } voidLed(intdate)//显示函数 { P2=P2&0x7f;//P2.7输出低电平,选通千位数 P0=seg7code[date/1000];//取出千位数,查表,输出。 Delay(8);//延时 P2=P2|0xf0;//销隐 P2=P2&0xbf;//P2.6输出低电平,选通百位数 P0=seg7code[date%1000/100];//取出百位数,查表,输出。 Delay(8);//延时 P2=P2|0xf0;//销隐 P2=P2&0xdf;//P2.5输出低电平,选通十位数 P0=seg7code[date%100/10];//取出十位数,查表,输出。 Delay(8);//延时 P2=P2|0xf0;//销隐 P2=P2&0xef; P0=seg7code[date%10];//取出个位数,查表,输出。 Delay(8); P2=P2|0xf0; } main() { intdisplay_date=1234;//定义并赋值要显示的数据 while (1) { Led(display_date);//调用显示函数显示数据display_date } } 五.4×4矩阵式键盘识别 [实验任务] 用AT89S51的并行口P3接4×4矩阵键盘,以P3.0-P3.3作输入线,以P3.4 -P3.7作输出线;在每一个数码管上显示每个按键的“0-F”序号。 [硬件电路] [实验原理] 每个按键有它的行值和列值,行值和列值的组合就是识别这个按键的编码。 矩阵的行线和列线分别通过两并行接口和CPU通信。 键盘处理程序的任务是: 确 定有无键按下,判断哪一个键按下,键的功能是什么;还要消除按键在闭合或断 开时的抖动。 两个并行口中,一个输出扫描码,使按键逐行动态接地,另一个并 行口输入按键状态,由行扫描值和回馈信号共同形成键编码而识别按键,通过软 件查表,查出该键的功能。 [C语言源程序] #include unsignedcharcodeseg7code[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e}; unsignedchark; voiddelay10ms(void)//延时程序 { unsignedchari,j; for(i=20;i>0;i--) for(j=248;j>0;j--); } voidGetch() {unsignedcharX,Y,Z; P3=0xff; P3=0x0f;//先对P3置数行扫描 if(P3! =0x0f)//判断是否有键按下 {delay10ms();//延时,软件去干扰 if(P3! =0x0f)//确认按键按下X=P3; { X=P3;//保存行扫描时有键按下时状态 P3=0xf0;//列扫描 Y=P3;//保存列扫描时有键按下时状态 Z=X|Y;//取出键值 switch(Z)//判断键值(那一个键按下) { case0xee: k=0;break;//对键值赋值 case0xde: k=1;break; case0xbe: k=2;break; case0x7e: k=3;break; case0xed: k=4;break; case0xdd: k=5;break; case0xbd: k=6;break; case0x7d: k=7;break; case0xeb: k=8;break; case0xdb: k=9;break; case0xbb: k=10;break; case0x7b: k=11;break; case0xe7: k=12;break; case0xd7: k=13;break; case0xb7: k=14;break; case0x77: k=15;break; }}}}//请注意写程序时的格式规范,此处是为了节省纸张 voidmain(void) { while (1) {P3=0xff; Getch(); P0=seg7code[k];//查表LED输出 P2=0x0f;//输出相同的四位数据。 } } 六.按键中断识别 [实验任务] 采用中断技术,每按一下按键,计数器加1,并用LED显示出来。 [硬件电路] 注意: 我们只用4位数码管中的两位。 注意: a接P0.0;b接P0.1;c接P0.3…… 注意: 2H接P2.0;1H接P2.1;中断按键已经接好。 [C语言源程序] #include unsignedcharcodetable[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92, 0x82,0xf8,0x80,0x90}; unsignedchardispcount=0;//计数 sbitgewei=P2^0;//个位选通定义 sbitshiwei=P2^1;//十位选通定义 voidDelay(unsignedinttc)//延时程序 {while(tc! =0) { unsignedinti; for(i=0;i<100;i++); tc--; } } voidExtInt0()interrupt0//中断服务程序 { dispcount++;//每按一次中断按键,计数加一 if(dispcount==100)//计数范围0-99 {dispcount=0;} } voidLED()//LED显示函数 { if(dispcount>=10)//显示两位数 { shiwei=0; P0=table[dispcount/10]; Delay(8); shiwei=1; gewei=0; P0=table[dispcount%10]; Delay(5); gewei=1; } else//显示一位数 { shiwei=1; gewei=0; P0=table[dispcount]; Delay(8); } } voidmain() {TCON=0x01;//中断设置 IE=0x81; while (1)//循环执行 { LED();//只须调用显示函数 } } 七.定时器T0的应用---9.9秒计时设计 [实验任务] 开始时,显示“00”,第1次按下BY1后就开始计时。 第2次按BY1后,计时 停止。 第3次按BY1后,计时归零。 [硬件电路] [C语言源程序] #include unsignedcharcodetable[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92, 0x82,0xf8,0x80,0x90}; unsignedcharsec;//定义计数值,每过1/10秒,sec加一 unsignedcharkeycnt=0; unsignedinttcnt;//键值判断 sbitgewei=P2^0;//个位选通定义 sbitshiwei=P2^1;//十位选通定义 voidDelay(unsignedinttc)//延时程序 { while(tc! =0) { unsignedinti; for(i=0;i<100;i++); tc--; } } voidLED()//LED显示函数 { shiwei=0; P0=table[sec/10]; Delay(8); shiwei=1; gewei=0; P0=table[sec%10]; Delay(5); gewei=1; } voidKEY()//按键扫描程序 { unsignedchari,j; if(P3_0==0) { for(i=20;i>0;i--)//延时去干扰 for(j=248;j>0;j--); if(P3_0==0) { keycnt++; switch(keycnt)//按下次数判断 { case1: //第一次按下 TH0=0x06;//对TH0TL0赋值,并使定时器/计数器工作在方式2与定时状态 TL0=0x06; TR0=1;//开始定时 break; case2: //第二次按下 TR0=0;//定时结束 break; case3: //第三次按下 keycnt=0;//重新开始判断键值 sec=0;//计数重新从零开始 break; } while(P3_0==0); }}}//请注意写程序时的格式规范,此处是为了节省纸张 voidt0(void)interrupt1using0//定时中断服务函数 { tcnt++;//每过250usttcnt加一 if(tcnt==400)//计满400次(1/10秒)时 { tcnt=0;//重新再计 sec++; if(sec==100)//定时10秒,在从零开始计时 { sec=0; } } } voidmain(void) { TMOD=0x02;//定时器工作在方式2 ET0=1;//定时器/计数器中断允许 EA=1;//总中断允许 sec=0; while (1) { KEY(); LED(); } } 八.利用定时器产生乐曲 [实验任务] 利用单片机的I/O口演奏乐曲。 [硬件电路图] [实验原理] 乐曲是按照一定的高低,长短和强弱关系组成的关系,在一首乐曲中,每一个音符与频率有关。 所以我们只要把有关频率的占空比数据做成表格,在通过查表,在I/O口输出相关乐曲的方波,便产生了乐曲。 [C语言源程序] #include"reg52.h"//这样用双引号也可以。 unsignedcharCount; sbit_Speak=P0^0;//讯响器控制脚 unsignedcharcodeSONG[]={//祝你平安 0x26,0x20,0x20,0x20,0x20,0x20,0x26,0x10,0x20,0x10,0x20,0x80,0x26,0x20,0x30,0x20, 0x30,0x20,0x39,0x10,0x30,0x10,0x30,0x80,0x26,0x20,0x20,0x20,0x20,0x20,0x1c,0x20, 0x20,0x80,0x2b,0x20,0x26,0x20,0x20,0x20,0x2b,0x10,0x26,0x10,0x2b,0x80,0x26,0x20, 0x30,0x20,0x30,0x20,0x39,0x10,0x26,0x10,0x26,0x60,0x40,0x10,0x39,0x10,0x26,0x20, 0x30,0x20,0x30,0x20,0x39,0x10,0x26,0x10,0x26,0x80,0x26,0x20,0x2b,0x10,0x2b,0x10, 0x2b,0x20,0x30,0x10,0x39,0x10,0x26,0x10,0x2b,0x10,0x2b,0x20,0x2b,0x40,0x40,0x20, 0x20,0x10,0x20,0x10,0x2b,0x10,0x26,0x30,0x30,0x80,0x18,0x20,0x18,0x20,0x26,0x20, 0x20,0x20,0x20,0x40,0x26,0x20,0x2b,0x20,0x30,0x20,0x30,0x20,0x1c,0x20,0x20,0x20, 0x20,0x80,0x1c,0x20,0x1c,0x20,0x1c,0x20,0x30,0x20,0x30,0x60,0x39,0x10,0x30,0x10,
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Keil 语言 常用 程序