单片机程序源代码_第1页
单片机程序源代码_第2页
单片机程序源代码_第3页
单片机程序源代码_第4页
单片机程序源代码_第5页
已阅读5页,还剩38页未读 继续免费阅读

下载本文档

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

文档简介

1、.第二章任务一:闪烁广告灯的设计利用89c51单片机的端口控制两个LED(D0和D1),编写程序,实现两个LED互闪。 #include #define uint unsigned int #define uchar unsigned char sbit LED1=P00; sbit LED2=P01; void delayms(uint ms) uint i;while(ms-)for(i=0;iD3-D4-D5 -D6-D7 ,然后再点亮D7-D6-D5-D4 -D3-D2-D1-D0,重复循环。#include#include #define uint unsigned int#defi

2、ne uchar unsigned charuint i;uchar temp;uint a8=0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f;void delayms(uint ms) while(ms-) uint j; for(j=0;j120;j+); void main() while(1) P0=0xfe; while(P0!=0x7f) /P1=temp; /delayms(500); P0=_crol_(P0,1); delayms(250); temp=0x7f; while(P0!=0xfe) P0=temp; delayms(500); t

3、emp=_cror_(temp,1); 任务三:拉幕式与闭幕式广告灯的设计利用89c51单片机的P0端口实现8个LED D0D7的拉幕式与闭幕式广告灯设计。拉幕式: 开始D0D7全灭,延时片刻后首先D3和D4亮,其次是 D2和D5亮,再是D1和D6亮,最后是D0和D7亮。闭幕式:开始D0D7全亮,延时片刻后首先D0和D7灭,其次是 D1和D6灭,再是D2和D5灭,最后是D3和D4灭。#include#define uint unsigned int#define uchar unsigned charuchar code table=0xe7,0xc3,0x81,0x00;void delay

4、(uint x)uint i,j;for(i=x;i0;i-)for(j=120;j0;j-);void main()uint i;while(1)P1=0xff;delay(500);for(i=0;i0;i-)P1=tablei-1;delay(500);任务四:复杂广告灯的设计利用89c51单片机的端口实现8个LED(D0D7)复杂广告灯的控制,要求显示规律为:正向流水-反向流水-隔灯闪烁3次-高四盏、低四盏闪烁2次-隔两盏闪烁3次,再重复循环。 #include #define uint unsigned int #include void delayms(uint ms) uint

5、i;while(ms-) for(i=0;i110;i+); void main() uint i,j,xx2=0xaa,0xff,yy2=0xf0,0x0f,zz2=0xb6,0xff;unsigned char aa; while(1) aa=0xfe; for(i=0;i7;i+) P0=aa; aa=_crol_(aa,1); delayms(500); for(i=0;i8;i+) P0=aa; aa=_cror_(aa,1); delayms(500); for(i=0;i3;i+) for(j=0;j2;j+) P0=xxj; delayms(500); for(i=0;i2;i

6、+) for(j=0;j2;j+) P0=yyj ; delayms(500); for(i=0;i3;i+) for(j=0;j2;j+) P0=zzj ; delayms(500); 任务五:单个LED数码管显示设计使用89c51的P0口作为输出口,外接LED数码管,编写程序,使数码管循环显示从09的加1计数。#include #define uint unsigned int #define uchar unsigned char uchar table10= 0XC0,0XF9,0XA4,0XB0,0X99,0X92,0X82,0XF8,0X80,0X90;uint key=0;voi

7、d int_int()EA=1;IT0=1;EX0=1;void count_num() interrupt 0if(key=9)key=0;else key+;void main()int_int();while(1)P0=tablekey;任务六:多个LED数码管显示设计使用单片机P0和P2口作为输出口,外接一个8位LED数码管,编写程序,使数码管显示“872AF635”。#include#include#define uint unsigned int#define uchar unsigned chardelay(ms) while(ms-) int i; for(i=0;i110;i

8、+); main() uchar a16=0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e;uchar b8=0x08,0x07,0x02,0x0a,0x0f,0x06,0x03,0x05,j;uint i; while(1) j=0x01; for(i=0;i8;i+) P2=j; P0=abi;j=_crol_(j,1);delay(3); 任务七:查询式按键设计将8个按键从18进行编号,如果其中一个键被按下,则在LED数码管上显示相应的键值。#include#define uin

9、t unsigned int#define uchar unsigned charmain() uchar a16=0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e;P0=0xff;while(P0!=0xff) switch(P0)case 0xfe:P2=a1; break;case 0xfd:P2=a2; break;case 0xfb:P2=a3; break;case 0xf7:P2=a4; break;case 0xef:P2=a5; break;case 0xdf:P2=

10、a6; break;case 0xbf:P2=a7; break;case 0x7f:P2=a8; 任务八:LED数码管显示矩阵键盘按键的设计设计一个4*4的矩阵键盘,以P1.0P1.3作为行线,以P1.4P1.7作为列线。要求:未按下按键时,LED数码管显示“-”,按下按键时,在数码管上显示相应的键值。#include#define uchar unsigned char#define uint unsigned intuchar table17=0xbf,0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa

11、1,0x86,0x8e;uint num=0;void delay(uint x)uchar i,j;for(i=x;i0;i-)for(j=120;j0;j-);keyscan() uint temp; temp=P2; temp&=0x0f; if(temp=0x0e) P2=0xf0; temp=P2; temp&=0xf0; switch(temp) case 0xe0:num=1;break; case 0xd0:num=2;break; case 0xb0:num=3;break; case 0x70:num=4; if(temp=0x0d) P2=0xf0; temp=P2; t

12、emp&=0xf0; switch(temp) case 0xe0:num=5;break; case 0xd0:num=6;break; case 0xb0:num=7;break; case 0x70:num=8; if(temp=0x0b) P2=0xf0; temp=P2; temp&=0xf0; switch(temp) case 0xe0:num=9;break; case 0xd0:num=10;break; case 0xb0:num=11;break; case 0x70:num=12; if(temp=0x07) P2=0xf0; temp=P2; temp&=0xf0;

13、switch(temp) case 0xe0:num=13;break; case 0xd0:num=14;break; case 0xb0:num=15;break; case 0x70:num=16; return num;void display(uint num)if(num=0) P0=0xbf; P0=tablenum ;main() uint temp; while(1) P2=0x0f; temp=P2; if(temp!=0x0f) keyscan(); display(num); (2)#include#define uchar unsigned char#define u

14、int unsigned intsbit LED1=P20;sbit LED2=P21;uchar num;uchar code LED_code=0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e;/数码管字形码编码void delay(uint x)uchar i,j;for(i=x;i0;i-)for(j=120;j0;j-);/延时函数void display(uchar num)P0=LED_codenum;/数码管显示函数void keyscan()/键盘扫描函数uchar

15、temp;P1=0xfe;/key1-key4第一行按下temp=P1;temp&=0xf0;if(temp!=0xf0)delay(10);/消除抖动temp=P1;temp&=0xf0;if(temp!=0xf0)temp=P1;switch(temp)case 0xee:num=1;break;case 0xde:num=2;break;case 0xbe:num=3;break;case 0x7e:num=4;break;while(temp!=0xf0)/等待按键释放temp=P1;temp&=0xf0;P1=0xfd;/key5-key8第二行按下temp=P1;temp&=0xf

16、0;if(temp!=0xf0)delay(10);/消除抖动temp=P1;temp&=0xf0;if(temp!=0xf0)temp=P1;switch(temp)case 0xed:num=5;break;case 0xdd:num=6;break;case 0xbd:num=7;break;case 0x7d:num=8;break;while(temp!=0xf0)/等待按键释放temp=P1;temp&=0xf0;P1=0xfb;/key9-key12第三行按下temp=P1;temp&=0xf0;if(temp!=0xf0)delay(10);/消除抖动temp=P1;temp&

17、=0xf0;if(temp!=0xf0)temp=P1;switch(temp)case 0xeb:num=9;break;case 0xdb:num=10;break;case 0xbb:num=11;break;case 0x7b:num=12;break;while(temp!=0xf0)/等待按键释放temp=P1;temp&=0xf0;P1=0xf7;/key13-key16第四行按下temp=P1;temp&=0xf0;if(temp!=0xf0)delay(10);/消除抖动temp=P1;temp&=0xf0;if(temp!=0xf0)temp=P1;switch(temp)

18、case 0xe7:num=13;break;case 0xd7:num=14;break;case 0xb7:num=15;break;case 0x77:num=16;break;while(temp!=0xf0)/等待按键释放temp=P1;temp&=0xf0;void main()while(1)keyscan();if(num=0)P0=0xbf;elsedisplay(num-1);任务九:简单拨号键盘的设计使用4*4的矩阵式键盘及8位共阳极LED数码管设计一个简单拨号键盘,要求在初始状态时,8位数码管均显示“-”,每按下一个号码后,原8位LED数码管显示的内容向左移动1位。#i

19、nclude#include#define uint unsigned int #define uchar unsigned charuchar keycount=0,num;uchar code LED1_code=0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e;/数码管字形码编码uchar LED2_duan8=0xbf,0xbf,0xbf,0xbf,0xbf,0xbf,0xbf,0xbf;/8段共阳数码管编码uchar LED2_wei8= 0x80,0x40,0x20,0x1

20、0,0x08,0x04,0x02,0x01;void delay(uint x)uchar i,j;for(i=x;i0;i-)for(j=120;j0;j-);void display()uchar i;/P2=0x80;for(i=0;i8;i+)P2=LED2_weii;P0=LED2_duan7-i;delay(1);void keyscan()uchar temp;P3=0xfe;temp=P3;temp&=0xf0;if(temp!=0xf0)delay(10);temp=P3;temp&=0xf0;if(temp!=0xf0)temp=P3;switch(temp)case 0x

21、ee:keycount+;num=0;break;case 0xde:keycount+;num=1;break;case 0xbe:keycount+;num=2;break;case 0x7e:keycount+;num=3;break;while(temp!=0xf0)temp=P3;temp&=0xf0;P3=0xfd;temp=P3;temp&=0xf0;if(temp!=0xf0)delay(10);temp=P3;temp&=0xf0;if(temp!=0xf0)temp=P3;switch(temp)case 0xed:keycount+;num=4;break;case 0x

22、dd:keycount+;num=5;break;case 0xbd:keycount+;num=6;break;case 0x7d:keycount+;num=7;break;while(temp!=0xf0)temp=P3;temp&=0xf0;P3=0xfb;temp=P3;temp&=0xf0;if(temp!=0xf0)delay(10);temp=P3;temp&=0xf0;if(temp!=0xf0)temp=P3;switch(temp)case 0xeb:keycount+;num=8;break;case 0xdb:keycount+;num=9;break;case 0x

23、bb:keycount+;num=10;break;case 0x7b:keycount+;num=11;break;while(temp!=0xf0)temp=P3;temp&=0xf0;P3=0xf7;temp=P3;temp&=0xf0;if(temp!=0xf0)delay(10);temp=P3;temp&=0xf0;if(temp!=0xf0)temp=P3;switch(temp)case 0xe7:keycount+;num=12;break;case 0xd7:keycount+;num=13;break;case 0xb7:keycount+;num=14;break;ca

24、se 0x77:keycount+;num=15;break;while(temp!=0xf0)temp=P3;temp&=0xf0;void main()uchar i;while(1)display();keyscan();if(keycount!=0)for(i=0;i右移流水-隔灯闪烁3次花样显示;如果按下K键后,8只LED暂停默认显示,而进行闪烁显示,当显示达到5次后,继续按默认规律显示。 #include #define uint unsigned int #define uchar unsigned char uint LED_table14=0xfe,0xfd,0xfb,0xf

25、7,0xef,0xdf,0xbf,0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd; void delayms(uint ms) uint i;while(ms-)for(i=0;i120;i+); void int_int() EA=1;EX0=1;IT0=1; void LED_shan() interrupt 0 uint k;for(k=0;k5;k+)P0=0xaa;delayms(500);P0=0xff;delayms(500); void main() int_int();while(1) uint i;for(i=0;i14;i+)P0=LED_table

26、i;delayms(500);for(i=0;i3;i+)P0=0xaa;delayms(500);P0=0xff;delayms(500); 任务二:采用外中断控制的条形LED彩灯设计P0端口作为输出口,外接条形LED。编写程序,当按键K未按下时,LED进行循环左移显示。如果第1次按下按键K后,LED进行循环右移显示。如果第2次按下按键K后,LED进行拉幕式与闭幕式花样显示。如果第3次按下按键K后,又恢复循环左移显示。#include unsigned char flag=0;/状态标志位unsigned char led =0;/LED映射位unsigned char table=/花样数

27、组0x00,0x81,0xc3,0xe7,0xff,0xe7,0xc3,0x81;/先闭幕式再开幕式void delayms(unsigned int ms);/延时函数void sysInit(void);/系统初始化void step0(void);/状态0void step1(void);/状态1void step2(void);/状态2void main(void)sysInit();/初始化系统while(1)switch(flag)case 0:step0();break;case 1:step1();break;case 2:step2();break;default:break

28、;P0 = led;/将led值映射到LED灯delayms(500);/延时500msvoid delayms(unsigned int ms)unsigned char i;for (;ms;ms-)for (i=110;i;i-);void sysInit(void)EX0 = 1;/打开外部中断0EA = 1;/打开总中断IT0 = 1;/外部中断0下降沿触发void step0(void)led =1;/右移if (led=0)/溢出处理led = 0x80;void step2(void)static char t;led = tablet+;/开幕闭幕花样显示if (t=8)t

29、= 0;void EX_0() interrupt 0/外部中断0服务函数flag+;if (flag=3)flag = 0;(2)#include/头文件#define uchar unsigned char#define uint unsigned int /宏定义uchar temp,key_count;uchar code tab= /开幕式闭幕式编码0x00,0x81,0xc3,0xe7,0xff,0xe7,0xc3,0x81;void delay(uint ms) /延时子函数uint i,j;for(i=ms;i0;i-)for(j=0;j110;j+);void loop_le

30、ftmove()temp=temp1;if(temp=0)temp=0x80;void open_close()uchar count;temp=tabcount;count+;if(count=8)count=0;void init()EA=1;EX0=1;IT0=1;temp=0;key_count=0;void main()init();while(1)switch(key_count)case 0:loop_leftmove();break;case 1:loop_rightmove();break;case 2:open_close();break;default:break;P0=

31、temp;delay(250);void key_interrupt() interrupt 0/外部中断INT0中断服务程序key_count+;key_count%=3;/*if(key_count=3)key_count=0;*/任务三:采用两个外中断的LED彩灯控制P0端口作为输出口,外接8只LED,P3.2外接按键K1,P3.3外接按键K2。编写程序,没有按下任何按键时,LED隔灯闪烁,当按键K1为奇数次时,LED进行左移流水-右移流水显示。当按下按键K1为偶数次时,LED进行拉幕式显示;当按下按键K2时,LED暂停显示,蜂鸣器发出“叮咚”的开门声音,然后LED继续花样显示(K2按键

32、优先)。#include#include#define uchar unsigned char#define uint unsigned intsbit key1=P32;sbit key2=P33;sbit beep=P10;uchar code tab=0xff,0xe7,0xc3,0x81,0x00,0x81,0xc3,0xe7;/开幕式编码uchar temp=0x01,key_count,flag,right,beep_FG;void delay(uint ms)uint i,j;for(i=ms;i0;i-)for(j=110;j0;j-);void init()EA=1;/打开总

33、中断EX0=1;/打开外部中断INT0EX1=1;/打开外部中断INT1IT0=1;/下降沿触发方式IT1=1;/下降沿触发方式PX0=0;/设置INT0为低中断优先级PX1=1;/设置INT1为高中断优先级void interval_LED()P0=0xff;delay(500);P0=0xaa;delay(500);void left_right_move()if(!right)temp=_crol_(temp,1);elsetemp=_cror_(temp,1);if(temp=0x01)right=0;if(temp=0x80)right=1;void open_LED()uchar

34、count;temp=tabcount+;if(count=8)count=0;void Beep()uchar i,j,k;for(i=100;i;i-)for(j=20;j;j-)for(k=1000;k;k-)beep=beep;/*for(i=100;i;i-)for(j=200;j;j-)for(k=1000;k;k-)beep=beep;*/beep_FG=0;void main()init();beep=0;while(1)if(!flag)interval_LED();else if(beep_FG)Beep();elseswitch(key_count%2)case 1:le

35、ft_right_move();break;/奇数次按键左移右移显示case 0:open_LED();break;/偶数次按键拉幕式显示default:break;P0=temp;delay(400);void key1_interrupt() interrupt 0flag=1;key_count+;void key2_interrupt() interrupt 2flag=1;beep_FG=1;任务四:采用两个外中断实现LED键控移位P0端口作为输出口,外接8只LED,P3.2外接按键K1,P3.3外接按键K2。编写程序,要求实现LED键控移位,按下按键K1时,8只LED左移1位;按下

36、按键K2时,8只LED右移1位。#include#include#define uint unsigned int#define uchar unsigned charuchar key1=0,key2=0,temp1=0,temp2=0,temp11=0,temp12=0;/*void delayms(uint ms)uint i;while(ms-)for(i=0;i120;i+); */void int_int()EA=1;EX0=1;EX1=1;IT0=1;IT1=1;void int0() interrupt 0key1+;void int1() interrupt 2key2+;v

37、oid main()uchar a;int_int();a=0xfe;while(1) if(temp1!=key1)P0 = a;a=_crol_(a,1);temp1=key1;if(temp2!=key2)P0 = a;a=_cror_(a,1);key2=temp2;(2)#include#define uint unsigned int#define uchar unsigned charuchar key1=0,key2=0,m,n,k;uchar table=0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f;void int_int() EA=1;

38、EX0=1; IT0=1;EX1=1;IT1=1;void int0() interrupt 0key1+;m=key1%8;void int2() interrupt 2key2+;n=key2%8;void main()int_int();while(1)k=(m-n+8)%8;P0=tablek; 任务五:采用外中断实现计数使用单片机P0、P2端口作为输出口,外接一个2位LED数码管,P3.2外接按键K1,P3.3外接按键K2。编写程序,每次按下K1时,LED数码管进行加1显示;每次按下按键K2时,LED数码管进行减1显示,计数范围为099。#include/头文件#define uin

39、t unsigned int /宏定义#define uchar unsigned char /宏定义uchar table=0xc0,0xf9,0xa4,0xb0,0x99, 0x92,0x82,0xf8,0x80,0x90;/0-9共阳字型码编码char count=0;uchar shi,ge;void LED_scan()/数码管扫描子函数shi=count/10;/分离十位ge=count%10;/分离个位P2=tablege;/显示个位P0=tableshi;/显示十位void int_int() /初始化EA=1;/打开总中断EX0=1;/打开外部中断0EX1=1;/打开外部中断

40、1IT0=1;/设置下降沿触发方式IT1=1;/设置下降沿触发方式void main()/主函数int_int(); /调用初始化函数while(1)LED_scan();/调用数码管扫描函数void int0() interrupt 0/外部中断0服务程序count+; /计数加1if(count=100) /溢出操作count=0;void int2() interrupt 2/外部中断1服务程序count-;/计数减1if(count0) /溢出操作count=99;(2)#include/头文件#define uint unsigned int /宏定义#define uchar un

41、signed char /宏定义uchar table=0xc0,0xf9,0xa4,0xb0,0x99, 0x92,0x82,0xf8,0x80,0x90;/0-9共阳字型码编码char count=0;uchar shi,ge;void delay(uint ms)/延时子函数uchar i;for(;ms;ms-)for(i=120;i;i-);void LED_scan()/数码管扫描子函数shi=count/10;/分离十位ge=count%10;/分离个位P2=0x01;/个位对应的数码管点亮P0=tablege;/显示个位delay(1);P2=0x02;/十位对应的数码管点亮P0=tableshi;/显示十位delay(1);void int_int() /初始化EA=1;/打开总中断EX0=1;/打开外部中断0EX1=1;/打开外部中断1IT0=1;/设置下降沿触发方式IT1=1;/设置下降沿触发方式void main()/主函数int_int(); /调用初始化函数while(1)LED_scan

温馨提示

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

评论

0/150

提交评论