基本单片机C程序编程分析.ppt

上传人:牧羊曲112 文档编号:5952236 上传时间:2023-09-08 格式:PPT 页数:31 大小:317KB
返回 下载 相关 举报
基本单片机C程序编程分析.ppt_第1页
第1页 / 共31页
基本单片机C程序编程分析.ppt_第2页
第2页 / 共31页
基本单片机C程序编程分析.ppt_第3页
第3页 / 共31页
基本单片机C程序编程分析.ppt_第4页
第4页 / 共31页
基本单片机C程序编程分析.ppt_第5页
第5页 / 共31页
点击查看更多>>
资源描述

《基本单片机C程序编程分析.ppt》由会员分享,可在线阅读,更多相关《基本单片机C程序编程分析.ppt(31页珍藏版)》请在三一办公上搜索。

1、第五部分 基本单片机C程序分析,1、任务:点亮LED灯,在Keil软件编辑窗口输入以下程序:#include sbit P3_0=P30;void main(void)while(1)P3_0=0;,2、任务:闪烁灯,#include void delay02s(void)unsigned char i,j,k;for(i=20;i0;i-)for(j=20;j0;j-)for(k=248;k0;k-);void main(void)while(1)P3_0=0;delay02s();P3_0=1;delay02s();,要求:前面例子是让LED灯亮,现在实现LED灯的闪烁。,3、任务:按键识

2、别,要求:通过按下一次按键INT0,使小灯D1 亮灭交替变换。,实验原理:只要判断P3.2 的电平就可以知道按键是否被按下;而在按键按下的过程中,由于机械抖动,将产生干扰,电平高低变化。可以采用软件滤波的方法去除这些干扰信号,在程序设计时,一旦发现P3.2 为低电平,进入按键判断状态,软件延时10-20ms,从而避开了干扰信号区域,再重新检测P3.2 状态,看按键是否真的已经按下。,参考程序(传统的延时消抖按键程序)include sbit INT_0=P32;/定义按键的输入端 sbit D1=P30;/D1小灯定义void delay10ms(void)/延时程序 unsigned cha

3、r i,j;for(i=20;i0;i-)for(j=248;j0;j-);key()/按键判断程序 if(INT_0=0)/判断是否按下键盘 delay10ms();/延时,软件去干扰if(INT_0=0)/确认按键按下 D1=!D1;/D1亮灭交替变化 while(INT_0=0);/按键锁定,每按一次D1只变化一次,续前页:main()while(1)/永远循环,扫描判断按键是否按下 key();/对于此处CPU只按键判断 一直扫描;,课后请实践:1.用两个按键来控制D1 的亮灭;2.使用一个按键,控制小灯亮的顺序D1D2D3D4D8D7D0 亮重复循环;,4、任务:数码管静态显示,要求

4、:用数码管LED 的个位,静态显示数字“4”字样;,注意:因采用共阴数码显示管,故此图P0口还应接1K或10K的排阻作为上拉电阻。,参考程序:#include sbit GE=P13;code unsigned char seg7code10=0 x3f,0 x06,0 x5b,0 x4f,0 x66,0 x6d,0 x7d,0 x07,0 x7f,0 x6f;/显示段码main()unsigned char display_date=4;/定义并赋值要显示的数据while(1)P0=seg7codedisplay_date;/查表,输出 GE=0;/P13为低电平,相当于把数码管的4H端接地

5、,课后请实践:1.让显示的数据动起来,比如做一个0 到9 的秒表(用软件延时);2.和按键判断程序结合,用按键控制数字变化;,5、任务:数码管动态显示,要求:用数码管LED 的显示四位数据,比如显示数字“1234”;,参考程序:#include sbit qian=P10;sbit bai=P11;sbit shi=P12;sbit ge=P13;code unsigned char seg7code10=0 x3f,0 x06,0 x5b,0 x4f,0 x66,0 x6d,0 x7d,0 x07,0 x7f,0 x6f;/显示段码void Delay(unsigned int tc)/延时

6、程序while(tc!=0)/如果tc为0则终止延时unsigned int i;/局部正整数变量 ifor(i=0;i100;i+);/执行400次将耗时1毫秒tc-;/tc计数减一,续前页:void Led(int date)/显示函数qian=0;/P1.0输出低电平,选通千位数P0=seg7codedate/1000;/取出千位数,查表,输出。Delay(10);/延时qian=1;/销隐bai=0;/P1.1输出低电平,选通百位数P0=seg7codedate%1000/100;/取出百位数,查表,输出。Delay(10);/延时bai=1;/销隐shi=0;/P1.2输出低电平,选

7、通十位数P0=seg7codedate%100/10;/取出十位数,查表,输出。Delay(10);/延时shi=1;/销隐ge=0;/P1.3输出低电平,选通十位数P0=seg7codedate%10;/取出个位数,查表,输出。Delay(10);ge=1;,续前页:main()int display_date=1234;/定义并赋值要显示的数据 while(1)Led(display_date);/调用显示函数显示数据display_date,上述数码管动态显示程序的另一种写法,参考程序:#include unsigned char datebit=0 xfe,0 xfd,0 xfb,0

8、xf7;/存储数码管的位选值unsigned char tvdate=0 x3f,0 x06,0 x5b,0 x4f,0 x66,0 x6d,0 x7d,0 x07,0 x7f,0 x6f,;unsigned int disdata;/定义要显示的数据unsigned char disdat4;/存储要显示的四位数据void delay(time)unsigned char i,j;for(j=0;jtime;j+)for(i=0;i250;i+);display(void)unsigned char k;disdata=1234;/显示1234,续前页:disdat0=disdat/1000

9、;/取出千位disdat1=disdat%1000/100;/取出百位disdat2=disdat%100/10;/取出十位disdat3=disdat%10;/取出个位for(k=0;k4;k+)/显示四位数据 P0=tvdatedisdatk;/送出要显示数据的段码P1=datebitk;/P2位选delay(10);/延时 main()while(1)display();,这种写法比上一种复杂,占用空间要多一些.但是使用方便,可以在此基础上方便的加上比如显示小数点,指定某位数码管闪烁等。课后思考:如何用软件延时来做一个0 到60 秒的计数器吗?,6、任务:4X4矩阵键盘识别,要求:用AT

10、89S51 的并行口P2 接44 矩阵键盘,以P3.0P3.3 作输入线,以P3.4P3.7 作输出线;在每一个数码管上显示每个按键的“0F”序号。,实验原理每个按键有它的行值和列值,行值和列值的组合就是识别这个按键的编码。矩阵的行线和列线分别通过两并行接口和CPU 通信。键盘处理程序的任务是:确定有无键按下,判断哪一个键按下,键的功能是什么;还要消除按键在闭合或断开时的抖动。两个并行口中,一个输出扫描码,使按键逐行动态接地,另一个并行口输入按键状态,由行扫描值和回馈信号共同形成键编码而识别按键,通过软件查表,查出该键的功能。,键盘识别的两种方法,逐行扫描法:(1)首先判断有无键按下:令矩阵行

11、线输出全0信号,检测列线状态,若有一列电平为低,则有键按下。(2)确定闭合键位置:依次将各行线置为低电平,逐行检测各列线的电平状态,若某列为低,则该行线和列线交叉处按键就是闭合键。线反转法:(1)令矩阵键盘列线输出全0信号,行线作为输入接口接收信号,可判断按键处于哪一行。(2)令矩阵键盘行线输出全0信号,列线作为输入接口接收信号,可判断按键处于哪一列。(3)将输入信号相或后形成键盘的唯一键码。,程序:(线反转法)#include unsigned char code seg7code=0 x3f,0 x06,0 x5b,0 x4f,0 x66,0 x6d,0 x7d,0 x07,0 x7f,0

12、 x6f,0 x77,0 x7c,0 x39,0 x5e,0 x79,0 x71;unsigned char k;void delay10ms(void)/延时程序 unsigned char i,j;for(i=20;i0;i-)for(j=248;j0;j-);void Getch()unsigned char X,Y,Z;P2=0 xff;P2=0 x0f;/先对P2置数 行扫描if(P2!=0 x0f)/判断是否有键按下 delay10ms();/延时,软件去干扰 if(P2!=0 x0f)/确认按键按下X=P2;,续前页:X=P2;/保存行扫描时有键按下时状态P2=0 xf0;/列扫

13、描Y=P2;/保存列扫描时有键按下时状态Z=X|Y;/取出键值switch(Z)/判断键值(那一个键按下)case 0 x77:k=0;break;/对键值赋值case 0 x7b:k=1;break;case 0 x7d:k=2;break;case 0 x7e:k=3;break;case 0 xb7:k=4;break;case 0 xbb:k=5;break;case 0 xbd:k=6;break;case 0 xbe:k=7;break;case 0 xd7:k=8;break;case 0 xdb:k=9;break;case 0 xdd:k=10;break;case 0 xd

14、e:k=11;break;case 0 xe7:k=12;break;case 0 xeb:k=13;break;,续前页:case 0 xed:k=14;break;case 0 xee:k=15;break;void main(void)while(1)P2=0 xff;Getch();P0=seg7codek;/查表LED输出 P1=0 xf0;/输出相同的四位数据。,该程序的缺陷:1、虽然线反转法识别键盘的思路正确,但本程序按键扫描中消除按键抖动采用了传统的延时方法,这种办法会使CPU陷入无谓的等待,在延时的过程中CPU无法并行处理其它事件。采用定时扫描法(比如采用定时中断每隔100m

15、s扫描1次键盘),可以解决这一问题;2、如果要求实现“短促”按键和“长按”按键的区分,使程序能应用在功能要求更为复杂的场合,继续编制该程序则有繁琐和可读性变差的缺点。因此有必要采用更为便捷和高效的键值识别算法以实现本程序的功能。,新型键盘识别程序,基本思想:unsigned char Trg;unsigned char Cont;void KeyRead(void)unsigned char ReadData=P30 xff;/1 Trg=ReadData/3 分析:(1)没有按键的时候 ReadData 0 x00;Trg 0 x00;Cont 0 x00;(2)第一次按下按键的情况(假设按

16、键接在P3.0上面)ReadData 0 x01;Trg 0 x01;Cont 0 x01;(3)按键按着不松(长按键)的情况 ReadData 0 x01;Trg 0 x00;Cont 0 x01;(4)按键松开的情况 ReadData 0 x00;Trg 0 x00;Cont 0 x00;,Trg 表示的就是触发的意思,也就是跳变,只要有按键按下,Trg在对应按键的位上面会置1;最关键的地方,Trg 的值每次按下只会出现一次,然后立刻被清除,完全不需要人工去干预。所以按键功能处理程序不会重复执行,省下了一大堆的条件判断,所谓精粹即此!Cont代表的是长按键,如果按键按着不放,那么Cont的

17、值就为 0 x01。,应用一:一次触发的按键处理假设为蜂鸣器按键,按一下,蜂鸣器beep的响一声,#define KEY_BEEP 0 x01 void KeyProc(void)if(Trg/执行蜂鸣器处理函数,应用二:长按键的处理,#define KEY_MODE 0 x01/此模式按键也#define KEY_PLUS 0 x02/此加键也 void KeyProc(void)if(Trg/则执行所需执行之功能程序也,延时消抖问题?真正的单片机入门,是从学会处理多任务开始的。,加入延时消抖程序的架构如下:volatile unsigned char Intrcnt;void Interr

18、uptHandle()/中断服务程序 Intrcnt+;/1ms 中断1次,可变 void main(void)SysInit();while(1)/每20ms 执行一次大循环 KeyRead();/将每个子程序都扫描一遍 KeyProc();Func1();Funt2();while(1)if(Intrcnt20)/一直在等,直到20ms时间到 Intrcnt=0;break;/返回主循环,怎么判断按键释放?再增加一个按键释放检测功能,程序如下:,volatile unsigned char Trg;volatile unsigned char Cont;volatile unsigned

19、char Release;/再增加新功能!void KeyRead(void)unsigned char ReadData=PINB0 xff;/1 读键值 Trg=ReadData/4 得到所有未释放的键值,7、任务:按键中断识别,要求:采用中断技术,每按一下按键,计数器加1,并用LED 显示出来,注意只显示2位十进制数。原理:以上的两个旧式按键识别的实验的程序都是采用扫描的方式来实现的,CPU的利用率比较低;按键判断还可以用中断方式来判断。中断方式可以满足快速响应的要求。,程序:#include unsigned char code table=0 x3f,0 x06,0 x5b,0 x4

20、f,0 x66,0 x6d,0 x7d,0 x07,0 x7f,0 x6f;unsigned char dispcount=0;/计数sbit gewei=P13;/个位选通定义sbit shiwei=P12;/十位选通定义void Delay(unsigned int tc)/延时程序while(tc!=0)unsigned int i;for(i=0;i100;i+);tc-;void ExtInt0()interrupt 0/中断服务程序,续前页:dispcount+;/每按一次中断按键,计数加一if(dispcount=100)/计数范围0-99dispcount=0;void LED

21、()/LED 显示函数if(dispcount=10)/显示两位数shiwei=0;P0=tabledispcount/10;Delay(8);shiwei=1;gewei=0;P0=tabledispcount%10;Delay(5);gewei=1;else/显示一位数,续前页:shiwei=1;gewei=0;P0=tabledispcount;Delay(8);void main()TCON=0 x01;/下降沿触发 IE=0 x81;/开总中断和允许外部中断 while(1)/循环执行 LED();/调用显示函数/*课后思考:在程序在硬件运行过程中,有时候按一下键会加几个数,是因为没

22、有去除按键干扰请您想一想怎么消除抖动./*/,8、任务:数模转换器ADC0804的应用(扩展),要求:从ADC0804的通道IN+输入05V 之间的模拟量,通过ADC0804 转换成数字量在数码管上以十进制形成显示出来。,程序:#include code unsigned char seg7code10=0 x3f,0 x06,0 x5b,0 x4f,0 x66,0 x6d,0 x7d,0 x07,0 x7f,0 x6f;/显示段码sbit int1=P33;/定义管脚功能sbit cs=P32;sbit wr=P36;sbit rd=P37;void Delay(unsigned int t

23、c)/显示延时程序while(tc!=0)unsigned int i;for(i=0;i100;i+);tc-;unsigned char adc0804(void)/读AD0804 子程序 unsigned char addata,i;rd=1;wr=1;int1=1;/读ADC0804 前准备P1=0 xff;/P1 全部置一准备cs=0;wr=0;wr=1;/启动ADC0804 开始测电压while(int1=1);/查询等待A/D 转换完毕产生的INT(低电平有效)信号rd=0;/开始读转换后数据,续前页:i=i;i=i;/无意义语句,用于延时等待ADC0804 读数完毕addata

24、=P1;/读出的数据赋与addatard=1;cs=1;/读数完毕return(addata);/返回最后读出的数据unsigned int datpro(void)/ADC0804 读出的数据处理 unsigned char x;unsigned int dianyah,dianyal;/用于存储读出数据的高字节和低字节unsigned int dianya=0;/存储最后处理完的结果注意数据类型for(x=0;x4;/右移四位取出高四位dianyal=dianya/返回最后处理结果,换为dianya*=196;,续前页:void Led()unsigned int date;date=datpro();/调用数据处理最后结果P2=P2/只需调用显示函数,

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

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号