基本单片机C程序编程分析.ppt_第1页
基本单片机C程序编程分析.ppt_第2页
基本单片机C程序编程分析.ppt_第3页
基本单片机C程序编程分析.ppt_第4页
基本单片机C程序编程分析.ppt_第5页
已阅读5页,还剩26页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1 TM1 单片机C语言编程基础 成都理工大学工程技术学院 石坚 第五部分 基本单片机C程序分析 1、任务:点亮LED灯 在Keil软件编辑窗口输 入以下程序: #include sbit P3_0=P30; void main(void) while(1) P3_0=0; 2 TM2 单片机C语言编程基础 成都理工大学工程技术学院 石坚 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 TM3 单片机C语言编程基础 成都理工大学工程技术学院 石坚 3、任务:按键识别 要求:通过按下一次按键INT0,使小灯D1 亮灭交替变换。 实验原理: 只要判断P3.2 的电平就可 以知道按键是否被按下; 而在按键按下的过程中, 由于机械抖动,将产生干 扰,电平高低变化。可以 采用软件滤波的方法去除 这些干扰信号,在程序设 计时,一旦发现P3.2 为低 电平,进入按键判断状态 ,软件延时10-20ms,从 而避开了干扰信号区域, 再重新检测P3.2 状态,看 按键是否真的已经按下。 4 TM4 单片机C语言编程基础 成都理工大学工程技术学院 石坚 参考程序(传统的延时消抖按键程序) include sbit INT_0=P32; /定义义按键键的输输入端 sbit D1=P30; /D1小灯定义义 void delay10ms(void) /延时时程序 unsigned char 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只变变化一次 5 TM5 单片机C语言编程基础 成都理工大学工程技术学院 石坚 续前页: main() while(1) /永远远循环环,扫扫描判断按键键是否按下 key(); /对对于此处处CPU只按键键判断 一直扫扫描; 课后请实践: 1.用两个按键来控制D1 的亮灭; 2. 使用一个按键,控制小灯亮的顺序 D1D2D3D4D8D7D0 亮重复循环; 6 TM6 单片机C语言编程基础 成都理工大学工程技术学院 石坚 4、任务:数码管静态显示 要求:用数码管LED 的个位,静态显示数字“4”字样; 注意: 因采用共阴数码显示管,故此图P0口还应接1K或10K的排阻作为上拉电阻。 7 TM7 单片机C语言编程基础 成都理工大学工程技术学院 石坚 参考程序: #include sbit GE=P13; code unsigned char seg7code10=0x3f,0x06,0x5b,0x4f,0x66,0x6d, 0x7d,0x07,0x7f,0x6f; /显显示段码码 main() unsigned char display_date=4; /定义义并赋值赋值 要显显示的数据 while(1) P0=seg7codedisplay_date; /查查表,输输出 GE=0; /P13为为低电电平,相当于把数码码管的4H端接地 课后请实践: 1.让显示的数据动起来,比如做一个0 到9 的秒表(用软件延时); 2.和按键判断程序结合,用按键控制数字变化; 8 TM8 单片机C语言编程基础 成都理工大学工程技术学院 石坚 5、任务:数码管动态显示 要求:用数码管LED 的显示四位数据,比如显示数字“1234”; 参考程序: #include sbit qian=P10; sbit bai=P11; sbit shi=P12; sbit ge=P13; code unsigned char seg7code10=0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f; /显显示段码码 void Delay(unsigned int tc) /延时时程序 while( tc != 0 )/如果tc为为0则终则终 止延时时 unsigned int i;/局部正整数变变量 i for(i=0; i unsigned char datebit=0xfe,0xfd,0xfb,0xf7;/存储数码管的位选值 unsigned char tvdate=0x3f,0x06,0x5b,0x4f,0x66, 0x6d,0x7d,0x07,0x7f,0x6f,; unsigned int disdata; /定义要显示的数据 unsigned char disdat4; /存储要显示的四位数据 void delay(time) unsigned char i,j; for(j=0;j unsigned char code seg7code=0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c, 0x39,0x5e,0x79,0x71; 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=0xff; P2=0x0f; /先对对P2置数 行扫扫描 if(P2!=0x0f) /判断是否有键键按下 delay10ms(); /延时时,软软件去干扰扰 if(P2!=0x0f) /确认认按键键按下X = P2; 16 TM16 单片机C语言编程基础 成都理工大学工程技术学院 石坚 续前页: X=P2; /保存行扫扫描时时有键键按下时时状态态 P2=0xf0; /列扫扫描 Y=P2; /保存列扫扫描时时有键键按下时时状态态 Z=X|Y; /取出键值键值 switch ( Z ) /判断键值键值 (那一个键键按下) case 0x77: k=0; break; /对键值赋值对键值赋值 case 0x7b: k=1; break; case 0x7d: k=2; break; case 0x7e: k=3; break; case 0xb7: k=4; break; case 0xbb: k=5; break; case 0xbd: k=6; break; case 0xbe: k=7; break; case 0xd7: k=8; break; case 0xdb: k=9; break; case 0xdd: k=10;break; case 0xde: k=11;break; case 0xe7: k=12;break; case 0xeb: k=13;break; 17 TM17 单片机C语言编程基础 成都理工大学工程技术学院 石坚 续前页: case 0xed: k=14;break; case 0xee: k=15;break; void main(void) while(1) P2=0xff; Getch( ); P0=seg7codek; /查查表LED输输出 P1=0xf0; /输输出相同的四位数据。 18 TM18 单片机C语言编程基础 成都理工大学工程技术学院 石坚 该程序的缺陷: 1、虽然线反转法识别键盘的思路正确,但本程序按键 扫描中消除按键抖动采用了传统的延时方法,这种办法 会使CPU陷入无谓的等待,在延时的过程中CPU无法并行 处理其它事件。采用定时扫描法(比如采用定时中断每 隔100ms扫描1次键盘),可以解决这一问题; 2、如果要求实现“短促”按键和“长按”按键的区分 ,使程序能应用在功能要求更为复杂的场合,继续编制 该程序则有繁琐和可读性变差的缺点。因此有必要采用 更为便捷和高效的键值识别算法以实现本程序的功能。 19 TM19 单片机C语言编程基础 成都理工大学工程技术学院 石坚 新型键盘识别程序 基本思想: unsigned char Trg; unsigned char Cont; void KeyRead( void ) unsigned char ReadData = P30xff; / 1 Trg = ReadData / 2 Cont = ReadData; / 3 分析: (1) 没有按键的时候 ReadData 0x00;Trg 0x00;Cont 0x00; (2) 第一次按下按键的情况 (假设按键接在P3.0上面) ReadData 0x01;Trg 0x01;Cont 0x01; (3) 按键按着不松(长按键)的情况 ReadData 0x01;Trg 0x00;Cont 0x01; (4) 按键松开的情况 ReadData 0x00;Trg 0x00;Cont 0x00; Trg 表示的就是触发 的意思,也就是跳 变,只要有按键按 下,Trg在对应按键 的位上面会置1;最 关键的地方,Trg 的 值每次按下只会出 现一次,然后立刻 被清除,完全不需 要人工去干预。所 以按键功能处理程 序不会重复执行, 省下了一大堆的条 件判断,所谓精粹 即此!Cont代表 的是长按键,如果 按键按着不放,那 么Cont的值就为 0x01。 20 TM20 单片机C语言编程基础 成都理工大学工程技术学院 石坚 应用一:一次触发的按键处理假设为蜂鸣器按键,按 一下,蜂鸣器beep的响一声 #define KEY_BEEP 0x01 void KeyProc(void) if (Trg / 执行蜂鸣器处理函数 21 TM21 单片机C语言编程基础 成都理工大学工程技术学院 石坚 应用二:长按键的处理 #define KEY_MODE 0x01 / 此模式按键也 #define KEY_PLUS 0x02 / 此加键也 void KeyProc(void) if (Trg / 模式寄存器加1 if (Cont / 则计时 if (cnt_plus 100) / 20ms*100 = 2S 若计时到 Func(); / 则执行所需执行之功能程序也 22 TM22 单片机C语言编程基础 成都理工大学工程技术学院 石坚 延时消抖问题?真正的单片机入门,是从学会处理多任务开始的。 加入延时消抖程序的架构如下: volatile unsigned char Intrcnt; void InterruptHandle() / 中断服务程序 Intrcnt+; / 1ms 中断1次,可变 void main(void) SysInit(); while(1) / 每20ms 执行一次大循环 KeyRead(); / 将每个子程序都扫描一遍 KeyProc(); Func1(); Funt2(); while(1) if (Intrcnt20) / 一直在等,直到20ms时间到 Intrcnt=“0“;break; / 返回主循环 23 TM23 单片机C语言编程基础 成都理工大学工程技术学院 石坚 怎么判断按键释放?再增加一个按键释放检测功能,程序如下: volatile unsigned char Trg; volatile unsigned char Cont; volatile unsigned char Release; / 再增加新功能! void KeyRead( void ) unsigned char ReadData = PINB0xff; / 1 读键值 Trg = ReadData / 2 得到按下触发值 Release= (ReadData Trg Cont); / 3 得到释放触发值 Cont = ReadData; / 4 得到所有未释放的键值 24 TM24 单片机C语言编程基础 成都理工大学工程技术学院 石坚 7、任务:按键中断识别 要求:采用中断技术,每按一下按键,计数器加1,并用LED 显示出来,注意 只显示2位十进制数。 原理:以上的两个旧式按键识别的实验的程序都是采用扫描的方式来实现的 ,CPU的利用率比较低;按键判断还可以用中断方式来判断。中断方式可以满 足快速响应的要求。 25 TM25 单片机C语言编程基础 成都理工大学工程技术学院 石坚 程序: #include unsigned char code table=0x3f,0x06,0x5b,0x4f,0x66, 0x6d,0x7d,0x07,0x7f,0x6f; unsigned char dispcount=0; /计数 sbit gewei=P13; /个位选通定义 sbit shiwei=P12; /十位选通定义 void Delay(unsigned int tc) /延时程序 while( tc != 0 ) unsigned int i; for(i=0; i=10) /显示两位数 shiwei=0; P0=tabledispcount/10; Delay(8); shiwei=1; gewei=0; P0=tabledispcount%10; Delay(5); gewei=1; else /显示一位数 27 TM27 单片机C语言编程基础 成都理工大学工程技术学院 石坚 续前页: shiwei=1; gewei=0; P0=tabledispcount; Delay(8); void main() TCON=0x01; /下降沿触发发 IE=0x81; /开总总中断和允许许外部中断 while(1) /循环执环执 行 LED( ); /调调用显显示函数 /* 课后思考: 在程序在硬件运行过程中,有时候按一下键会加几个数,是因为没有去除按键干 扰请您想一想怎么消除抖动. /* */ 28 TM28 单片机C语言编程基础 成都理工大学工程技术学院 石坚 8、任务:数模转换器ADC0804的应用(扩展) 要求:从ADC0804的通道IN+输入05V 之间的模拟量,通过ADC0804 转换成 数字量在数码管上以十进制形成显示出来。 29 TM29 单片机C语言编程基础 成都理工大学工程技术学院 石坚 程序: #include code unsigned char seg7code10=0x3f,0x06,0x5b,0x4f,0x66, 0x6d,0x7

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论