收藏 分销(赏)

单片机程序源代码.doc

上传人:天**** 文档编号:2040843 上传时间:2024-05-14 格式:DOC 页数:44 大小:159KB 下载积分:12 金币
下载 相关 举报
单片机程序源代码.doc_第1页
第1页 / 共44页
单片机程序源代码.doc_第2页
第2页 / 共44页


点击查看更多>>
资源描述
第二章 任务一:闪烁广告灯的设计 利用89c51单片机的端口控制两个LED(D0和D1),编写程序,实现两个LED互闪。 #include<reg52.h> #define uint unsigned int #define uchar unsigned char sbit LED1=P0^0; sbit LED2=P0^1; void delayms(uint ms) { uint i; while(ms--) { for(i=0;i<120;i++); } } void main() { while(1) { LED1=0; LED2=1; delayms(500); LED1=1; LED2=0; delayms(500); } } 任务二:流水广告灯的设计 利用89c51单片机的端口控制8个LED(D0~D7)循环点亮,刚开始时D0点亮,延时片刻后,接着D1点亮,然后依次点亮D2->D3->D4->D5 ->D6->D7 ,然后再点亮D7->D6->D5->D4 ->D3->D2->D1->D0,重复循环。 #include<reg52.h> #include <intrins.h> #define uint unsigned int #define uchar unsigned char uint i; uchar temp; uint a[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; void delayms(uint ms) { while(ms--) { uint j; for(j=0;j<120;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); temp=_cror_(temp,1); } } } 任务三:拉幕式与闭幕式广告灯的设计 利用89c51单片机的P0端口实现8个LED D0~D7的拉幕式与闭幕式广告灯设计。 拉幕式: 开始D0~D7全灭,延时片刻后首先D3和D4亮,其次是 D2和D5亮,再是D1和D6亮,最后是D0和D7亮。 闭幕式:开始D0~D7全亮,延时片刻后首先D0和D7灭,其次是 D1和D6灭,再是D2和D5灭,最后是D3和D4灭。 #include<reg52.h> #define uint unsigned int #define uchar unsigned char uchar code table[]={0xe7,0xc3,0x81,0x00}; void delay(uint x) { uint i,j; for(i=x;i>0;i--) for(j=120;j>0;j--); } void main() { uint i; while(1) { P1=0xff; delay(500); for(i=0;i<4;i++) { P1=table[i]; delay(500); } for(i=3;i>0;i--) { P1=table[i-1]; delay(500); } } } 任务四:复杂广告灯的设计 利用89c51单片机的端口实现8个LED(D0~D7)复杂广告灯的控制,要求显示规律为:正向流水->反向流水->隔灯闪烁3次->高四盏、低四盏闪烁2次->隔两盏闪烁3次,再重复循环。 #include<reg52.h> #define uint unsigned int #include<intrins.h> void delayms(uint ms) { uint i; while(ms--) { for(i=0;i<110;i++); } } void main() { uint i,j,xx[2]={0xaa,0xff},yy[2]={0xf0,0x0f},zz[2]={0xb6,0xff}; unsigned char aa; while(1) { aa=0xfe; for(i=0;i<7;i++) { P0=aa; aa=_crol_(aa,1); delayms(500); } for(i=0;i<8;i++) { P0=aa; aa=_cror_(aa,1); delayms(500); } for(i=0;i<3;i++) for(j=0;j<2;j++) { P0=xx[j]; delayms(500); } for(i=0;i<2;i++) for(j=0;j<2;j++) { P0=yy[j] ; delayms(500); } for(i=0;i<3;i++) for(j=0;j<2;j++) { P0=zz[j] ; delayms(500); } } } 任务五:单个LED数码管显示设计 使用89c51的P0口作为输出口,外接LED数码管,编写程序,使数码管循环显示从0~9的加1计数。 #include<reg52.h> #define uint unsigned int #define uchar unsigned char uchar table[10]={ 0XC0,0XF9,0XA4,0XB0, 0X99,0X92,0X82,0XF8, 0X80,0X90}; uint key=0; void int_int() { EA=1; IT0=1; EX0=1; } void count_num() interrupt 0 { if(key==9)key=0; else key++; } void main() { int_int(); while(1) { P0=table[key]; } } 任务六:多个LED数码管显示设计 使用单片机P0和P2口作为输出口,外接一个8位LED数码管,编写程序,使数码管显示“872AF635”。 #include<reg52.h> #include<intrins.h> #define uint unsigned int #define uchar unsigned char delay(ms) { while(ms--) { int i; for(i=0;i<110;i++); } } main() { uchar a[16]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e}; uchar b[8]={0x08,0x07,0x02,0x0a,0x0f,0x06,0x03,0x05},j; uint i; while(1) { j=0x01; for(i=0;i<8;i++) { P2=j; P0=a[b[i]]; j=_crol_(j,1); delay(3); } } } 任务七:查询式按键设计 将8个按键从1~8进行编号,如果其中一个键被按下,则在LED数码管上显示相应的键值。 #include<reg52.h> #define uint unsigned int #define uchar unsigned char main() { uchar a[16]={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=a[1]; break; case 0xfd: P2=a[2]; break; case 0xfb: P2=a[3]; break; case 0xf7: P2=a[4]; break; case 0xef: P2=a[5]; break; case 0xdf: P2=a[6]; break; case 0xbf: P2=a[7]; break; case 0x7f: P2=a[8]; } } } 任务八:LED数码管显示矩阵键盘按键的设计 设计一个4*4的矩阵键盘,以P1.0~P1.3作为行线,以P1.4~P1.7作为列线。要求:未按下按键时,LED数码管显示“-”,按下按键时,在数码管上显示相应的键值。 #include<reg52.h> #define uchar unsigned char #define uint unsigned int uchar table[17]={0xbf,0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e}; uint num=0; void delay(uint x) { uchar i,j; for(i=x;i>0;i--) for(j=120;j>0;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; temp&=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; 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=table[num] ; } main() { uint temp; while(1) { P2=0x0f; temp=P2; if(temp!=0x0f) keyscan(); display(num); } } (2) #include<reg52.h> #define uchar unsigned char #define uint unsigned int sbit LED1=P2^0; sbit LED2=P2^1; 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;i>0;i--) for(j=120;j>0;j--); }//延时函数 void display(uchar num) { P0=LED_code[num]; }//数码管显示函数 void keyscan()//键盘扫描函数 { uchar 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&=0xf0; 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&=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) { 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; else display(num-1); } } 任务九:简单拨号键盘的设计 使用4*4的矩阵式键盘及8位共阳极LED数码管设计一个简单拨号键盘,要求在初始状态时,8位数码管均显示“-”,每按下一个号码后,原8位LED数码管显示的内容向左移动1位。 #include<reg52.h> #include<intrins.h> #define uint unsigned int #define uchar unsigned char uchar 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_duan[8]={0xbf,0xbf,0xbf,0xbf,0xbf,0xbf,0xbf,0xbf};//8段共阳数码管编码 uchar LED2_wei[8]= {0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01}; void delay(uint x) { uchar i,j; for(i=x;i>0;i--) for(j=120;j>0;j--); } void display() { uchar i; //P2=0x80; for(i=0;i<8;i++) { P2=LED2_wei[i]; P0=LED2_duan[7-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 0xee: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 0xdd: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 0xbb: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; case 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<7;i++) LED2_duan[i]=LED2_duan[i+1]; LED2_duan[7]=LED1_code[num]; keycount=0; } } } 第五章 任务一:带中断控制的LED花样灯 P0端口作为输出口,外接8只LED,P3.2外接按键K。编写程序,当K未按下时,8只LED进行默认显示,其显示规律为左移流水->右移流水->隔灯闪烁3次花样显示;如果按下K键后,8只LED暂停默认显示,而进行闪烁显示,当显示达到5次后,继续按默认规律显示。 #include<reg52.h> #define uint unsigned int #define uchar unsigned char uint LED_table[14]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd}; void delayms(uint ms) { uint i; while(ms--) for(i=0;i<120;i++); } void int_int() { EA=1; EX0=1; IT0=1; } void LED_shan() interrupt 0 { uint k; for(k=0;k<5;k++) { P0=0xaa; delayms(500); P0=0xff; delayms(500); } } void main() { int_int(); while(1) { uint i; for(i=0;i<14;i++) { P0=LED_table[i]; delayms(500); } for(i=0;i<3;i++) { P0=0xaa; delayms(500); P0=0xff; delayms(500); } } } 任务二:采用外中断控制的条形LED彩灯设计 P0端口作为输出口,外接条形LED。编写程序,当按键K未按下时,LED进行循环左移显示。如果第1次按下按键K后,LED进行循环右移显示。如果第2次按下按键K后,LED进行拉幕式与闭幕式花样显示。如果第3次按下按键K后,又恢复循环左移显示。 #include <reg52.h> unsigned char flag=0; //状态标志位 unsigned char led =0; //LED映射位 unsigned char table[]={ //花样数组 0x00,0x81,0xc3,0xe7, 0xff,0xe7,0xc3,0x81};//先闭幕式再开幕式 void delayms(unsigned int ms); //延时函数 void sysInit(void); //系统初始化 void step0(void); //状态0 void step1(void); //状态1 void step2(void); //状态2 void main(void) { sysInit(); //初始化系统 while(1) { switch(flag) { case 0: step0();break; case 1: step1();break; case 2: step2();break; default:break; } P0 = ~led; //将led值映射到LED灯 delayms(500); //延时500ms } } void delayms(unsigned int ms) { unsigned char i; for (;ms;ms--) for (i=110;i;i--); } void sysInit(void) { EX0 = 1; //打开外部中断0 EA = 1; //打开总中断 IT0 = 1; //外部中断0下降沿触发 } void step0(void) { led <<=1; //左移 if (led==0) //溢出处理 led = 0x01; } void step1(void) { led >>=1; //右移 if (led==0) //溢出处理 led = 0x80; } void step2(void) { static char t; led = table[t++]; //开幕闭幕花样显示 if (t==8) t = 0; } void EX_0() interrupt 0 //外部中断0服务函数 { flag++; if (flag==3) flag = 0; } (2) #include<reg52.h>//头文件 #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;i>0;i--) for(j=0;j<110;j++); } void loop_leftmove() { temp=temp<<1; if(temp==0) temp=0x01; } void loop_rightmove() { temp=temp>>1; if(temp==0) temp=0x80; } void open_close() { uchar count; temp=tab[count]; 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=~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按键优先)。 #include<reg52.h> #include<intrins.h> #define uchar unsigned char #define uint unsigned int sbit key1=P3^2; sbit key2=P3^3; sbit beep=P1^0; 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;i>0;i--) for(j=110;j>0;j--); } void init() { EA=1;//打开总中断 EX0=1;//打开外部中断INT0 EX1=1;//打开外部中断INT1 IT0=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); else temp=_cror_(temp,1); if(temp==0x01) { right=0; } if(temp==0x80) right=1; } void open_LED() { uchar count; temp=tab[count++]; 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(); } else { switch(key_count%2) { case 1: left_right_move(); break;//奇数次按键左移右移显示 case 0: open_LED(); break;//偶数次
展开阅读全文

开通  VIP会员、SVIP会员  优惠大
下载10份以上建议开通VIP会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传

当前位置:首页 > 包罗万象 > 大杂烩

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2026 宁波自信网络信息技术有限公司  版权所有

客服电话:0574-28810668  投诉电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服