单片机流水灯c语言实现_第1页
单片机流水灯c语言实现_第2页
单片机流水灯c语言实现_第3页
单片机流水灯c语言实现_第4页
单片机流水灯c语言实现_第5页
已阅读5页,还剩119页未读 继续免费阅读

下载本文档

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

文档简介

实验一闪烁的LedC1小220pU119C2—r220p.2I10k9"C310u29■30■31■D1220RLED-RED1■远4,-5«-6«~7«►XTAL1 P0.0/AD0P0.1/AD1P0.2/AD2XTAl_2 P0.3/AD3P0.4/AD4P0.5/AD5P0.6/AD6RST P0.7/AD7P2.0/A8P2.1/A9P2.2/A10rotlN r^.0/A11ALtEA P2.5/A13P2.6/A14P2.7/A15P1.0 P3.0/RXDP1.1 P3.1/TXDDIO DOO/IMTAr\.c. ro.//IN1Ur1.d ro.o/IIN11r1.4 ro.4/IU।1.0 ।<5<0/11r1.0 ro.O/VVnr1./ rJ.//nUAT89C51■10・11・12・13・14■15■16■17〃名称:闪烁的Led〃说明:Led按设定的时间间隔闪烁,约亮1秒灭1秒// #include<reg51.h>#defineucharunsignedchar//uchar宏定义#defineuintunsignedint〃uint宏定义sbitled=PlA0;//- 〃延时子程序// voiddelayMs(uintx)(uchari;//uchari取值为0-255while(x-)}// 〃主程序// voidmain()(while(l)(led="led;delayMs(2O5O);〃约亮1秒火1秒}实验二 从左到右的流水灯,迪而〃名称:从左到右的流水灯〃说明:接在P0端口的8只Led从左到右循环依次点亮,产生走马灯效果// #include<reg52.h>#include<intrins.h>〃循环左移头文件宏定义#defineucharunsignedchar#defineuintunsignedint// 〃延时函数voiddelayMs(uintx)(uchari;while(x-)for(i=0;i<120;i++);

}// 〃主程序voidmain()P0=0xfe;//P0□初始化值1111.1110while(l)PO=_crol_(PO,l);//PO□循环左移1位delayMs(150);〃晶振为11.0592时,0.1594885秒移动一次}实验三左右来回循环的流水灯U1512U15122而〃名称:左右来回循环的流水灯〃说明:程序利用循环移位函数一<:9|_和/9「形成来回滚动的效果// - #include<reg52.h>#include<intrins.h>#defineucharunsignedchar#defineuintunsignedint//- voiddelayMs(uintx)(uchari;while(x-)for(i=0;i<120;i++);}

//- voidmain()(uchari;P2=0x01;〃P2端口初始化while(l)〃死循环{for(i=0;i<7;i++)〃i自加1,当i=7时执行第二个for语句{P2=_crol_(P2,l);//P2端口循环左移1位delayMs(15O);)for(i=0;i<7;i++){P2=_cror_(P2,l);//P2端口循环右移1位delayMs(150);}}}〃注释for(i=0;i<7;i++).i初始值为0,〃i++就是i自加1,每加一次执行//R2=_crolJP2,l);//P2端口循环左移1位〃delayMs(150);延时〃当i=7时,跳出第一个for语句,〃执行第二个for语句实验四花样流水灯I口工号U1I口工号U1,・,〃名称:花样流水灯〃说明:16只LED分两段组按预设的多种花样变换显示// #include<reg51.h>#defineucharunsignedchar#defineuintunsignedintucharcodepattern_PO[]={Oxfc/Oxf7,Ox5f);///EjZPO显示数组ucharcodepattern_P2[]={0xff,0x07,0xf5};〃定义P2显示数组〃调整数组。里的内容,可以实现自定义的花样显示// voiddelayMs(uintx)(uchari;while(x-)for(i=0;i<120;i++);)// voidmain()(uchari;while(l)(for(i=0;i<7;i++){PO=pattern_PO[i];//i自力「1次,PO数组重新扫描1次P2=pattern_P2[i];//i自加1次,P2数组重新扫描1次delayMs(150);))}〃数组定义格式为//ucharcodepattern_P0[]={0xfc,0xf7};〃uhar为数组类型,pattern_PO数组名称//code数组存储类型〃{0xfc,0xf7}为数组显示参数,为Oxff为全部关闭实验五Led模拟交通灯C2-T-丽C2-T-丽而前po10112131415'AI'Al'Al^AI'AtZAI23.4.5.,6722222201P0P.'//Led模拟交通灯〃说明:东西向绿灯亮若干秒,黄灯闪烁,闪烁5秒后亮红灯,〃红灯亮后,南北向有红灯变为绿灯,若干秒后南北向黄灯闪烁,〃闪烁5次后,亮红灯,东西向绿灯亮,如此重复// #include<reg51.h>#defineucharunsignedchar#defineuintunsignedintsbitred_a=P0A0;sbityellow_a=P0Al;sbitgreen_a=P0A2;sbitred_b=P0A3;sbityellow_b=P0A4;sbitgreen_b=P0A5;//sbit为LED控制位定义ucharFlash_Count=0/Operation_Type=l;//Flash_Count闪烁次数和Operation_Type操作类型变量定义// voiddelayMs(uintx)(uchari;while(x-){for(i=0;i<120;i++);))// 〃交通灯切换子程序voidTraffic_Light()switch(Operation_Type){case1:〃东西向绿灯亮与南北向红灯亮red_a=l;yellow_a=l;green_a=0;red_b=0;yellow_b=l;green_b=l;delayMs(2000);Operation_Type=2;break;case2:〃东西向黄灯开始闪烁,绿灯关闭delayMs(300);yellow_a=!yellow_a;green_a=l;〃黄灯闪烁5次if(++Flash_Count!=10)return;Flash_Count=0;Operation_Type=3;break;case3:〃东西向红灯与南北向绿灯亮red_a=0;yellow_a=l;green_a=l;red_b=l;yellow_b=l;green_b=0;delayMs(2000);Operation_Type=4;break;〃中断case3执彳了case4case4:〃南北向黄灯开始闪烁delayMs(300);yellow__b=!yellow_b;green_b=l;if(++Flash_Count!=10)return;Flash_Count=0;Operation_Type=l;)}// voidmain()(while(l)Traffic_Light();}//switch是多分支选择语句常用格式“switch(表达式)//{case常量表达式1;语句1//case常量表达式2;语句2//case常量表达式3;语句3//case常量表达式n;语句n

“default:语句n+1}“return是返回值,break的返回是指停止这•次执行,返回开始实验六单只数码管循环显示0-901小220p19X1CRYSTAL 18U1►XTAL1XTAL2220pRI10kC310u29・30・2TT01小220p19X1CRYSTAL 18U1►XTAL1XTAL2220pRI10kC310u29・30・2TTT互LRSTPSENALEEAP1.0P1.1P1.2P1.3P1.4P1.5P1.6P1.7P0.0/AD0P0.1/AD1P0.2/AD2P0.3/AD3P0.4/AD4P0.5/AD5P0.6/AD6P0.7/AD7P2.0/A8P2.1/A9P2.2/A10P2.3/A11P2.4/A12P2.5/A13P2.6/A14P2.7/A15P3.0/RXDP3.1/TXDP3.2/INT0P3.3/1NTTP3.4/T0P3.5/T1P3.6WRP3.7/RD287-k54-32-l2-24-ml67-801234-ml£7一

昔34-ZZ-#互铸五#miLzzRP1RESPACK-81-AT89C51〃单只数码管循环显示0-9〃说明:主程序中的循环语句反复将0-9的段码送至P0端口//使数字0—9循环显示// #include<reg51.h>#defineucharunsignedchar#defineuintunsignedintucharcodeDSY_CODE[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,Oxff};〃。内为共阳数码管0-9的编码// voidDelayMs(uintx)(uchari;while(x-)for(i=0;i<120;i++);|// voidmain()uchari=0;

PO=OxOO;while(l)(PO=~DSY_CODE[i];〃显示数组取反i=(i+l)%10;//DelayMs(180);)}〃说明;电路中数码管接法是共阴,段码表是共阳的〃;所以用P0=丫〜DS_CODE[i]语句取反显示实验七8只数码管滚动显示单个不同数字上江圭卫卫孟89012345

O/AI1/AA1A1A1A1A1A12021z3,«$6.7/pPP2P2P2P2P2P2上江圭卫卫孟89012345

O/AI1/AA1A1A1A1A1A12021z3,«$6.7/pPP2P2P2P2P2P2用三极管驱动显示不正常,最好去掉三级管驱动〃8只数码管滚动显示单个不同数字〃说明:数码管从左到右依次滚动显示0--9,〃程序通过每次仅循环选通一只数码管// #include<reg51.h>#include<intrins.h>#defineucharunsignedchar#defineuintunsignedintucharcodeDSY_CODE[]={0xc0z0xf9/0xa4/0xb0/0x99/0x92/0x82,0xf8,0x80,0x90,};〃数组定义// voidDelayMs(uintx)uchari;while(x-)(for(i=0;i<200;i++);)}// voidmain(){uchari,k;k=0x80;//K初始化1000.0000while(l)(for(i=0;i<10;i++){PO=Oxff;〃关闭显示PO=DSY_CODE[i];〃发送数字段码k=_crol_(k」);〃P2=k;所以第1位右移P2=k;〃发送数码管位码,打开对应的数码管DelayMs(300);)}〃i=10是因为数组里有1-9共十个段码〃k=0x80;因为移位P2"8开始,移动一位才开始〃显示第一位实验八8只数码管显示多个不同字符〃8只数码管显示多个不同字符〃说明:数码管动态显示0-7,(刷新快)// #include<reg51.h>#include<intrins.h>#defineucharunsignedchar#defineuintunsignedintucharcodeDSY_CODE[]={0xc0/0xf9/0xa4/0xb0/0x99/0x92,0x82,0xf8,0x80,0x90,Oxff);〃数码管段码数组定义// 〃延时程序voidDelayMs(uintx)(uchari;while(x-)for(i=0;i<120;i++);)// 〃主程序// voidmain()

uchark,m=0x80;〃赋初值while(l)for(k=0;k<8;k++){m=_croljm,l);〃位右移P2=m;〃位码PO=DSY_CODE[k+l];〃段码DelayMs(10);〃延时短))}〃本例刷新速度快!视觉显示多个字符〃如果延时间加长,就是固定位置显示单个字符实验九数码管闪烁显示字符串22%R1—C322%R1—C3而ABCDeFGDP 12345678走上考上龙〃数码管闪烁显示字符串〃说明:数码管闪烁显示由0-7构成的一串数字//本例用动态刷新发法显示一串字符,在停止时所有数字显示消失(区别定义两个数组)#include<reg51.h>#defineucharunsignedchar#defineuintunsignedint〃数字0-9的数码管段码表ucharcodeDSYCODE[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};〃数码管位选通索引表(位码表)ucharcodeDSY_IDX[]={0x01,0x02,0x04,0x08,//0x10,0x20,0x40,0x80};// 〃延时程序// voidDelayMs(uintx)(uchari;while(x-)for(i=0;i<120;i++);}// 〃主程序// voidmain()(uchark,m;〃赋初值PO=Oxff;//PO初始化P2=0x00;//P2初始化while(l){for(k=0;k<30;k++)(for(m=0;m<8;m++)(P2=DSY」DX[m];〃显示位码PO=DSY_CODE[m];〃显示段码DelayMs(20);))P2=0x00;〃位关闭DelayMs(lOOO);)|〃第一个for(k=0水<30;k++)数码管保持显示时间延时〃第二个for(m=0;m<8;m++)位码和段码显示位限制实验十8只数码管滚动显示数字串〃8只数码管滚动显示数字串〃说明:数码管向左滚动显示3个字符构成的字符串#include<reg51.h>#include<intrins.h>#defineucharunsignedchar#defineuintunsignedintucharcodeDSY_CODE[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,Oxff};〃程序将下面数组看成环形队列显示从〃某个数开始的8个数(10表示黑屏)ucharNum[]={10,10,10,10,10,10,10,10,2,8,9};// voidDelayMs(uintx)(uchari;while(x-)for(i=0;i<120;i++);)// voidmain()uchar;PO=Oxff;

P2=0x00;m=0x80;k=0;while(l){for(i=0;i<10;i++)〃显示保持{for(j=0;j<8;j++)(P2=m;〃采用环形取法从第K开始取J个PO=DSY_CODE[Num[(k+j)%ll]];DelayMs(2);)}〃环形队列首指针K递增,Num的下表范围为1/0--10因此对11求余k=(k+l)%ll;||〃在用软件仿真是最好不要加三极管驱动!因程序运行占用CPU资源,运行不正常实验HK1-K4控制LEd移位HH-r-22QP_I_,HH-r-22QP_I_,・・・・・〃名称:K1-K4控制LEd移位〃说明:按下kl时,〃说明:按下kl时,〃说明:按下k2时,〃说明:按下k3时,〃说明:按下k4时,PO端口PO端口P2端口P2端口LEDLEDLEDLED向上移动一位向下移动一位向上移动一位向下移动一位// #include<reg51.h>#include<intrins.h>#defineucharunsignedchar#defineuintunsignedint// voidDelayMs(uintx)(uchari;while(x--)(for(i=0;i<120;i++);}|// 〃根据Pl端口的按键移动LEDvoidmove_LED(){if((Pl&OxlO)==O)PO=_cror_(PO,l);//kl键PO左移elseif((Pl&Ox2O)==O)P0=_crol_(P0,l);//k2键PO右移elseif((Pl&0x40)==0)P2=_cror_(P2,l);//k3键P2左移elseif((Pl&0x80)==0)P2=_crol_(P2,l);//k4键P2右移}〃P1端口值初始化为1,有建按下对应键值为0〃对应键值PO、P2的Led移位// voidmain(){ucharRecent_key;PO=Oxfe;Pl=Oxff;P2=Oxfe;Recent_key=Oxff;〃按键初始化为高电平while(l){if(Recent_key!=Pl)〃判断是否有键按下{Recent_key=Pl;〃保存最近按键值move_LED();〃根据P1端口的按键移动LEDDelayMs(lO);))|〃调整延时值,可改变流水灯流动速度实验十二K1-K4按键状态显示>XTAL1XTAL2RSTPSENALEEAU1QJ234567PO.O/AtX)PO.1/AD1P0.2/AD2P0.3/AD3P0.4/AD4P0.5/AD5P0.6/AD6P0.7/AD7P2.0/A8P2.1/A9P2.2/A10P2.3/A11P2.4/A12P2.5/A13P2.6/A14P2.7/A15P3.0/RXDP3.1/TXDP3.2/INT0P3.34ntTP3.4/T3P3.5TT1P3.6WRP3.7/RD■海灌博握l密嚼备下时LED灭〃名称:K1--K4按键状态显示〃说明:按下kl、k2时,led点亮,松开时熄灭〃说明:k3、k4按下并释放时点亮,再次按下时熄灭// #include<reg51.h>#include<intrins.h>#defineucharunsignedchar#defineuintunsignedintsbitK1=P1A4;sbitK2=P1A5;sbitK3=P1A6;sbitK4=P1A7;sbitD1=POAO;sbitD2=POA1;sbitD3=POA2;sbitD4=P0A3;// voidDelayMs(uintx)(uchari;while(x-)for(i=0;i<120;i++);}// voidmain()(PO=Oxff;//PO初始化Pl=Oxff;//Pl初始化while(l)(D1=K1;〃按下KI键DI点亮D2=K2;〃按下K2键D2点亮if(K3==O)〃判断K3是否有键按下(while(K3==0);〃等待按键释放D3=-D3;//D3闪烁)if(K4==0)〃判断K4是否有键按下{while(K4==0);〃等待按键释放D4=~D4;)DelayMs(lO);实验十三K1-K4分组控制LED 19X1CRYSTAL 18U1>XTAL1XTAL2RSTPSENALEEAP1.0P1.1P1.2P1.3P1.4P1.5P1.6P1.7PO.O/ADOPO.1/AD1P0.2/AD2P0.3/AD3P0.4/AD4P0.5/AD5P0.6/AD6P0.7/AD7P2.0/A8P2.1/A9P2.2/A10P2.3/A11P2.4/A12P2.5/A13P2.6/A14P2.7/A15P3.0/RXDP3.1/TXDP3.2/INT0P3.3/INTTP3.4/T0P3.5/T1P3.6WRP3.7/RD■382■373■364■355■346■337■328AT89C51//K1-K4分组控制LED〃说明:每次按下kl时,递增点亮一只LED〃全亮时再次按下则再次循环开始〃按下k2点亮上面4只LED〃按下k3点亮下面4只LED〃按卜K4后关闭所有LED#include<reg51.h>#defineucharunsignedchar#defineuintunsignedint// voidDelayMs(uintx)(uchari;while(x-){for(i=0;i<120;i++);}}// voidmain()(uchark,t,key_state;PO=Oxff;Pl=Oxff;while(l)t=pl;if(t!=Oxff){DelayMs(lO);if(t!=Pl)continue;〃再次检查按键值key_state=,vt»4;//t取反右移4位赋给key_statek=0;while(key_state!=O)〃循环检查1所在的位置,累加获取按键号K(k++;//k自力口1key_state»=l;〃当键号右移等于1时,跳出while语句)switch(k)〃根据按键号K进行4种处理(case1:if(PO==OxOO)PO=Oxff;PO«=1;〃递增点亮P0口的LEDDelayMs(200);break;:PO=OxfO;break;〃点亮低四位PO=OxOf;break;〃点亮高四位PO=Oxff;〃关闭pO口)实验十四K1-K4控制数码管移位显示mm12343678・,・卫U1228R1p§FnC2T卜C1HF・,・卫U1228R1p§FnC2T卜C1HF22cprr-LC3■2201・・・米纱・二(・:;;,.P3〃K1-K4控制数码管移位显示〃说明:按下kl时加1计数并增加显示位〃说明:按下k2时减1计数并减少显示位〃说明:按下k3时清零#include<reg51.h>#defineucharunsignedchar#defineuintunsignedint">9的段码,Oxff为黑屏ucharcodeDSY_CODE[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,Oxff};〃位码ucharcodeDSY_lndex[]={0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01};〃待显示到各数码管的数字缓冲(开始时仅在0位显示0,其他数码管黑屏)ucharDisplay_Buffer[]={0,10,10,10,10,10,10,10};// voidDelayMs(uintx)(uchari;while(x-)for(i=0;i<120;i++);)// 〃显示子程序voidShow_Count_ON_DSY()(uchari;for(i=0;i<8;i++)(P2=DSY_lndex[i];PO=DSY_CODE[Display__Buffer[i]];DelayMs(2);〃显示延时时间,太短4秒后不显,太长动态显示不连贯}}// voidmain(){uchari;ucharkey_N0,key_Counts=O;PO=Oxff;Pl=Oxff;P2=OxOO;while(l){Show_Count_ON_DSY();〃显示PO=Oxff;key_NO=Pl;switch(key_NO){caseOxFE:key_Counts++;〃加I1计数,增加显示位if(key_Counts>8)key_Counts=8;Display_Buffer[key_Counts-l]=key_Counts;break;caseOxFD:if(key_Counts>0)〃减1计数,减少显示位Display__Buffer[—key_Counts]=10;if(key_Counts==0)Display_Buffer[0]=0;break;caseOxFB:Display_Buffer[O]二0;〃关闭显示,按键清零for(i=0;i<8;i++)Display__Buffer[i]=10;key_Counts=0;}while(Pl!=Oxff)〃如果按键未释放则仅执行刷新显示,不进行按键扫描Show_Count_ON_DSY();〃显示段6马和位6马)

实验十五K1-K4控制数码管加减演示A189csiC2T卜220PR1-4 FX-l_

口实验十五K1-K4控制数码管加减演示A189csiC2T卜220PR1-4 FX-l_

口MRN1£psEn叩到3bpoiTis~Pol,:仁〃名称:K1-K4控制数码管加减演示〃说明:kl按下加1计数// K2按下后减1计数// K3按下后清零#include<reg51.h>#include<intrins.h>#defineucharunsignedchar#defineuintunsignedintucharcodeDSY_CODE[]={0xc0/0xf9/0xa4/0xb0/0x99/0x92,0x82,0xf8,0x80,0x90,Oxff};">9的段码ucharNum_Buffer[]={0,0,0};〃待显示的3位数ucharkey_code,key_Counts=0;〃按键代码,按键计数最大值255// voidDelayMs(uintx)(uchari;while(x-)for(i=0;i<120;i++);}// 〃显示子程序voidShow_Counts_ON_DSY(){uchari=0x01;ucharj=0x80;〃显示位置初始化Num_Buffer[0]=key_Counts/100;〃分离显示百位Num_Buffer[l]=key_Counts/10%10;〃分离显示十位Num_Buffer[2]=key_Counts%10;〃分离显示个位for(i=0;i<3;i++)(j=_croljj,l);P2寸〃显示位置J=0x80,从第一位显示,j=OxOl从第二位开始显示P0=DSY_CODE[Num_Buffer[i]];〃显示数组DelayMs(l);}}// ——voidmain(){uchari;PO=Oxff;Pl=Oxff;P2=0x00;key__code=Oxff;while(l){Show_Counts_ON_DSY();Pl=Oxff;key_code=Pl;if(key_code!=Oxff)£0「。二0;1<30;1++)5110\/\/_(1011田5_。1\1_口5丫();〃有键按下数码管刷新30次,延时switch(key_code)(caseOxfe:if(key_Counts<255)key_Counts++;break;〃按键力口1计数caseOxfd:if(key_Counts>0)key_Counts--;break;〃按键减1计数caseOxfb:key_Counts=0;〃清零}key_code=Oxff;〃否则按键代码为0)}〃总结;显示位置,j=0x80,从第一位显示,// j=0x01从第二位显示实验十六4X4键盘矩阵控制条形LED显示C1C24R1=4 FVC3■;・・・・・,T"三・2・目nmnuLEDBARGRAPH-GRhRN2K9OO^'/©⑷(4键盘矩阵控制条形LED显示〃说明:运行本例时,按下的按键值越大,〃点亮的LED就越多,按下K1一只LED亮,按下K16全亮#include<reg51.h>#include<intrins.h>#defineucharunsignedchar#defineuintunsignedint“)-9,a-f数码管段码表,最后一个是黑屏ucharcodeDSY_CODE[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xal,0x86,0x8e,0x00};〃矩阵键盘按键特征扫描码ucharcodekeycodetable[]={0x11,0x12,0x14,0x18,0x21,0x22,0x24,0x28,0x41,0x42,0x44,0x48,0x81,0x82,0x84,0x88};// voidDelayMs(uintx)(uchari;while(x—)for(i=0;i<120;i++);}// 〃键盘矩阵扫描ucharkeys_scan(){ucharscode,kcode,i,k;{Pl=OxfO;〃低4位置0,放入4行DelayMs(l);//if((Pl&OxfO)!=OxfO)〃高4位取与之后为4个1,〃如果高4位列出现0,则有键按下(scode=0xfe;〃行扫描码赋初值for(k=0;k<4;k++)〃对4行分别进行扫描{Pl=scode;if((Pl&OxfO)!=OxfO)〃如果低四位不为0(kcode=~Pl;//Pl取反后赋给kcode,for(i=0;i<16;i++)〃查表得到按键序号并返回if(kcode==keycodetable[i])returni;)elsescode=_crol_(scode,l);//^I描码循环右移return-1;}// voidmain()(ucharkeyNo=-l;〃按键序号-1表示无按键uchafP2_LED,P3_LED;while(l){keyNo=keys_scan();if(keyNo!=・l)〃判断有无按键按下P2_LED=0xff;P3_LED=0xff;for(i=0;i<=keyNo;i++)if(i<8)〃键值大于8P3_LED»=1;//P3按位右移elseP2_LED»=1;//P2按位右移)P3=P3_LED;P2=P2_LED;〃点亮条形LED)))〃本例键盘矩阵行线连接P0.0-P0.3,列线连接P0.4-P0.7〃1程序首先判断是否有键按下,在行线上放置4个0,即P0=0xf0;〃如果有键按下,列线上必有一位为0,如果有键按下,则判断案件所在行、列位置,并返回按键序号〃代码中扫描初值scode初值为Oxfe,通该值循环右移,对4行逐行发〃送0,每次扫描后即判断高4位的4个1中是否有0出现,如果有。出现〃按键在该行上这时将发送的低4位和读取的高4位取反,也就是P1口取反〃P1□出现两个1,分别处在高4位和低4位,共16种可能,根据取反的〃的值查询键盘矩阵按键特征码表,即可得到按键序号实验十七 数码管显示4x4键盘矩阵键序号

C1士C3PSENALEEAP1.0puP1.2P1.3P1.4P1.5P1.6P1.7PO.O/ADOPO.1/AD1P0.2/AD2P0.3/AD3P0.4/AD4PO.5/AD5P0.6/AD6P0.7/AD7P2.0/A8P2.1/A9P2.2/A10P2.3/A11P2.4/A12P2.5/A13P2.6/A14P2.7/A15P3.0/RXDP3.1/TXDP3.2/iNT0P3.3/INT1P3.47T0P3.5/T1P3.&WRP3.7/RD■35■36RP1C1士C3PSENALEEAP1.0puP1.2P1.3P1.4P1.5P1.6P1.7PO.O/ADOPO.1/AD1P0.2/AD2P0.3/AD3P0.4/AD4PO.5/AD5P0.6/AD6P0.7/AD7P2.0/A8P2.1/A9P2.2/A10P2.3/A11P2.4/A12P2.5/A13P2.6/A14P2.7/A15P3.0/RXDP3.1/TXDP3.2/iNT0P3.3/INT1P3.47T0P3.5/T1P3.&WRP3.7/RD■35■36RP1RESPACK-8-3J2一12一34-1£7一00|O12-34-5-6-7”-###豆二耳五口昔LS1n/,r// 〃名称;数码管显示4x4键盘矩阵键序号// 〃说明:按下任意一键时,数码管会显示它在键盘矩阵上的0-F,〃扫描程序首先判断按键发生在那一列,然后根据所发生的行附加不同的值〃从而得到键盘按键号// #include<reg51.h>#defineucharunsignedchar#defineuintunsignedintucharcodeDSY_CODE[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xal,0x86,0x8e,0x00};sbitBEEP=P3A7;〃上次按键和当前按键序号,该矩阵中的序号范围为>15,16表示无按键ucharpre__keyNo=16,keyNo=16;// 〃延时voidDelayMs(uintms){uchart;while(ms--)for(t=0;t<120;t-);)n 〃键盘矩阵扫描voidkeys_Scan()(ucharTmp;Pl=OxOf;〃高4位置1,放入4行DelayMs(l);Tmp=PlA0x0f;//Pl与OXOF异或switch(Tmp)〃判断按键发生在那一列|casel:keyNo=0;break;case2:keyNo=l;break;case4:keyNo=2;break;case8:keyNo=3;break;default:keyNo=16;〃无键按下)Pl=OxfO;〃低4位置0,放入4列DelayMs(l);Tmp=Pl»4A0x0f;//Pl逐位右移并且与OXOF异或switch(Tmp)〃对0-3行分别附加起始值0,4,8,12.(casel:keyNo+=O;break;〃第一列行号0=3力H0(显示)case2:keyNo+=4;break;〃第二歹ij行号0-3力口4(显示)case4:keyNo+=8;break;〃第三列行号0・3力[18(显示1)case8:keyNo+=12;break;〃第四歹ij行号0-3力口12(显示5)))// voidBeep()〃蜂鸣器程序(uchari;for(i=0;i<120;i-){DelayMs(20);BEEP=~BEEP;

BEEP=1;// - 〃主程序// voidmain(){PO=OxOO;while(l){Pl=OxfO;if(Pl!=OxfO)keys_Scan();〃扫描键盘获取按键序号if(pre_keyNo!=keyNo)〃如果上次和本次序号不一致{PO=~DSY_CODE[keyNo];〃显示本次键号Beep();〃蜂鸣器响pre_keyNo=keyNo;〃本次键号保存)DelayMs(lOO);))实验十八开关控制LDEAT89C51net=P1.12PO.O/ADOPO.1/AD1P0.2/AD2P0.3/AD3P0.4/AD4P0.5/AD5P0.6/AD6P0.7/AD7P2.0/A8P2.1/A9P2.2/A10P2.3/A11P2.4/A12P2.5/A13P2.6/A14P2.7/A15P3.O/RXDP3.1/TXDP3.2/INT0P3.3/INTTP3.4/T0P3.5/HP36而P3.7/RD39■量量墨-|"21_黑亘量量罂一量器建II 〃名称;开关控制LDEH 〃说明:开关SI、S2、分别控制Dl、D2、// #include<reg51.h>#defineucharunsignedchar#defineuintunsignedintsbitS1=P1AO;sbitS2=P17;〃按键定义sbitD1=POAO;sbitD2=POA1;〃显示定义// 〃主程序II voidmain(){while(1){D1=S1;D2=S2;))实验十九 继电器控制照明设备XTAL1XTAL2RSTPSENALEEA220PR1士C311111111PPPPPPPPC2旦盆STALrP0.0/AD0P0.1/AD1P0.2/AD2XTAL1XTAL2RSTPSENALEEA220PR1士C311111111PPPPPPPPC2旦盆STALrP0.0/AD0P0.1/AD1P0.2/AD2P0.3/AD3P0.4/AD4P0.5/AD5P0.6/AD6P0.7/AD7P2.0/A8P2.1/A9P2.2/A10P2.3/A11P2.4/A12P2.5/A13P2.6/A14P2.7/A15P3.0/RXDP3.1/TXDP3.2/iNTDP3.3而TTP3.4/7DP3.5/T1P3.&WRP3.7/RD«7一10|12一34一^6一7一

周五口禺-ir善-D1△■DIODbA■+220ARL1RTE24005FL1220V〃名〃名称;继电器控制照明设备〃说明:按下kl时灯点亮,再次按下灯熄灭// #include<reg51.h>#defineucharunsignedchar#defineuintunsignedintsbitkl=PlAO;sbitRELAY=P2八4;〃驱动定义voidDelayMS(uintms)(uchart;while(ms-)for(t=0;t<120;t++);}// 〃主程序// voidmain(){Pl=Oxff;RELAY=1;〃输出初始化为高电平while(l){if(kl==O)〃按键检测{while(kl==0);RELAY=~RELAY;〃输出取反DelayMS(20);实验二十数码管显示拨码开关编码RP1U1XTAL1XTAL2PSEN电SW1・o■2220PC2■HICRYSTALP0.0/AD0P0.1/AD1P0.2/AD2P0.3/AD3P0.4/AD4P0.5/AD5P0.6/AD6P0.7/AD7■39■38■37■36■35■34■33■U1XTAL1XTAL2PSEN电SW1・o■2220PC2■HICRYSTALP0.0/AD0P0.1/AD1P0.2/AD2P0.3/AD3P0.4/AD4P0.5/AD5P0.6/AD6P0.7/AD7■39■38■37■36■35■34■33■32U2B0B1B2B3B465B6B7・18g.o・17B.1~~02・l3§3■14B.4・13・12■11B.7C3P2.0/A8P2.1/A9P2.2/A10P2.3/A11P2.4/A12P2.5/A13P2.6/A14P2.7/A15_c19,1・CE_AB/BA・21!・222・23374LS245・3■4■6■7PPPPPPPP2.3,4.5£P3.0/RXDP3.1/TXDP3.2/INT0P3.3.WHP3.4/TDP3.5/T1P3.6WR

P3.7/RDDIPSWC_8 AT89C51〃名称;数码管显示拨码开关编码// 〃说明:系统显示拨码开关所设置的编码000-255// #include<reg51.h>#include<intrins.h>#defineucharunsignedchar#defineuintunsignedintucharcodeDSY_CODE[]={Ox3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};〃数码管段码定义ucharDSY_Buffer口二{0,0,0};〃显示缓冲// 〃延时程序voidDelayMS(uintms)uchart;while(ms-)for(t=0;t<120;t++);|// 〃主程序// voidmain()(uchari,m,Num;PO=Oxff;P2=Oxff;while(1){m=0xfe;Num二Pl;〃读取拨码开关的值DSY_Buffer[0]=Num/100;DSY_Buffer[l]=Num/10%10;DSY_Buffer[2]=Num%10;〃分离数组显示个.十.百位for(i=0;i<3;i++)〃刷新显示在数码管h(m=_crol_(m,l);P2=m;〃显示位码P0=DSY_CODE[DSY_Buffer[i]];〃显示段码DelayMS(lO);}〃拨码开关的编码顺序1,2,4,8,16,32,64,128,256.实验二开关控制报警器C119□X1CRYSTAL1810kC310uU1>XTAL1XTAL2RSTPO.O/ADOPO.1/AD1P0.2/AD2P0.3/AD3P0.4/AD4P0.5/AD5P0.6/AD6P0.7/AD729・30"赤PSENALEEALS1

\/匕SOUNDER1■?■8«P1.0P1.1P1.2P1.3P1.4P1.5P1.6P1.7P2.0/A8P2.1/A9P2.2/A10P2.3/A11P2.4/A12P2.5/A13P2.6/A14P2.7/A15P3.0/RXDP3.1/TXDP3.2/INT0P3.3/INT1P3.4/T0P3.5/T1P3.6/WRP3.7/RD■10五■12■1315■16■77■O ―SW-SPDT-MOMAT89C51// 〃名称:开关控制报警器// 〃说明:用kl开关控制报警,程序控制P1.0输出两种不同的声音。〃模拟很逼真的报警效果// #include<reg51.h>#defineucharunsignedchar#defineuintunsignedintsbitkl=PlA7;sbitSPK=P1AO;// 〃发声程序voidAlarm(uintt)ucharij;for(i=0;i<120;i++)(SPK=-SPK;for(j=0;jvt;j++};〃有t参数形成不同的频率)}〃 〃主程序//voidmain(){while(l){if(kl==l}〃如果有键按下(Alarm(90);//t=90发声Alarm(120);//t=120发声)}}实验二十二按键发音X1CRYSTAL 18U1►XTAL1P0.0/AD0P0.1/AD1P0.2/AD2P0.4/AD4P0.5/AD5P0.6/AD6X1CRYSTAL 18U1►XTAL1P0.0/AD0P0.1/AD1P0.2/AD2P0.4/AD4P0.5/AD5P0.6/AD6P2.0/A8P2.1/A9P2.2/A10PSENP2.3/A11ALEP2.4/A12EAP2.5/A13P2.6/A14P2.7/A15P1.0P3.0/RXDP1.1P3.1/TXDP1.2P3.2/INT0P1.3P3.3/INT1P1.4P3.4/T0P1.5P3.5/T1P1.6P3.aWRP1.7P3.7/RD19AT89C5129・30■3lV■39■38^37,■36■35■34^33■32■17LS1SOUNDER■="H 〃名称:按键发音// 〃说明:本例运行时,按下不同的按键会使SOUNDER发出不同// 频率的声音输出,后续类似案例使用的是定时技术// #include<reg51.h>#defineucharunsignedchar#defineuintunsignedintsbitkl=PlA4;sbitk2=PlA5;sbitk3=PlA6;sbitk4=PlA7;sbitBEEP=P3A7;// 〃延时程序voidDelavMSfuintx)uchart;while(x-)for(t=0;t<50;t++);}// 〃按周期t发音voidplay(uchart){uchari;for(i=0;i<100;i++)(BEEP=~BEEP;DelayMS(t);)BEEP=O;}// 〃主程序// voidmain。(Pl=Oxff;while(l)(if(kl==O)play⑴;//延时1个周期if伙2==0)play⑵;〃延时2个周期if(k3==O)play⑶;〃延时3个周期if(k4==0)play⑷;〃延时4个周期实验二十三 播放音乐U1►XTAL1XTAL2220PR1RSTAT89C51PSENALEEAX1CRYSTALC1T卜220pC3C2r10k30■P0.0/AD0P0.1/AD1P0.2/AD2P0.3/AD3P0.4/AD4P0.5/AD5P0.6/AD6P0.7/AD7P2.0/A8P2.1/A9P2.2/A10P2.3/A11P2.4/A12P2.5/A13P2.6/A14P2.7/A15P3.0/RXDP3.1/TXDP3.2/INT0P3.3/INTTP3.4/TOP3.5/T1P3.6WRP3.7/RDLS1// 〃名称:播放音乐// 〃说明:程序运行时播放生日快乐歌,未使用定时中断,//所有频率输出完全用延时实现。// #include<reg51.h>#defineucharunsignedchar#defineuintunsignedintsbitBEEP=P3A7;// 〃生日快乐歌的音符频率表,不同的频率由不同的延时值来决定ucharcodeSONG_TONE[]={212,212,190,212,159,169,212,212,190,212,142,159,212,212,106,126,159,169,190,119,119,126,159,142,159,0};〃生日快乐歌节拍表,节拍决定了每个音符的演奏长短ucharcodeSONG_LONG[]={9,3,12,12,12,24,9,3,12,12,12,24,9,3,12,12,12,12,12,9,3,12,12,12,24,0};// 〃延时voidDelayMS(uintx)(uchart;while(x-)for(t=0;t<120;t++);)// 〃播放子程序voidPlayMusic(){uinti=OJ,k;while(SONG_LONG[i]!=0||SONG_TONE[i]!=0)〃节拍,音符两个数末位0为结束标志{〃播放各个音符,SONG_LONG为节拍长度for(j=0;j<SONG_LONG[i]*20;j++){BEEP=~BEEP;//SONG_TONE延时决定了每个音符的频率for(k=0;k<SONG_TONE[i]/3;k++);}DelayMS(lO);i++;))// 〃主程序// voidmain(){while(l){PlayMusic();〃播放生日快乐歌DelayMS(500);〃播放完之后暂停一下)}〃如果把uinti=O,j,k;定义为uchari=O,j,k;播放时,不能重复播放〃程序中第一个for循环内的20为延时倍数,〃修改这个值可加快或减缓音乐的播放速度,由于SONG_LONG[i]*20会超过//uchar的最大值,因袭注意j定义为uint类型,内层for循环中的3为频率调节〃修改该值会整体调高或调低音调,但注意降低该值,应适当加大延时节拍,〃即加大20,否则可适当将20减小实验二十四INTO中断计数・五■12P0.7/AD7U1・X112M」|口丁心慈计数// 〃名称:INTO中断计数H 〃说明:每次按下计数键时触发INTO,中断程序累加计数,// 计数值显示在三位数码管上,按下清零健时数码管清零// #include<reg51.h>#defineucharunsignedchar#defineuintunsignedint// /仆9的数字编码,最后一个为黑屏ucharcodeDSY_CODE[]={Ox3f,0x06,0x5b,0x4f,0x66,0x6d,0x7(1,0x07,0x7(,0x6t0x00};〃计数值分解后的各待显示数位ucharDisplay_Buffer[3]={0,0/0);uintCount=0;sbitCleajkey=P3A6;〃定义清零键位// 〃在数码管显示计数值voidShow_Count_ON_DSY()Display_Buffer⑵:Count/100;〃分离获取3个数位,百位Display_Buffer[l]=Count%100/10;//_b{iDisplay_Buffer[0]=Count%10;〃个位if(Display_Buffer⑵==0)〃如果高位显示0不显示Display_Buffer[2]=0x0a;〃3xOa指定显示编码显示第十个数0x00,if(Display_Buffer[l]==O)〃高位为。是,如果第二位为0时同样不显示Display_Buffer[l]=OxOa;)P0=DSY_CODE[Display_Buffer[0]];//3只数码管独立显示Pl=DSY_CODE[Display_Buffer[l]];P2=DSY_CODE[Display_Buffer[2]];)// 〃主程序// voidmain(){PO=Oxff;Pl=Oxff;P2=0xff;IE=0x81;〃允许INTO中断IT0=l;〃触发方式,下降沿触发while(l)(if(Clear_key==O)〃如果清零键按下Count=O;〃计数值清零Show_Count_ON_DSY();//持续刷新显示// //INTO中断函数voidEX_INTO()interrupt0{Count++;〃计数值递增加1}〃本程序使用P3.2-INT0外部中断按键进行计数,使用外部中断〃设置中断寄存器IE,先开总中断,然后开中断源(5个)控制位〃EA,CPU总中断允许位,EA=1,CPU开放中断,EA=O,屏蔽所有中断请求〃ES:串行中断允许位,ES=1允许串口中断,ES=O,禁止串口中断〃ET1():T1溢出中断允许位,=1时允许,=0时禁止〃EX1:外部中断1-INT1中断控制位,=1时允许,=0时禁止〃ETO:TO溢出中断允许位,=1时允许,=0时禁止〃EXO:外部中断0-INT0中断允许控制位,=1时允许,=0时禁止

〃设置IE=0X8*(*=1-5)分别允许EXO,ETO,EX1,ET1,ES中实验二十五INTO中断控制LED5rHF220pU1D1C2r口SU 18220pR1C3►XTAL1XTAL2RSTAT89C51PSENALEPO.O/ADOP0.1/AD1P0.2/AD25rHF220pU1D1C2r口SU 18220pR1C3►XTAL1XTAL2RSTAT89C51PSENALEPO.O/ADOP0.1/AD1P0.2/AD2P0.3/AD3P0.4/AD4P0.5/AD5P0.6/AD6P0.7/AD7P2.0/A8P2.1/A9P2.2/A10P2.3/A11P2.4/A12P2.5/A13P2.6/A14P2.7/A15P3.0/RXDP3.1/TXDP3.2/INT0P3.3/1NTTP3.4/T0P3.5/T1P3.6/WR

P3.7/RD■15■16■17R2220RLED-RED// 〃名称:INTO中断控制LED// 〃说明:每次按键时都会触发INTO中断,中断发生时将LDE状态取反,//产生LDE开关由按键控制效果。// #include<reg51.h>#defineucharunsignedchar#defineuintunsignedintsbitLED=POAO;// 〃主程序// voidmain()(LED=1;EA=1;〃开总中断EXO=1;〃允许INTO中断,EA和EXO也可用IE=0X81代替TCON=Ox01;〃即ITO=1,下降沿触发while(l);)// 〃外部INTO中断函数

voidExternal_lnterrupt_O()interrupt0LEDELED;〃控制LED亮灭,(!求非符号)}实验二十六 INTO及INTI中断计数C1rHF220pC2J卜220p 19X1CRYSTAL18XTAL1XTAL2RSTPSENRP1RESPACK-8C1rHF220pC2J卜220p 19X1CRYSTAL18XTAL1XTAL2RSTPSENRP1RESPACK-8P1P1P1P1P1P1P1P1PO.O/ADOP0.1/AD1P0.2/AD2P0.3/AD3P0.4/AD4P0.5/AD5P0.6/AD6P0.7/AD7P2.0/A8P2.1/A9P2.2/A10P2.3/A11P2.4/A12P2.5/A13P2.6/A14P2.7/A15P3.0/RXDP3.1/TXDP3.2/1NT0P3.3/INT1P3.4/TOP3.5aiP3.6/WRP3.7/RDAT89C51■21 ?2.0■2212.7■石P2.2・24 P2.3T25~P2.4// 〃名称:INTO及INT1中断计数// 〃说明;每次按下第1个计数犍时,第一组计数值累加并显示在右边的3只管上,// 每次按下第2个计数键时,第2组计数值累加并显示在左边的3只管上,// 后两个按键分别清零// #include<reg51.h>#defineucharunsignedchar#defineuintunsignedintsbitk3=P3A4;sbitk4=P3A5;ucharcodeDSY_CODE[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0乂82,0乂£8,0乂80,0乂90,0乂用;//数?1马管段码ucharcodeScan_BITs[]={0x20,0x10,0x08,0x04,0x02,0x01};〃数码管位码(扫描码)uchardataBuffejCounts□={0,0,0,0,0,0};//2组显示缓冲ucharCount_A=0,Count_B=0;〃两个计数值(0-255),定义成uint型为(0-65535)// voidDelayMs(uintx){uchart;while(x-)for(t=0;t<120;t++);}// 〃数据显示程序voidShow_Counts(){uchari;〃分解计数值Count_ABuffer_Counts[2]=Count_A/100;Buffer_Counts[l]=Count_A%100/10;Buffer_Counts[0]=Count_A%10;if(Buffer_Counts[2]==0)〃如果高位为0时(Buffer_Counts[2]=0x0a;//^显示if(Buffer_Counts[l]==0)Buffer_Counts[l]=OxOa;)〃分解计数值Count_BBuffer_Counts[5]=Count_B/100;Buffer_Counts[4]=Count_B%100/10;Buffer__Counts[3]=Count_B%10;if(Buffer_Counts[5]==0)//如果高位为0时(Buffer_Counts[5]=0x0a;〃高位不显示if(Buffer_Counts[4]==0)Buffer_Counts[4]=0x0a;}for(i=0;i<6;i++){P2=Scan_BITs[i];//显示位码Pl=DSY_CODE[Buffer_Counts[i]];〃显示段码DelayMs(l);}//- 〃主程序voidmain()(ITO=1;〃TO下降沿触发IT1=1;//T1下降沿触发PXO=1;〃中断优先级设置IE=0X85;//INT0,INTI开中断while(l){if(k3==0)Count_A=0;〃计数值A清零键K3if(k4==0)Count_B=0;〃计数值B清零键K4Show_Counts();〃显示))// //INTO中断函数// voidEX_INT0()interrupt0{Count_A++;〃计数值A自加1,)// //INTI中断函数// voidEX_INT1()interrupt2(Count_B++;〃计数值B自加1}实验二十七 TIMERO控制单只LED闪烁

C1HIC21"HIX1CRYSTAL 1810kU1►XTAL1XTAL2220pR1RSTC310uAT89C51P1.0P1.1PSENALEEA29・C1HIC21"HIX1CRYSTAL 1810kU1►XTAL1XTAL2220pR1RSTC310uAT89C51P1.0P1.1PSENALEEA29・30«37-PO.O/ADOPO.1/AD1P0.2/AD2P0.3/AD3PO.4/AD4P0.5/AD5P0.6/AD6P0.7/AD7P2.0/A8P2.1/A9P2.2/A10P2.3/A11P2.4/A12P2.5/A13P2.6/A14P2.7/A15P3.0/RXDP3.1/TXDP3.2^NT0P3.3/1NTTP3.4/T0P3.5/T1P3.6丽P3.7/RDD1LED-REDR2220R// 〃名称:TIMERO控制单只LED闪烁// 〃说明:LED在定时器中断例程控制下不断闪烁// #include<reg51.h>#defineucharunsignedchar#defineuintunsignedintsbitLED=POAO;ucharT_Count=0;〃主程序// voidmain()(TMOD=OxOO;〃定时器TO工作于工作模式0TH0=(8192-5000)/32;//5ms定时TL0=(8192-5000)%32;IE=0x82;〃允许TO中断TRO=1;〃启动定时器while(l);)// voidLED_Flash()interrupt1TH0=(8192-5000)/32;TL0=(8192・5000)%32;〃重装定时器初值:

if(++T_Count==100)/万ms*100=500ms,实现O.5s定时开关led{LED=!LED;//LED求非闪烁T_Count=0;〃计数值清零))〃本例使用的是定时器中断技术,该技术需要完成以下的工作//I设置定时器的工作模式(设置TMOD)〃2设置定时器初值(设置THO/TLO或TH1/TL1);/3允许定时器中断(设置IE或单独设置EA,ET0/ET1);/4启动定时器(设置TCON或单独设置TR0/TR1)实验二十八TIMERO控制流水灯thrn、2早2sthrn、2早2s而L\// 〃名称:TIMERO控制流水灯// 〃说明:定时器控制P0,P2端口的LED滚动显示,本例没有使用中断程序〃使用while循环查询TFO是否置位,(即TFO是否为1)来判断是否有计数溢出〃为1时表示定时40ms已到达,定时到达后,用软件将TFO清零,并重装定时寄存器〃为了实现更大的计数,本例仍然使用了对计时进行累加的方法// #include<reg51.h>#include<intrins.h>#defineucharunsignedchar#defineuintunsignedint// 〃主程序// voidmain()ucharT_Count=0;〃累加计数溢出发生的次数PO=Oxfe;P2=0xfe;TMOD=0x01;〃定时器0工作于方式1TH0=(65535-50000)/256;〃设置40ms定时器TL0=(65535-50000)%256;TR0=l;〃启动定时器while(l){〃定时器溢出标志为1时表示计时溢出if(TF0==l)〃查询是否有计数溢出(TF0=0;〃软件清零TH0=(65535-40000)/256;/^0ms定时TL0=(65535-40000)%256;〃重装定时器初值if(++T_Count==5)//40*5=200ms后LED滚动一次{P0=_crol_(P0,l);P2=_croljP2,l);〃循环点亮LEDT_Count=0;〃计数器溢出清零|}1)〃本例使用的是定时器中断技术,该技术需要完成以下的工作〃1设置定时器的工作模式(设置TMOD)IH设置定时器初值(设置TH0/TL0或TH1/TL1);/3允许定时器中断(设置IE或单独设置EA,ET0/ET1);/4启动定时器(设置TCON或单独设置TR0/TR1)〃定时器4中工作方式定时时间〃模式0:定时时间t=(8192-T0的初值)X振荡周期X12,最大计数值8192〃模式1:定时时间t=(65536-T0的初值)X振荡周期X12,最大计数值65536〃模式2:定时时间t=(256-T0的初值)X振荡周期X12,最大计数值256〃模式3:T0可以设为模式0-2.T1不可(通常设为模式2)〃当采用12MHz晶振时,经12分频后,一个机器周期为lus,计数频率为1MHz〃所以T0的初值的值,就是延时的us(微秒)值//ls=1000ms=1000000us,lms=1000us;实验二十九 TIMERO控制流水灯

OX[—i-CRYSTALOX[—i-CRYSTAL 18支ZE至口8►XTAL1XTAL2PSENALEEAPO.O/ADOP0.1/AD1P0.2/AD2P0.3/AD3P0.4/AD4P0.5/AD5P0.6/AD6P0.7/AD7P2.0/A8P2.1/A9P2.2/A10P2.3/A11P2.4/A12P2.5/A13P2.6/A14P2.7/A15P3.0/RXDP3.1HXDP3.2/INI0P3.3/iNTT►XTAL1XTAL2PSENALEEAPO.O/ADOP0.1/AD1P0.2/AD2P0.3/AD3P0.4/AD4P0.5/AD5P0.6/AD6P0.7/AD7P2.0/A8P2.1/A9P2.2/A10P2.3/A11P2.4/A12P2.5/A13P2.6/A14P2.7/A15P3.0/RXDP3.1HXDP3.2/INI0P3.3/iNTTP3.4/T0P3.5/T1P3.6WRP3.7/RDAT89C51—P1P1P1P1P1P1P1P1〃名称:TIMER0控制流水灯// 〃说明:4只LED在定时器的控制下滚动闪烁// #include<reg51.h>#defineucharunsignedchar#defineuintunsignedintsbitBl=P0A0;sbitG1=POA1;sbitRl=P0A2;sbitYl=P0A3;uinti,j,k;// 〃主程序// voidmain(){i=j=k=O;〃开始时全部关闭P0=0xfe;TMOD=0x02;〃定时器工作于模式2TH0=256-200;TL0=256-200;//200us延时IE=0x82;〃允许TO中断TRO=1;〃启动定时器while(l):// voidLED_Flash_and_Scroll()interrupt1if(++k<350)return;〃每累计35次中断(700ms),才执行一次闪烁k=0;switch(i){case0:Bl=!Bl;br

温馨提示

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

评论

0/150

提交评论