收藏 分享(赏)

51单片机C语言程序设计源代码.doc

上传人:tangtianxu1 文档编号:2977915 上传时间:2018-10-01 格式:DOC 页数:281 大小:132.57KB
下载 相关 举报
51单片机C语言程序设计源代码.doc_第1页
第1页 / 共281页
51单片机C语言程序设计源代码.doc_第2页
第2页 / 共281页
51单片机C语言程序设计源代码.doc_第3页
第3页 / 共281页
51单片机C语言程序设计源代码.doc_第4页
第4页 / 共281页
51单片机C语言程序设计源代码.doc_第5页
第5页 / 共281页
点击查看更多>>
资源描述

1、2018-9-30- 1 -51 单片机 C 语言教程例 2.2.1 编写程序,点亮第一个发光二极管(part2_1.c P27)#include /52 系列单片机头文件sbit led1=P10; /声明单片机 P1 口的第一位void main() /主函数led1=0; /*点亮第一个发光二极管*/例 2.2.2 编写程序,点亮 P1 口的若干二极管(part2_2.c P39)#include /52 系列单片机头文件void main() /主函数P1=0xaa;/while(1);例 2.5.1 利用 for 语句延时特性,编写第一个发光二极管以间隔 1S亮灭闪动的程序(part

2、2_3.c P42 )#include /52 系列单片机头文件#define uint unsigned int /宏定义sbit led1=P10; /声明单片机 P1 口的第一位2018-9-30- 2 -uint i,j;void main() /主函数while(1) /大循环led1=0; /*点亮第一个发光二极管*/for(i=1;i0;i-) /延时for(j=110;j0;j-);led1=1; /*关闭第一个发光二极管*/for(i=1000;i0;i-) /延时for(j=110;j0;j-);例 2.6.1 编写程序使第一个发光二极管以间隔 500ms 亮灭闪动。(pa

3、rt2_4.c P48)#include /52 系列单片机头文件#define uint unsigned int /宏定义sbit led1=P10; /声明单片机 P1 口的第一位void delay1s(); /声明子函数2018-9-30- 3 -void main() /主函数while(1) /大循环led1=0; /*点亮第一个发光二极管*/delay1s(); /调用延时子函数led1=1; /*关闭第一个发光二极管*/delay1s(); /调用延时子函数void delay1s() /子函数体uint i,j;for(i=500;i0;i-)for(j=110;j0;j-

4、);例 2.7.1 编写程序使第一个二极管以亮 200ms、灭 800ms 的方式闪动。(part2_5.c P49)#include /52 系列单片机头文件#define uint unsigned int /宏定义sbit led1=P10; /声明单片机 P1 口的第一位2018-9-30- 4 -void delayms(uint); /声明子函数void main() /主函数while(1) /大循环led1=0; /*点亮第一个发光二极管*/delayms(200); /延时 200 毫秒led1=1; /*关闭第一个发光二极管*/delayms(800); /延时 800 毫

5、秒void delayms(uint xms)uint i,j;for(i=xms;i0;i-) /i=xms 即延时约 xms 毫秒for(j=110;j0;j-);例 2.8.3 利用 C51 自带库_crol_(),以间隔 500ms,实现流水灯程序(part2_6.c P53)#include /52 系列单片机头文件#include #define uint unsigned int /宏定义2018-9-30- 5 -#define uchar unsigned charvoid delayms(uint); /声明子函数uchar aa;void main() /主函数aa=0x

6、fe; /赋初值 11111110 while(1) /大循环P1=aa;delayms(500); /延时 500 毫秒aa=_crol_(aa,1); /将 aa 循环左移 1 位后再赋给 aavoid delayms(uint xms)uint i,j;for(i=xms;i0;i-) /i=xms 即延时约 xms 毫秒for(j=110;j0;j-);2018-9-30- 6 -例 3.2.1 编写程序使第一个数码管显示 8(part2.1_.1c P59)#include /52 系列单片机头文件sbit dula=P26; /申明 U1 锁存器的锁存端sbit wela=P27;

7、 /申明 U2 锁存器的锁存端void main()wela=1; /打开 U2 锁存器P0=0xFE; /送入位选信号wela=0; /关闭 U2 锁存器dula=1; /打开 U1 锁存器P0=0x7F; /送入段选信号dula=0; /关闭 U2 锁存器while(1); /程序停止到这里例 3.2.2 让实验板上 6 个数码管同时点亮,依次显示 0 到 F,时间间隔为 0.5ms,循环下去。 (part2.1_2.c P61)#include /52 系列单片机头文件#define uchar unsigned char#define uint unsigned int2018-9-3

8、0- 7 -sbit dula=P26; /申明 U1 锁存器的锁存端sbit wela=P27; /申明 U2 锁存器的锁存端uchar num;unchar code table=0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71;void delayms(uint);void main()wela=1; /打开 U2 锁存端P0=0xco;/送入位选信号wela=0; /关闭 U2 锁存端while(1)for(num=0;num0;i-) /i=xms 即延时约 xms 毫秒fo

9、r(j=110;j0;j-);例 3.3.1 第一个数码管显示 1,时间为 0.5s,然后关闭它,立即让第二个数码管显示 2,时间为 0.5s,在关闭它一直到最后一个数码管显示 6,时间同样为 0.5s,关闭它之后再回来显示第一个数码管,一直循环下去。 (part2.1_3.c P62)例 3.5.2 用定时器 0 的方式 1 实现第一个发光二极管以 200ms 间隔闪烁,用定时器 1 的方式 1 实现数码管前两位 59s 循环计时。(part2.1_5.c P75)2018-9-30- 9 -例 4.1.1 用数码管前两位显示一个十进制数,变化范围为 0059,开始时显示 00,每按下 S2

10、 键一次,数值加 1;每按下 S3 键一次,数值减 1;每按下 S4 键一次,数值归零;按下 S5 键一次,利用定时器功能使数值开始自动每秒加 1,再次按下 S5 键,数值停止加 1,保持显示原数。 (part2.2_1.c P82)#include /52 系列单片机头文件#define uchar unsigned char#define uint unsigned int sbit key1=P34;sbit key2=P35;sbit key3=P36;sbit key4=P37;sbit dula=P26; /申明 U1 锁存器的锁存端sbit wela=P27; /申明 U2 锁存

11、器的锁存端uchar code table=0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71;void delayms(uint);2018-9-30- 10 -uchar numt0,num;void display(uchar numdis) /显示子函数uchar shi,ge; /分离两个分别要显示的数shi=numdis/10;ge=numdis%10;dula=1;P0=tableshi; /送十位段选数据dula=0;P0=0xff; /送位选数据前关闭所有显示,防止打开

12、位选锁存时wela=1; /原来段选数据通过位选锁存器造成混乱P0=0xfe; /送位选数据wela=0;delayms(5); /延时dula=1;P0=tablege; /送个位段选数据dula=0;P0=0xff;wela=1;2018-9-30- 11 -P0=0xfd;wela=0;delayms(5);void delayms(uint xms)uint i,j;for(i=xms;i0;i-) /i=xms 即延时约 xms 毫秒for(j=110;j0;j-);void init() /初始化函数TMOD=0x01;/设置定时器 0 为工作方式 1(0000 0001)TH0=

13、(65536-45872)/256;/装初值 50ms 一次中断TL0=(65536-45872)%256;EA=1; /开总中断ET0=1; /开定时器 0 中断void keyscan()if(key1=0)2018-9-30- 12 -delayms(10);if(key1=0)num+;if(num=60)/当到 60 时重新归 0num=0;while(!key1);/等待按键释放if(key2=0)delayms(10);if(key2=0)if(num=0)/当到 0 时重新归 60num=60;num-;while(!key2);if(key3=0)2018-9-30- 13

14、-delayms(10);if(key3=0)num=0; /清 0while(!key3);if(key4=0)delayms(10);if(key4=0)while(!key4);TR0=TR0;/启动或停止定时器 0void main()init();/初始化函数while(1) 2018-9-30- 14 -keyscan();display(num);void T0_time() interrupt 1TH0=(65536-45872)/256;/重装初值TL0=(65536-45872)%256;numt0+;if(numt0=20) /如果到了 20 次,说明 1 秒时间到num

15、t0=0; /然后把 num 清 0 重新再计 20 次num+;if(num=60)num=0;例 4.2.1 实验班上电时,数码管不显示,顺序按下矩阵键盘后,数码管上依次显示 0F,六个数码管同时静态显示即可。 (part2.2_2.c P87)#include /52 系列单片机头文件2018-9-30- 15 -#define uchar unsigned char#define uint unsigned int sbit dula=P26; /申明 U1 锁存器的锁存端sbit wela=P27; /申明 U2 锁存器的锁存端uchar code table=0x3f,0x06,0

16、x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71;void delayms(uint xms)uint i,j;for(i=xms;i0;i-) /i=xms 即延时约 xms 毫秒for(j=110;j0;j-);void display(uchar num)P0=tablenum; /显示函数只送段选数据dula=1;dula=0;void matrixkeyscan()2018-9-30- 16 -uchar temp,key;P3=0xfe;temp=P3;temp=tempif(temp!=0xf

17、0)delayms(10);temp=P3;temp=tempif(temp!=0xf0)temp=P3;switch(temp)case 0xee:key=0;break;case 0xde:key=1;break;case 0xbe:2018-9-30- 17 -key=2;break;case 0x7e:key=3;break;while(temp!=0xf0)temp=P3;temp=tempdisplay(key);P3=0xfd;temp=P3;temp=tempif(temp!=0xf0)delayms(10);temp=P3;temp=temp2018-9-30- 18 -if

18、(temp!=0xf0)temp=P3;switch(temp)case 0xed:key=4;break;case 0xdd:key=5;break;case 0xbd:key=6;break;case 0x7d:key=7;break;while(temp!=0xf0)temp=P3;temp=temp2018-9-30- 19 -display(key);P3=0xfb;temp=P3;temp=tempif(temp!=0xf0)delayms(10);temp=P3;temp=tempif(temp!=0xf0)temp=P3;switch(temp)case 0xeb:key=8;

19、break;case 0xdb:key=9;2018-9-30- 20 -break;case 0xbb:key=10;break;case 0x7b:key=11;break;while(temp!=0xf0)temp=P3;temp=tempdisplay(key);P3=0xf7;temp=P3;temp=tempif(temp!=0xf0)delayms(10);2018-9-30- 21 -temp=P3;temp=tempif(temp!=0xf0)temp=P3;switch(temp)case 0xe7:key=12;break;case 0xd7:key=13;break;c

20、ase 0xb7:key=14;break;case 0x77:key=15;break;while(temp!=0xf0)2018-9-30- 22 -temp=P3;temp=tempdisplay(key);void main()P0=0; /关闭所有数码管段选dula=1;dula=0;P0=0xc0;/位选中所有数码管wela=1;wela=0;while(1)matrixkeyscan();/不停调用键盘扫描程序2018-9-30- 23 -例 5.3.1 用单片机控制 ADC0804 进行数模转换,当拧动实验板上A/D 旁边的电位时,在数码管的前三位以十进制方式显示出 A/D 转

21、换后的数字量(8 位 A/D 转换后数值在 0255 变化) 。 (part2.3_1.c P107)#include /52 系列单片机头文件#include #define uchar unsigned char#define uint unsigned int sbit dula=P26; /申明 U1 锁存器的锁存端sbit wela=P27; /申明 U2 锁存器的锁存端sbit adwr=P36; /定义 AD 的 WR 端口sbit adrd=P37; /定义 AD 的 RD 端口uchar code table=0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7

22、d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71;2018-9-30- 24 -void delayms(uint xms)uint i,j;for(i=xms;i0;i-) /i=xms 即延时约 xms 毫秒for(j=110;j0;j-);void display(uchar bai,uchar shi,uchar ge) /显示子函数dula=1;P0=tablebai; /送段选数据dula=0;P0=0xff; /送位选数据前关闭所有显示,防止打开位选锁存时wela=1; /原来段选数据通过位选锁存器造成混乱P0=0x7e; /送位选数据

23、wela=0;delayms(5); /延时dula=1;P0=tableshi;dula=0;2018-9-30- 25 -P0=0xff;wela=1;P0=0x7d;wela=0;delayms(5);dula=1;P0=tablege;dula=0;P0=0xff;wela=1;P0=0x7b;wela=0;delayms(5);void main() / 主程序uchar a,A1,A2,A3,adval;wela=1;2018-9-30- 26 -P0=0x7f; /置 CSAD 为 0,选通 ADCS 以后不必再管 ADCSwela=0;while(1)adwr=1;_nop_(

24、);adwr=0; /启动 AD 转换_nop_();adwr=1;for(a=10;a0;a-) /TX-1C 实验板 AD 工作频率较低,所以启动转换后要多留点时间用来转换 /这里把显示部分放这里的原因也是为了延长转换时间display(A1,A2,A3);P1=0xff; /读取 P1 口之前先给其写全 1 adrd=1; /选通 ADCS_nop_();adrd=0; /AD 读使能_nop_();adval=P1; /AD 数据读取赋给 P1 口2018-9-30- 27 -adrd=1;A1=adval/100; /分出百,十,和个位A2=adval%100/10;A3=adval

25、%10;例 5.5.1 用单片机控制 DAC0832 芯片输出电流,让发光二级管 D12由灭均匀变到最亮,再由最亮均匀熄灭。在最亮和最暗时使用蜂鸣器分别警报一声,完成整个周期时间控制在 5S 左右,循环变化。(part2.3_2.c P121)#include #define uchar unsigned char#define uint unsigned intsbit dula=P26; /申明 U1 锁存器的锁存端sbit wela=P27; /申明 U2 锁存器的锁存端sbit dawr=P36; /定义 DA 的 WR 端口sbit dacs=P32; /定义 DA 的 CS 端口s

26、bit beep=P23; /定义蜂鸣器端口void delayms(uint xms)2018-9-30- 28 -uint i,j;for(i=xms;i0;i-) /i=xms 即延时约 xms 毫秒for(j=110;j0;j-);void main()uchar val,flag;dula=0;wela=0;dacs=0;dawr=0;P0=0;while(1)if(flag=0)val+=5;P0=val; /通过 P0 口给 DA 数据口赋值if(val=255)flag=1;2018-9-30- 29 -beep=0;delayms(100);beep=1;delayms(50);elseval-=5;P0=val; /通过 P0 口给 DA 数据口赋值if(val=0)flag=0;beep=0;delayms(100);beep=1;delayms(50);2018-9-30- 30 -

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

当前位置:首页 > 高等教育 > 专业基础教材

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报