单片机C语言程序设计实训100例--基于8051+PROTEUS仿真1.doc

上传人:yyf 文档编号:8668563 上传时间:2020-12-18 格式:DOC 页数:86 大小:1.94MB
返回 下载 相关 举报
单片机C语言程序设计实训100例--基于8051+PROTEUS仿真1.doc_第1页
第1页 / 共86页
单片机C语言程序设计实训100例--基于8051+PROTEUS仿真1.doc_第2页
第2页 / 共86页
单片机C语言程序设计实训100例--基于8051+PROTEUS仿真1.doc_第3页
第3页 / 共86页
单片机C语言程序设计实训100例--基于8051+PROTEUS仿真1.doc_第4页
第4页 / 共86页
单片机C语言程序设计实训100例--基于8051+PROTEUS仿真1.doc_第5页
第5页 / 共86页
点击查看更多>>
资源描述

《单片机C语言程序设计实训100例--基于8051+PROTEUS仿真1.doc》由会员分享,可在线阅读,更多相关《单片机C语言程序设计实训100例--基于8051+PROTEUS仿真1.doc(86页珍藏版)》请在三一文库上搜索。

1、.单片机C语言程序设计实训100例基于8051+Proteus仿真案例精品.目录第 一 篇 基础程序设计101闪烁的LED102 从左到右的流水灯103 8只LED左右来回点亮204 花样流水灯305 LED模拟交通灯406 单只数码管循环显示09607 8只数码管滚动显示单个数字608 8只数码管动态显示多个不同字符709 8只数码管闪烁显示数字串810 8只数码管滚动显示数字串911 K1-K4 控制LED移位1012 K1-K4 按键状态显示1113 K1-K4 分组控制LED1214 K1-K4 控制数码管移位显示1315 K1-K4 控制数码管加减演示1516 4X4矩阵键盘控制条形

2、LED显示1617 数码管显示4X4矩阵键盘按键号1818 开关控制LED2019 继电器控制照明设备2020 数码管显示拨码开关编码2121 开关控制报警器2222 按键发音2323 播放音乐2424 INT0中断计数2525 外部INT0中断控制LED2626 INT0及INT1中断计数2727 定时器控制单只LED2928 TIMER0控制流水灯3029 定时器控制4个LED滚动闪烁3030 T0控制LED实现二进制计数3131 TIMER0与TIMER1控制条形LED32精品.32 10s的秒表3333 用计数器中断实现100以内的按键计数3534 100 000s以内的计时程序363

3、5 定时器控制数码管动态显示3836 8X8LED点阵显示数字3937 按键控制8X8LED点阵屏显示图形4038 用定时器设计的门铃4139 演奏音阶4240 按键控制定时器选播多段音乐4341 定时器控制交通指示灯4542 报警与旋转灯4743 串行数据转换为并行数据4844 并行数据转换为串行数据4945 甲机通过串口控制乙机LED5046 单片机之间双向通信5247 单片机向主机发送字符串5648 单片机与PC通信57第 二 篇 硬件应用5901 74LS138译码器应用5902 74HC154译码器应用5903 74HC595串入并出芯片应用6004 74LS148扩展中断6106

4、24C04与数码管6507 用6264扩展内存6808 用8255实现接口扩展(仿真未成功)6809 555定时器实验7010 BCD译码数码管显示数字7011 MAX7221控制数码管动态显示7112 LCD1602字符液晶滚动演示程序7219 用ADC0808控制PWM输出7720 ADC0809数模转换与显示78精品.第 一 篇 基础程序设计01闪烁的LED/* 名称:闪烁的LED说明:LED按设定的时间间隔闪烁*/#include#define uchar unsigned char#define uint unsigned intsbit LED=P10;/延时void DelayM

5、S(uint x)uchar i;while(x-)for(i=0;i120;i+);/主程序void main()while(1)LED=LED;DelayMS(150);02 从左到右的流水灯/* 名称:从左到右的流水灯说明:接在P0口的8个LED从左到右循环依次点亮,产生走马灯效果*/#include#include#define uchar unsigned char#define uint unsigned int/延时精品.void DelayMS(uint x)uchar i;while(x-)for(i=0;i120;i+);/主程序void main()P0=0xfe;whi

6、le(1)P0=_crol_(P0,1); /P0的值向左循环移动DelayMS(150);03 8只LED左右来回点亮/* 名称:8只LED左右来回点亮说明:程序利用循环移位函数_crol_和_cror_形成来回滚动的效果*/#include#include#define uchar unsigned char#define uint unsigned int/延时void DelayMS(uint x)uchar i;while(x-)for(i=0;i120;i+);/主程序void main()uchar i;P2=0x01;while(1)精品.for(i=0;i7;i+)P2=_c

7、rol_(P2,1); /P2的值向左循环移动DelayMS(150);for(i=0;i7;i+)P2=_cror_(P2,1); /P2的值向右循环移动DelayMS(150);04 花样流水灯/* 名称:花样流水灯说明:16只LED分两组按预设的多种花样变换显示*/#include#define uchar unsigned char#define uint unsigned intuchar code Pattern_P0= 0xfc,0xf9,0xf3,0xe7,0xcf,0x9f,0x3f,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,

8、0xe7,0xdb,0xbd,0x7e,0xbd,0xdb,0xe7,0xff,0xe7,0xc3,0x81,0x00,0x81,0xc3,0xe7,0xff, 0xaa,0x55,0x18,0xff,0xf0,0x0f,0x00,0xff,0xf8,0xf1,0xe3,0xc7,0x8f,0x1f,0x3f,0x7f, 0x7f,0x3f,0x1f,0x8f,0xc7,0xe3,0xf1,0xf8,0xff,0x00,0x00,0xff,0xff,0x0f,0xf0,0xff, 0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f,0xff,0xff,0xff,0x

9、ff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe, 0xfe,0xfc,0xf8,0xf0,0xe0,0xc0,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xc0,0xe0,0xf0,0xf8,0xfc,0xfe, 0x00,0xff,0x00,0xff,0x00,0xff,0x0

10、0,0xff;uchar code Pattern_P2= 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0xfc,0xf9,0xf3,0xe7,0xcf,0x9f,0x3f,0xff, 0xe7,0xdb,0xbd,0x7e,0xbd,0xdb,0xe7,0xff,0xe7,0xc3,0x81,0x00,0x81,0xc3,0xe7,0xff, 0xaa,0x55,0x18,0xff,0xf0,0x0f,0x00,0xff,0xf8,0xf1,0xe3,0xc7,0x8f,0x1f,0x3f,0x7f, 0x7f,0x3f,0x1f,0x8f,0xc7,0x

11、e3,0xf1,0xf8,0xff,0x00,0x00,0xff,0xff,0x0f,0xf0,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f, 0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0xfc,0xf8,0xf0,0xe0,0xc0,0x80,0x00, 0x0

12、0,0x80,0xc0,0xe0,0xf0,0xf8,0xfc,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0xff,0x00,0xff,0x00,0xff,0x00,0xff精品.;/延时void DelayMS(uint x)uchar i;while(x-)for(i=0;i120;i+);/主程序void main()uchar i;while(1)/从数组中读取数据送至P0和P2口显示for(i=0;i136;i+)P0=Pattern_P0i;P2=Pattern_P2i;DelayMS(100);05 LED模拟交通灯/*

13、名称:LED模拟交通灯说明:东西向绿灯亮若干秒,黄灯闪烁5次后红灯亮, 红灯亮后,南北向由红灯变为绿灯,若干秒后南北向黄灯闪烁5此后变红灯,东西向变绿灯,如此重复。*/#include#define uchar unsigned char#define uint unsigned intsbit RED_A=P00; /东西向灯sbit YELLOW_A=P01;sbit GREEN_A=P02;sbit RED_B=P03; /南北向灯sbit YELLOW_B=P04;sbit GREEN_B=P05;uchar Flash_Count=0,Operation_Type=1; /闪烁次数,

14、操作类型变量精品./延时void DelayMS(uint x)uchar i;while(x-) for(i=0;i120;i+);/交通灯切换void Traffic_Light()switch(Operation_Type)case 1:/东西向绿灯与南北向红灯亮RED_A=1;YELLOW_A=1;GREEN_A=0;RED_B=0;YELLOW_B=1;GREEN_B=1;DelayMS(2000);Operation_Type=2;break;case 2:/东西向黄灯闪烁,绿灯关闭DelayMS(300);YELLOW_A=YELLOW_A;GREEN_A=1;if(+Flash

15、_Count!=10) return; /闪烁5次Flash_Count=0;Operation_Type=3;break;case 3:/东西向红灯,南北向绿灯亮RED_A=0;YELLOW_A=1;GREEN_A=1;RED_B=1;YELLOW_B=1;GREEN_B=0;DelayMS(2000);Operation_Type=4;break;case 4:/南北向黄灯闪烁5次DelayMS(300);YELLOW_B=YELLOW_B;GREEN_B=1;if(+Flash_Count!=10) return;Flash_Count=0;Operation_Type=1;/主程序vo

16、id main()while(1) Traffic_Light();精品.06 单只数码管循环显示09/*名称:单只数码管循环显示09说明:主程序中的循环语句反复将09的段码送至P0口,使数字09循环显示*/#include#include#define uchar unsigned char#define uint unsigned intuchar code DSY_CODE=0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff;/延时void DelayMS(uint x)uchar t;while(x-) for(t=0;t120

17、;t+);/主程序void main()uchar i=0;P0=0x00;while(1) /* for(;i11;i+) P0=DSY_CODEi; DelayMS(300); /注:另一方案 */P0=DSY_CODEi;i=(i+1)%10;DelayMS(300);07 8只数码管滚动显示单个数字/*名称:8只数码管滚动显示单个数字说明:数码管从左到右依次滚动显示07,程序通过每次仅循环选通一只数码管*/#include#include精品.#define uchar unsigned char#define uint unsigned intuchar code DSY_CODE=

18、0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90;/延时void DelayMS(uint x)uchar t;while(x-) for(t=0;t120;t+);/主程序void main()uchar i,wei=0x80;while(1)for(i=0;i8;i+)P2=0xff; /关闭显示wei=_crol_(wei,1);P0=DSY_CODEi; /发送数字段码P2=wei; /发送位码DelayMS(300);08 8只数码管动态显示多个不同字符电路如上图/*名称:8只数码管动态显示多个不同字符说明:数码管动态扫描显示07。*

19、/#include#include#define uchar unsigned char#define uint unsigned intuchar code DSY_CODE=0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90;/延时void DelayMS(uint x)uchar t;while(x-) for(t=0;t120;t+);/主程序void main()精品.uchar i,wei=0x80;while(1)for(i=0;i8;i+)P2=0xff;P0=DSY_CODEi; /发送段码wei=_crol_(wei,1);P

20、2=wei; /发送位码DelayMS(2);09 8只数码管闪烁显示数字串电路如上图/*名称:8只数码管闪烁显示数字串说明:数码管闪烁显示由07构成的一串数字 本例用动态刷新法显示一串数字,在停止刷新时所有数字显示消失。*/#include#define uchar unsigned char#define uint unsigned int/段码表uchar code DSY_CODE=0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90;/位码表uchar code DSY_IDX=0x01,0x02,0x04,0x08,0x10,0x20,

21、0x40,0x80;/延时void DelayMS(uint x)uchar t;while(x-) for(t=0;t120;t+);/主程序void main()uchar i,j;while(1)for(i=0;i30;i+)for(j=0;j8;j+)精品.P0=0xff;P0=DSY_CODEj; /发送段码P2=DSY_IDXj; /发送位码DelayMS(2); P2=0x00; /关闭所有数码管并延时DelayMS(1000);10 8只数码管滚动显示数字串电路如上图/*名称:8只数码管滚动显示数字串说明:数码管向左滚动显示3个字符构成的数字串*/#include#includ

22、e#define uchar unsigned char#define uint unsigned int/段码表uchar code DSY_CODE=0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff;/下面数组看作环形队列,显示从某个数开始的8个数(10表示黑屏)uchar Num=10,10,10,10,10,10,10,10,2,9,8;/延时void DelayMS(uint x)uchar t;while(x-) for(t=0;t120;t+);/主程序void main()uchar i,j,k=0,m=0x80;wh

23、ile(1)/刷新若干次,保持一段时间的稳定显示for(i=0;i15;i+)for(j=0;j8;j+)/发送段码,采用环形取法,从第k个开始取第j个P0=0xff;P0=DSY_CODENum(k+j)%11; m=_crol_(m,1);P2=m; /发送位码精品.DelayMS(2); k=(k+1)%11;/环形队列首支针k递增,Num下标范围010,故对11取余11 K1-K4 控制LED移位/*名称:K1-K4 控制LED移位说明:按下K1时,P0口LED上移一位; 按下K2时,P0口LED下移一位; 按下K3时,P2口LED上移一位; 按下K4时,P2口LED下移一位;*/#i

24、nclude#include#define uchar unsigned char#define uint unsigned int/延时void DelayMS(uint x)uchar i;while(x-) for(i=0;i120;i+);/根据P1口的按键移动LEDvoid Move_LED()if (P1&0x10)=0) P0=_cror_(P0,1); /K1else if(P1&0x20)=0) P0=_crol_(P0,1);/K2else if(P1&0x40)=0) P2=_cror_(P2,1); /K3else if(P1&0x80)=0) P2=_crol_(P2

25、,1);/K4/主程序void main()uchar Recent_Key;/最近按键P0=0xfe;P2=0xfe;P1=0xff;Recent_Key=0xff;while(1)精品.if(Recent_Key!=P1)Recent_Key=P1; /保存最近按键Move_LED();DelayMS(10);12 K1-K4 按键状态显示/*名称:K1-K4 按键状态显示说明:K1、K2按下时LED点亮,松开时熄灭, K3、K4按下并释放时LED点亮,再次按下并释放时熄灭;*/#include#define uchar unsigned char#define uint unsigned

26、 intsbit LED1=P00;sbit LED2=P01;sbit LED3=P02;sbit LED4=P03;sbit K1=P10;sbit K2=P11;sbit K3=P12;sbit K4=P13;/延时void DelayMS(uint x)uchar i;while(x-) for(i=0;i120;i+);/主程序void main()P0=0xff;P1=0xff;while(1)LED1=K1;LED2=K2;if(K3=0)精品.while(K3=0);LED3=LED3;if(K4=0)while(K4=0);LED4=LED4;DelayMS(10);13 K

27、1-K4 分组控制LED/*名称:K1-K4 分组控制LED说明:每次按下K1时递增点亮一只LED,全亮时再次按下则再次循环开始, K2按下后点亮上面4只LED,K3按下后点亮下面4只LED,K4按下后关闭所有LED*/#include#define uchar unsigned char#define uint unsigned int/延时void DelayMS(uint x)uchar i;while(x-) for(i=0;i4;k=0;精品./检查1所在位置,累加获取按键号kwhile(Key_State!=0)k+;Key_State=1;/根据按键号k进行4种处理switch(

28、k)case 1:if(P0=0x00) P0=0xff;P0=1;DelayMS(200);break;case 2:P0=0xf0;break;case 3:P0=0x0f;break;case 4:P0=0xff;14 K1-K4 控制数码管移位显示/*名称:K1-K4 控制数码管移位显示说明:按下K1时加1计数并增加显示位, 按下K2时减1计数并减少显示位, 按下K3时清零。*/#include#define uchar unsigned char#define uint unsigned int/段码uchar code DSY_CODE=0xc0,0xf9,0xa4,0xb0,0x

29、99,0x92,0x82,0xf8,0x80,0x90,0xff;/位码uchar code DSY_Index=0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01;/待显示到各数码管的数字缓冲(开始仅在0位显示0,其他黑屏)uchar Display_Buffer=0,10,10,10,10,10,10,10;精品./延时void DelayMS(uint x)uchar i;while(x-) for(i=0;i120;i+);void Show_Count_ON_DSY()uchar i;for(i=0;i8) Key_Counts=8;Display_Buf

30、ferKey_Counts-1=Key_Counts;break;case 0xfd:if(Key_Counts0)Display_Buffer-Key_Counts=10;break;case 0xfb:Display_Buffer0=0;for(i=1;i8;i+) Display_Bufferi=10;Key_Counts=0;/若键未释放则仅刷新显示,不进行键扫描while(P1!=0xff) Show_Count_ON_DSY();精品.15 K1-K4 控制数码管加减演示/*名称:K1-K4 控制数码管加减演示说明:按下K1后加1计数,按下K2后减1计数,按下K3后清零。*/#in

31、clude#include#define uchar unsigned char#define uint unsigned int/段码uchar code DSY_CODE=0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff;/待显示的3位缓冲uchar Num_Buffer=0,0,0;/按键代码,按键计数uchar Key_Code,Key_Counts=0;/延时void DelayMS(uint x)uchar i;while(x-) for(i=0;i120;i+);/显示函数void Show_Counts_ON_DSY(

32、)uchar i,j=0x01;Num_Buffer2=Key_Counts/100;Num_Buffer1=Key_Counts/10%10;Num_Buffer0=Key_Counts%10;for(i=0;i3;i+)j=_cror_(j,1);P0=0xff;P0=DSY_CODENum_Bufferi;P2=j;DelayMS(1);精品./主程序void main()uchar i;P0=0xff;P1=0xff;P2=0x00;Key_Code=0xff;while(1)Show_Counts_ON_DSY();P1=0xff;Key_Code=P1;/有键按下时,数码管刷新显示

33、30次,该行代码同时起到延时作用if(Key_Code!=0xff)for(i=0;i30;i+) Show_Counts_ON_DSY();switch(Key_Code)case 0xfe:if(Key_Counts0) Key_Counts-;break;case 0xfb:Key_Counts=0;Key_Code=0xff;16 4X4矩阵键盘控制条形LED显示/*名称:4X4矩阵键盘控制条形LED显示说明:运行本例时,按下的按键值越大点亮的LED越多。*/#include#include#define uchar unsigned char精品.#define uint unsig

34、ned int/矩阵键盘按键特征码表uchar code KeyCodeTable=0x11,0x12,0x14,0x18,0x21,0x22,0x24,0x28,0x41,0x42,0x44,0x48,0x81,0x82,0x84,0x88;/延时void DelayMS(uint x)uchar i;while(x-) for(i=0;i120;i+);/键盘扫描uchar Keys_Scan()uchar sCode,kCode,i,k;/低4位置0,放入4行P1=0xf0;/若高4位出现0,则有键按下if(P1&0xf0)!=0xf0)DelayMS(2);if(P1&0xf0)!=0

35、xf0)sCode=0xfe;/行扫描码初值for(k=0;k4;k+)/对4行分别进行扫描P1=sCode;if(P1&0xf0)!=0xf0)kCode=P1;for(i=0;i16;i+)/查表得到按键序号并返回if(kCode=KeyCodeTablei)return(i);elsesCode=_crol_(sCode,1); return(-1);/主程序void main()uchar i,P2_LED,P3_LED;uchar KeyNo=-1;/按键序号,-1表示无按键while(1)精品.KeyNo=Keys_Scan();/扫描键盘获取按键序号KeyNo if(KeyNo!

36、=-1)P2_LED=0xff;P3_LED=0xff;for(i=0;i=KeyNo;i+)/键值越大,点亮的LED越多if(i=1;elseP2_LED=1;P3=P3_LED; /点亮条形LEDP2=P2_LED;17 数码管显示4X4矩阵键盘按键号/*名称:数码管显示4X4矩阵键盘按键号说明:按下任意键时,数码管都会显示其键的序号,扫描程序首先判断按键发生在哪一列,然后根据所发生的行附加不同的值,从而得到按键的序号。*/#include#define uchar unsigned char#define uint unsigned int/段码uchar code DSY_CODE=0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0x00;sbit BEEP=P37;/上次按键和当前按键的序号,该矩

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

当前位置:首页 > 科普知识


经营许可证编号:宁ICP备18001539号-1