单片机C语言编程基础及实例Word格式.docx

上传人:b****6 文档编号:18666224 上传时间:2022-12-31 格式:DOCX 页数:31 大小:73.76KB
下载 相关 举报
单片机C语言编程基础及实例Word格式.docx_第1页
第1页 / 共31页
单片机C语言编程基础及实例Word格式.docx_第2页
第2页 / 共31页
单片机C语言编程基础及实例Word格式.docx_第3页
第3页 / 共31页
单片机C语言编程基础及实例Word格式.docx_第4页
第4页 / 共31页
单片机C语言编程基础及实例Word格式.docx_第5页
第5页 / 共31页
点击查看更多>>
下载资源
资源描述

单片机C语言编程基础及实例Word格式.docx

《单片机C语言编程基础及实例Word格式.docx》由会员分享,可在线阅读,更多相关《单片机C语言编程基础及实例Word格式.docx(31页珍藏版)》请在冰豆网上搜索。

单片机C语言编程基础及实例Word格式.docx

在某引脚输出高电平的编程方法:

(比如P1.3(PIN4)引脚)

代码

1.#include 

<

AT89x52.h>

 

//该头文档中有单片机内部资源的符号化定义,其中包含P1.3 

2.void 

main( 

void 

) 

//void 

表示没有输入参数,也没有函数返值,这入单片机运行的复位入口 

3.{ 

4. 

P1_3 

1;

//给P1_3赋值1,引脚P1.3就能输出高电平VCC 

5. 

While( 

);

//死循环,相当 

LOOP:

goto 

LOOP;

 

6.} 

注意:

P0的每个引脚要输出高电平时,必须外接上拉电阻(如4K7)至VCC电源。

在某引脚输出低电平的编程方法:

(比如P2.7引脚)

//该头文档中有单片机内部资源的符号化定义,其中包含P2.7 

P2_7 

0;

//给P2_7赋值0,引脚P2.7就能输出低电平GND 

在某引脚输出方波编程方法:

(比如P3.1引脚)

//该头文档中有单片机内部资源的符号化定义,其中包含P3.1 

//非零表示真,如果为真则执行下面循环体的语句 

6.P3_1 

//给P3_1赋值1,引脚P3.1就能输出高电平VCC 

7. 

P3_1 

//给P3_1赋值0,引脚P3.1就能输出低电平GND 

8. 

//由于一直为真,所以不断输出高、低、高、低……,从而形成方波 

9.} 

将某引脚的输入电平取反后,从另一个引脚输出:

(比如P0.4=NOT(P1.1))

//该头文档中有单片机内部资源的符号化定义,其中包含P0.4和P1.1 

P1_1 

//初始化。

P1.1作为输入,必须输出高电平 

5.While( 

6. 

7.if( 

== 

//读取P1.1,就是认为P1.1为输入,如果P1.1输入高电平VCC 

P0_4 

//给P0_4赋值0,引脚P0.4就能输出低电平GND 

9. 

else 

//否则P1.1输入为低电平GND 

10. 

//{ 

11. 

//给P0_4赋值1,引脚P0.4就能输出高电平VCC 

12. 

//由于一直为真,所以不断根据P1.1的输入情况,改变P0.4的输出电平 

13.} 

将某端口8个引脚输入电平,低四位取反后,从另一个端口8个引脚输出:

(比如P2=NOT(P3))

//该头文档中有单片机内部资源的符号化定义,其中包含P2和P3 

P3 

0xff;

P3作为输入,必须输出高电平,同时给P3口的8个引脚输出高电平 

//取反的方法是异或1,而不取反的方法则是异或0 

7.P2 

P3^0x0f 

//读取P3,就是认为P3为输入,低四位异或者1,即取反,然后输出 

//由于一直为真,所以不断将P3取反输出到P2 

一个字节的8位D7、D6至D0,分别输出到P3.7、P3.6至P3.0,比如P3=0x0f,则P3.7、P3.6、P3.5、P3.4四个引脚都输出低电平,而P3.3、P3.2、P3.1、P3.0四个引脚都输出高电平。

同样,输入一个端口P2,即是将P2.7、P2.6至P2.0,读入到一个字节的8位D7、D6至D0。

共9页:

上一页1[2][3][4][5][6][7][8][9]下一页

第一节:

单数码管按键显示

单片机最小系统的硬件原理接线图:

1. 

接电源:

VCC(PIN40)、GND(PIN20)。

加接退耦电容0.1uF

2. 

接晶体:

X1(PIN18)、X2(PIN19)。

注意标出晶体频率(选用12MHz),还有辅助电容30pF

3. 

接复位:

RES(PIN9)。

接上电复位电路,以及手动复位电路,分析复位工作原理

接配置:

EA(PIN31)。

说明原因。

发光二极的控制:

单片机I/O输出

将一发光二极管LED的正极(阳极)接P1.1,LED的负极(阴极)接地GND。

只要P1.1输出高电平VCC,LED就正向导通(导通时LED上的压降大于1V),有电流流过LED,至发LED发亮。

实际上由于P1.1高电平输出电阻为10K,起到输出限流的作用,所以流过LED的电流小于(5V-1V)/10K=0.4mA。

只要P1.1输出低电平GND,实际小于0.3V,LED就不能导通,结果LED不亮。

开关双键的输入:

输入先输出高

一个按键KEY_ON接在P1.6与GND之间,另一个按键KEY_OFF接P1.7与GND之间,按KEY_ON后LED亮,按KEY_OFF后LED灭。

同时按下LED半亮,LED保持后松开键的状态,即ON亮OFF灭。

at89x52.h>

2.#define 

LED 

P1^1 

//用符号LED代替P1_1 

3.#define 

KEY_ON 

P1^6 

//用符号KEY_ON代替P1_6 

4.#define 

KEY_OFF 

P1^7 

//用符号KEY_OFF代替P1_7 

5.void 

//单片机复位后的执行入口,void表示空,无输入参数,无返回值 

6.{ 

//作为输入,首先输出高,接下KEY_ON,P1.6则接地为0,否则输入为1 

//作为输入,首先输出高,接下KEY_OFF,P1.7则接地为0,否则输入为1 

//永远为真,所以永远循环执行如下括号内所有语句 

if( 

KEY_ON==0 

LED=1;

//是KEY_ON接下,所示P1.1输出高,LED亮 

KEY_OFF==0 

LED=0;

//是KEY_OFF接下,所示P1.1输出低,LED灭 

13. 

//松开键后,都不给LED赋值,所以LED保持最后按键状态。

14.//同时按下时,LED不断亮灭,各占一半时间,交替频率很快,由于人眼惯性,看上去为半亮态 

15.} 

数码管的接法和驱动原理

一支七段数码管实际由8个发光二极管构成,其中7个组形构成数字8的七段笔画,所以称为七段数码管,而余下的1个发光二极管作为小数点。

作为习惯,分别给8个发光二极管标上记号:

a,b,c,d,e,f,g,h。

对应8的顶上一画,按顺时针方向排,中间一画为g,小数点为h。

我们通常又将各二极与一个字节的8位对应,a(D0),b(D1),c(D2),d(D3),e(D4),f(D5),g(D6),h(D7),相应8个发光二极管正好与单片机一个端口Pn的8个引脚连接,这样单片机就可以通过引脚输出高低电平控制8个发光二极的亮与灭,从而显示各种数字和符号;

对应字节,引脚接法为:

a(Pn.0),b(Pn.1),c(Pn.2),d(Pn.3),e(Pn.4),f(Pn.5),g(Pn.6),h(Pn.7)。

如果将8个发光二极管的负极(阴极)内接在一起,作为数码管的一个引脚,这种数码管则被称为共阴数码管,共同的引脚则称为共阴极,8个正极则为段极。

否则,如果是将正极(阳极)内接在一起引出的,则称为共阳数码管,共同的引脚则称为共阳极,8个负极则为段极。

以单支共阴数码管为例,可将段极接到某端口Pn,共阴极接GND,则可编写出对应十六进制码的七段码表字节数据如右图:

16键码显示的程序

我们在P1端口接一支共阴数码管SLED,在P2、P3端口接16个按键,分别编号为KEY_0、KEY_1到KEY_F,操作时只能按一个键,按键后SLED显示对应键编号。

SLED 

P1 

KEY_0 

P2^0 

KEY_1 

P2^1 

5.#define 

KEY_2 

P2^2 

6.#define 

KEY_3 

P2^3 

7.#define 

KEY_4 

P2^4 

8.#define 

KEY_5 

P2^5 

9.#define 

KEY_6 

P2^6 

10.#define 

KEY_7 

P2^7 

11.#define 

KEY_8 

P3^0 

12.#define 

KEY_9 

P3^1 

13.#define 

KEY_A 

P3^2 

14.#define 

KEY_B 

P3^3 

15.#define 

KEY_C 

P3^4 

16.#define 

KEY_D 

P3^5 

17.#define 

KEY_E 

P3^6 

18.#define 

KEY_F 

P3^7 

19.Code 

unsigned 

char 

Seg7Code[16]= 

//用十六进数作为数组下标,可直接取得对应的七段编码字节 

20.// 

21.{0x3f, 

0x06, 

0x5b, 

0x4f, 

0x66, 

0x6d, 

0x7d, 

0x07, 

0x7f, 

0x6f, 

0x77, 

0x7c, 

0x39, 

0x5e, 

0x79, 

0x71};

22.void 

) 

23.{ 

24. 

i=0;

//作为数组下标 

25.P2 

//P2作为输入,初始化输出高 

26. 

//P3作为输入,初始化输出高 

27. 

28. 

29. 

i=1;

30. 

i=2;

i=3;

31. 

i=4;

i=5;

32. 

i=6;

i=7;

33. 

i=8;

i=9;

34. 

i=0xA;

i=0xB;

35. 

i=0xC;

i=0xD;

36. 

i=0xE;

i=0xF;

37. 

Seg7Code[ 

];

//开始时显示0,根据i取应七段编码 

38.} 

39.} 

上一页[1]2[3][4][5][6][7][8][9]下一页

第二节:

双数码管可调秒表

解:

只要满足题目要求,方法越简单越好。

由于单片机I/O资源足够,所以双数码管可接成静态显示方式,两个共阴数码管分别接在P1(秒十位)和P2(秒个位)口,它们的共阴极都接地,安排两个按键接在P3.2(十位数调整)和P3.3(个位数调整)上,为了方便计时,选用12MHz的晶体。

为了达到精确计时,选用定时器方式2,每计数250重载一次,即250us,定义一整数变量计数重载次数,这样计数4000次即为一秒。

定义两个字节变量S10和S1分别计算秒十位和秒个位。

编得如下程序:

2.Code 

3.// 

4.{0x3f, 

int 

us250 

s10 

s1 

key10 

//记忆按键状态,为1按下 

key1 

//初始化定时器 

Timer0 

TMOD 

(TMOD 

&

0xF0) 

0x02;

14. 

TH1 

-250;

//对于8位二进数来说,-250=6,也就是加250次1时为256,即为0 

15. 

TR1 

16. 

while

(1){ 

//----------循环1 

17. 

P1 

//显示秒十位 

18. 

P2 

//显示秒个位 

19. 

while( 

){ 

//----------循环2 

20. 

//计时处理 

21.if( 

TF0 

){ 

22. 

23. 

++us250 

>

4000 

25. 

++s1 

10 

++s10 

break;

//结束“循环2”,修改显示 

//按十位键处理 

P3.2 

//P3.2作为输入,先要输出高电平 

//等松键 

key10=0;

37.else{ 

//未按键 

38. 

39. 

40. 

41. 

42. 

43. 

44. 

//按个位键处理 

45. 

P3.3 

//P3.3作为输入,先要输出高电平 

46. 

47.{ 

key1=0;

48. 

49. 

50. 

51. 

52. 

53. 

54. 

//循环2’end 

55. 

}//循环1’end 

56.}//main’end 

上一页[1][2]3[4][5][6][7][8][9]下一页

第三节:

十字路口交通灯

如果一个单位时间为1秒,这里设定的十字路口交通灯按如下方式四个步骤循环工作:

60个单位时间,南北红,东西绿;

λ

10个单位时间,南北红,东西黄;

60个单位时间,南北绿,东西红;

10个单位时间,南北黄,东西红;

用P1端口的6个引脚控制交通灯,高电平灯亮,低电平灯灭。

2.//sbit用来定义一个符号位地址,方便编程,提高可读性,和可移植性 

3.sbit 

SNRed 

=P1^0;

//南北方向红灯 

4.sbit 

SNYellow 

=P1^1;

//南北方向黄灯 

5.sbit 

SNGreen 

=P1^2;

//南北方向绿灯 

6.sbit 

EWRed 

=P1^3;

//东西方向红灯 

7.sbit 

EWYellow 

=P1^4;

//东西方向黄灯 

8.sbit 

EWGreen 

=P1^5;

//东西方向绿灯 

9./* 

用软件产生延时一个单位时间 

*/ 

10.void 

Delay1Unit( 

11.{ 

i, 

j;

for( 

i<

1000;

i++ 

j<

j++ 

//通过实测,调整j循环次数,产生1ms延时 

15.//还可以通过生成汇编程序来计算指令周期数,结合晶体频率来调整j循环次数,接近1ms 

16.} 

17./* 

延时n个单位时间 

18.void 

Delay( 

;

n!

=0;

n-- 

Delay1Unit();

19.void 

20.{ 

21. 

SNRed=0;

SNYellow=0;

SNGreen=1;

EWRed=1;

EWYellow=0;

EWGreen=0;

60 

SNYellow=1;

SNGreen=0;

SNRed=1;

EWRed=0;

EWGreen=1;

EWYellow=1;

28.} 

上一页[1][2][3]4[5][6][7][8][9]下一页

第四节:

数码管驱动

显示“12345678”

P1端口接8联共阴数码管SLED8的段极:

P1.7接段h,…,P1.0接段a

P2端口接8联共阴数码管SLED8的段极:

P2.7接左边的共阴极,…,P2.0接右边的共阴极

方案说明:

晶振频率fosc=12MHz,数码管采用动态刷新方式显示,在1ms定时断服务程序中实现

at89x92.h

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

当前位置:首页 > 工程科技 > 能源化工

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

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