




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、基于 8051+Proteus 仿真案例第 01 篇基础程序设计01闪烁的 LED/*名称:闪烁的 LED说明:LED 按设定的时间间隔闪烁*/#in clude#define uchar un sig ned char#define uint un sig ned int sbitLED=P1A0;/延时void DelayMS(ui nt x)uchar i;while(x-)for(i=0;iTAL1RSTPBEJALEEkP1.0P1.1PI 2P1.3PI .4PI.5PI &PI .7iPD.nfADDPD l/AD IPO 沖 3 IPO4/ 斗 POWADS P06/06 FQ
2、i 卿Fi.DeP2.1M9F22W D P33JA11P2,4JA12P2.-5W13PUM14P2JJA15P3J0fRMDp.3 i.mp I3.3JihrTP3.4JHP3.fliT1 PJ帥西P3.7JFDkTB9C6l02/*while(1)LED=LED;DelayMS(150);从左到右的流水灯名称:从左到右的流水灯说明: 接在P0 口的8个LED 从左到右循环依次点亮, 产生走 马灯效果*1#in clude#in clude#define uchar un sig ned char#define uint un sig ned intII 延时JTLii xiII*-U14
3、ILwTALiRO耳?rasikz泅:甩也甩也P2 4JAI1EAP-rJ*11P2i.NP7 jjarPI QPInPI;料甜吨PI旳3何1Pl 4Pi SMW Mi4lPI KIPI TM TfiTrwr:.ivoid DelayMS(uint x)uchar i;while(x-) for(i=0;i120;i+);/主程序void mai n()P0=0 xfe;while(1)P0=_crol_(P0,1); P0 的值向左循环移动 DelayMS(150);038 只 LED 左右来回点亮/* 名称:8 只 LED 左右来回点亮说明:程序利用循环移位函数_crol_和_cror_形
4、成来回滚动的效果*/#in clude#in clude#define uchar un sig ned char#define uint un sig ned int/延时void DelayMS(ui nt x)uchar i;while(x-) for(i=0;i120;i+);/主程序void mai n()uchar i;P2=0 x01;while(1)for(i=0;iF2JWIIG卜? jMiirP3 丁皿口PItPIimetw IPI 3円tmPI 4PI 5PifJTrPI i町的Pi 丄亍=1卄即C2卄即U1-I - I三兰兰4二兰11,一3P2=_crol_(P2,1)
5、; P2 的值向左循环移动DelayMS(150);for(i=0;i7;i+)P2=_cror_(P2,1); P2 的值向右循环移动DelayMS(150);0 xfc,0 xf9,0 xf3,0 xe7,0 xcf,0 x9f,0 x3f,0 x7f,0 xff,0 xff,0 xff,0 xff,0 xff,0 xff,0 xff,0 xff,0 xe7,0 xdb,0 xbd,0 x7e,0 xbd,0 xdb,0 xe7,0 xff,0 xe7,0 xc3,0 x81,0 x00,0 x81,0 xc3,0 xe7,0 xff,0 xaa,0 x55,0 x18,0 xff,0 x
6、f0,0 x0f,0 x00,0 xff,0 xf8,0 xf1,0 xe3,0 xc7,0 x8f,0 x1f,0 x3f,0 x7f,0 x7f,0 x3f,0 x1f,0 x8f,0 xc7,0 xe3,0 xf1,0 xf8,0 xff,0 x00,0 x00,0 xff,0 xff,0 x0f,0 xf0,0 xff,0 xfe,0 xfd,0 xfb,0 xf7,0 xef,0 xdf,0 xbf,0 x7f,0 xff,0 xff,0 xff,0 xff,0 xff,0 xff,0 xff,0 xff,0 xff,0 xff,0 xff,0 xff,0 xff,0 xff,0 x
7、ff,0 xff,0 x7f,0 xbf,0 xdf,0 xef,0 xf7,0 xfb,0 xfd,0 xfe,0 xfe,0 xfc,0 xf8,0 xf0,0 xe0,0 xc0,0 x80,0 x00,0 x00,0 x00,0 x00,0 x00,0 x00,0 x00,0 x00,0 x00,0 x00,0 x00,0 x00,0 x00,0 x00,0 x00,0 x00,0 x00,0 x00,0 x80,0 xc0,0 xe0,0 xf0,0 xf8,0 xfc,0 xfe,0 x00,0 xff,0 x00,0 xff,0 x00,0 xff,0 x00,0 xff;uch
8、ar code Patter n_P2=0 xff,0 xff,0 xff,0 xff,0 xff,0 xff,0 xff,0 xfe,0 xfc,0 xf9,0 xf3,0 xe7,0 xcf,0 x9f,0 x3f,0 xff,0 xe7,0 xdb,0 xbd,0 x7e,0 xbd,0 xdb,0 xe7,0 xff,0 xe7,0 xc3,0 x81,0 x00,0 x81,0 xc3,0 xe7,0 xff,0 xaa,0 x55,0 x18,0 xff,0 xf0,0 x0f,0 x00,0 xff,0 xf8,0 xf1,0 xe3,0 xc7,0 x8f,0 x1f,0 x3
9、f,0 x7f,0 x7f,0 x3f,0 x1f,0 x8f,0 xc7,0 xe3,0 xf1,0 xf8,0 xff,0 x00,0 x00,0 xff,0 xff,0 x0f,0 xf0,0 xff,0 xff,0 xff,0 xff,0 xff,0 xff,0 xff,0 xff,0 xff,0 xfe,0 xfd,0 xfb,0 xf7,0 xef,0 xdf,0 xbf,0 x7f,0 x7f,0 xbf,0 xdf,0 xef,0 xf7,0 xfb,0 xfd,0 xfe,0 xff,0 xff,0 xff,0 xff,0 xff,0 xff,0 xff,0 xff,0 xf
10、f,0 xff,0 xff,0 xff,0 xff,0 xff,0 xff,0 xff,0 xfe,0 xfc,0 xf8,0 xf0,0 xe0,0 xc0,0 x80,0 x00,0 x00,0 x80,0 xc0,0 xe0,0 xf0,0 xf8,0 xfc,0 xfe,0 xff,0 xff,0 xff,0 xff,0 xff,0 xff,0 xff,0 xff,0 x00,0 xff,0 x00,0 xff,0 x00,0 xff,0 x00,0 xff;/延时04 花样流水灯/* 名称:花样流水灯说明:16 只 LED 分两组按预设的多种花样变换显示*/#in clude#def
11、i ne uchar un sig ned char#defi ne uint un sig ned int ucharcode Patter n_P0= 3D亠一2_/-t -I-FTOW1F.心F31A1DPSIJML11昭舅id甩&41 Si阳3.1*旳 3 町niffrpF3 3IM1IF3i.ni宀PVIAM旳丨岬KHMunKIMES亦昨void DelayMS(ui nt x)uchar i;while(x-) for(i=0;i120;i+);/主程序void mai n()uchar i;while(1)从数组中读取数据送至for(i=0;i136;i+)PO=Pattern_
12、POi; P2=Pattern_P2i; DelayMS(IOO);/* 名称:LED 模拟交通灯说明:东西向绿灯亮若干秒,黄 灯闪烁 5 次后红灯亮,红灯亮后,南北向由红灯变为绿灯,若干秒后南北 向黄灯闪烁 5 此后变红灯,东西向变 绿灯,如此重复。*/#in clude#define uchar un sig ned char#define uint un sig ned intsbit RED_A=P0A0;东西向灯sbit YELLOW_A=POA1;sbit GREEN_A=P0A2;sbit RED_B=P0A3;南北向灯sbit YELLOW_B=P0A4;sbit GREEN_
13、B=P0A5;uchar Flash_Cou nt=0,Operation_Type=1; 闪烁次数,操作类型变量/延时void DelayMS(ui nt x)uchar i;PC3.UU:Z-K*11l*12冲茧匹二屮討4*1 I枷删戸1 ?P0 禾口 P2 口显示05 LED 模拟交通灯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=
14、1;DelayMS(2000);Operation_Type=2;break;case 2: / 东西向黄灯闪烁,绿灯关闭DelayMS(300);YELLOW_A=YELLOW_A;GREEN_A=1;if(+Flash_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:
15、 / 南北向黄灯闪烁 5 次DelayMS(300);YELLOW_B=YELLOW_B;GREEN_B=1;if(+Flash_Count!=10) return;Flash_Count=0;Operation_Type=1;/主程序void main()while(1) Traffic_Light();06 单只数码管循环显示 09/* 名称:单只数码管循环显示 09 说明:主程序中的循环语句反复将 09 的段码送至 P0 口,使数字 */#include09 循环显示#in clude #defi ne uchar un sig ned char #defi ne uint un sig
16、 ned intuchar code DSY_CODE=0 xc0,0 xf9,0 xa4,0 xb0,0 x99,0 x92,0 x82,0 xf8,0 x80,0 x90,0 xff;PO=DSY_CODEi; i=(i+1)%10;DelayMS(300);078 只数码管滚动显示单个数字/* 名称:8 只数码管滚动显示单个数字 说明:数码管从左到右依次滚动显示07,程序通过每次仅循环选通一只数码 管*/#in clude#in clude#defi ne uchar un sig ned char#defi ne uint un sig ned int uchar codeDSY_CO
17、DE=OxcO,Oxf9,Oxa4,OxbO,Ox99,Ox92,Ox82,Oxf8,Ox8O,Ox9O;/延时 void DelayMS(ui nt x)uchar t;while(x-) for(t=0;t120;t+);/主程序void mai n()uchar i,wei=0 x80;while(1)/延时voidDelayMS(uint x)uchar t;while(x-)for(t=0;t120;t+);/主程IOHI卜一C3 rigLI.D.in#.亠fffTALIKilMXPOSIAMFOJUMMI FOSSES 闻钿 oe PC 和 0-.RP1 -.PHIMfor(i=0
18、;i8;i+)P2=0 xff; / 关闭显示 wei=_crol_(wei,1);P0=DSY_CODEi; / 发送数字段码P2=wei;/发送位码DelayMS(300);08 8 只数码管动态显示多个不同字符电路如上图/* 名称: 8 只数码管动态显示多个不同字符 说明:数码管动态扫描显示07。*/#include#include#define uchar unsigned char#define uint unsigned intuchar code DSY_CODE=0 xc0,0 xf9,0 xa4,0 xb0,0 x99,0 x92,0 x82,0 xf8,0 x80,0 x9
19、0;/延时void DelayMS(uint x)uchar t;while(x-) for(t=0;t120;t+);/主程序void main()uchar i,wei=0 x80;while(1)for(i=0;i8;i+)P2=0 xff;P0=DSY_CODEi; / 发送段码 wei=_crol_(wei,1);P2=wei;/发送位码DelayMS(2);09 8 只数码管闪烁显示数字串电路如上图/* 名称: 8 只数码管闪烁显示数字串 说明:数码管闪烁显示由 07 构成的一串数字 本例用动态刷新法显示一串数字,在停止刷新时所有数字显示消失。*/#include#define u
20、char unsigned char#define uint unsigned int/段码表uchar code DSY_CODE=0 xc0,0 xf9,0 xa4,0 xb0,0 x99,0 x92,0 x82,0 xf8,0 x80,0 x90; /位码表uchar code DSY_IDX=0 x01,0 x02,0 x04,0 x08,0 x10,0 x20,0 x40,0 x80;/延时void DelayMS(uint x)uchar t; while(x-) for(t=0;t120;t+);/主程序void main()uchar i,j; while(1)for(i=0;
21、i30;i+)for(j=0;j8;j+)P0=0 xff; P0=DSY_CODEj; /发送段码 P2=DSY_IDXj;/ 发送位码DelayMS(2);P2=0 x00; /关闭所有数码管并延时 DelayMS(1000);108 只数码管滚动显示数字串 电路如上图/* 名称: 8 只数码管滚动显示数字串 说明:数码管向左滚动显示 3 个字符构成的数字串*/#include#include#define uchar unsigned char#define uint unsigned int/段码表uchar code DSY_CODE=0 xc0,0 xf9,0 xa4,0 xb0,
22、0 x99,0 x92,0 x82,0 xf8,0 x80,0 x90,0 xff;/ 下面数组看作环形队列,显示从某个数开始的 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=0 x80;while(1) / 刷新若干次,保持一段时间的稳定显示for(i=0;i15;i+)for(j=0;j8;j+) / 发送段码,采用环形取法,从第 k 个开始取第 j 个
23、P0=0 xff;P0=DSY_CODENum(k+j)%11;m=_crol_(m,1);P2=m;/发送位码DelayMS(2);k=(k+1)%11; /环形队列首支针 k 递增, Num 下标范围 010 ,故对 11 取余11K1-K4 控制 LED 移位/* 名称: K1-K4 控制 LED 移位说明:按下 K1 时, P0 口 LED 上移一位;按下 K2 时, P0 口 LED 下移一位;按下 K3 时, P2 口 LED 上移一位;按下 K4 时, P2 口 LED 下移一位;if(P1 &0 x10)=0)P0=_cror_(P0,1);K1else if(P1 &0 x2
24、0)=0) P0=_crol_(P0,1);K2else if(P1 &0 x40)=0) P2=_cror_(P2,1);K3else if(P1 &0 x80)=0) P2=_crol_(P2,1);K4/主程序void mai n()uchar Recent_Key; / 最近按键P0=0 xfe;P2=0 xfe;P1=0 xff;Recen t_Key=0 xff;while(1)if(Rece nt_Key!=P1)Rece nt_Key=P1;Move_LED();DelayMS(10);12K1-K4 按键状态显示 /* 名称:K1-K4 按键状态显示说明:K1、K2 按下时
25、LED 点亮,松开时熄灭,K3、K4 按下并释放时 LED 点亮,再次按下并释放时熄灭;*/#in clude#in clude#defi ne uchar un sig nedchar#defi ne uint un sig ned int/延时void DelayMS(ui nt x)uchar i;while(x-)for(i=0;i2E常2fi、A/保存最近按键*/#in clude#define uchar un sig ned char#define uint un sig ned int sbitLED1=P0A0;sbit LED2=P0A1;sbit LED3=P0A2;sb
26、it LED4=P0A3;sbit K 仁 P1A0;sbit K2=P1A1;sbit K3=P1A2;sbit K4=P3;/延时void DelayMS(ui nt x)uchar i;while(x-) for(i=0;i5PI 16Pi .7站材ri/* 名称:K1-K4 分组控制 LED说明:每次按下 K1 时递增点亮一只 LED,全亮时再次按下则再次循环开始,K2 按下后点亮上面 4 只 LED,K3 按下后点亮下面 4 只 LED,K4 按下后关闭所有 LEDwhile(1)t=P1;if(t!=0 xff)DelayMS(IO);if(t!=P1) continue;II 取
27、得 4 位按键值,由模式 XXXX1111(X 中有一位为 0,其他均为 1)II 变为模式 0000XXXX(X 中有一位为 1,其他均为 0) Key_State=t4;k=0;II 检查 1 所在位置,累加获取按键号k while(Key_State!=0)k+;Key_State=1;II 根据按键号 k 进行 4 种处理switch(k)case 1:if(P0=0 x00) P0=0 xff;P0=1;DelayMS(200); break;case 2:P0=0 xf0;break;case 3:P0=0 x0f;break;case 4:P0=0 xff;*/#in clude
28、#define uchar un sig ned char#define uint un sig ned int/延时void DelayMS(ui nt x)uchar i;while(x-) for(i=0;ir!ok C3iHIr I: 4 - 1EAF2J.餉怕 .:却1nA袒QjR艰PI1P3.1JKEP1J2pjifrFFH Jpiafri-Pl 4TO5THPI EPJMSEPUTF3 Tiip血mF0SiM5町日“.世4 诗八217 33、14K1-K4 控制数码管移位显示/* 名称:K1-K4 控制数码管移位显示说明:按下 K1 时加 1 计数并增加显示位, 按下 K2 时减
29、 1 计数并减少显示位, 按下 K3 时清零。*/#in clude#define uchar un sig ned char#define uint un sig ned intII 段码uchar code DSY_CODE=0 xc0,0 xf9,0 xa4,0 xb0,0 x99,0 x92,0 x82,0 xf8,0 x80,0 x90,0 xff;II 位码uchar code DSY_I ndex=0 x80,0 x40,0 x20,0 x10,0 x08,0 x04,0 x02,0 x01;II 待显示到各数码管的数字缓冲(开始仅在0 位显示 0,其他黑屏)uchar Disp
30、lay_Buffer=0,10,10,10,10,10,10,10;II 延时void DelayMS(ui nt x) uchar i;while(x-) for(i=0;i120;i+);void Show_Co un t_ON_DSY() uchar i;for(i=0;i8) Key_Cou nts=8;Display_BufferKey_Cou nts-1=Key_Cou nts;break;case 0 xfd:if(Key_Cou nts0)Display_Buffer-Key_Counts=1O; break;case 0 xfb:Display_Buffer0=0;for(i
31、=1;i8;i+) Display_Bufferi=10;Key_Cou nts=O;若键未释放则仅刷新显示,不进行键扫描while(P1!=0 xff) Show_Cou nt_ON_DSY();15K1-K4 控制数码管加减演示 uchar codeDSY_CODE=0 xc0,0 xf9,0 xa4,0 xb0,0 x99,0 x92,0 x82,0 xf8,0 x80,0 x90,0 xff;/待显示的 3 位缓冲uchar Num_Buffer=0,0,0;/按键代码,按键计数uchar Key_Code,Key_Co un ts=0;/延时void DelayMS(ui nt x)
32、uchar i;while(x-) for(i=0;i120;i+);/显示函数 void Show_Cou nts_ON_DSY()uchar i,j=OxO1;/* 名称:K1-K4 控制数码管加减演示 说明:按下 K1 后加 1 计数,按下 后减 1 计数,按下 K3 后清零。*/#in clude#in clude#define uchar un sig ned char#define uint un sig ned int/段码 5uK2申gi I I MilkJ VWparjwr rztjwF? MIDpjr WNum_Buffer2=Key_Cou nts/100;Num_Buf
33、fer1=Key_Cou nts/10%10;Num_Buffer0=Key_Cou nts%10; for(i=0;i3;i+)j=_cror_(j,1);P0=0 xff;PO=DSY_CODENum_Bufferi;P2=j;DelayMS(1);/主程序 void mai n() uchar i;PO=Oxff;P1=Oxff;P2=0 x00;Key_Code=0 xff;while(1)Show_Co un ts_ON_DSY();P 仁 Oxff;Key_Code=P1;有键按下时,数码管刷新显示30 次,该行代码同时起到延时作用if(Key_Code!=0 xff)for(i=
34、0;i30;i+) Show_Co un ts_ON_DSY();switch(Key_Code)case 0 xfe:if(Key_Cou nts0) Key_Cou nts-;break;case 0 xfb:Key_Cou nts=O;Key_Code=0 xff;164X4 矩阵键盘控制条形 LED 显示/* 名称:4X4 矩阵键盘控 制条形 LED 显示说明:运行本例时,按I rDi C-2THPkiffiKPl -p -tirrPJ itTFf 时咖 I呻 F 冷冃 WitP3 3W 3 iF2 TlAGCl丄C2T1 ikt;L* -:p:曲 -?194la L ipi /K2K
35、61厂kto JD.厂 LK7d cia K11i |99- iH151-AJ=L d- 4*-KU -I=LK16J=La *aj jpn - r iFDdAiaFi|i5.A4FOUADS険3DIc |ftISrn -11工一fl?13I*4-4e wT1IA*百*下的按键值越大点亮的 LED 越多。*/#include#include#define uchar unsigned char#define uint unsigned int/矩阵键盘按键特征码表uchar code KeyCodeTable=0 x11,0 x12,0 x14,0 x18,0 x21,0 x22,0 x24,
36、0 x28,0 x41,0 x42,0 x44,0 x48,0 x81,0 x82,0 x84,0 x88;/延时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=0 xf0;/ 若高 4 位出现 0,则有键按下if(P1&0 xf0)!=0 xf0)DelayMS(2);if(P1&0 xf0)!=0 xf0)sCode=0 xfe;/行扫描码初值for(k=0;k4;k+) / 对 4 行分别进行扫描P1
37、=sCode;if(P1&0 xf0)!=0 xf0)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_Sca n();/扫描键盘获取按键序号KeyNoif(KeyNo!=-1)P2_LED=0 xff;P3_LED=0 xff;for(i=0;i=KeyNo;i+)
38、键值越大,点亮的 LED 越多if(i=1;elseP2_LED=1;P3=P3_LED;/点亮条形 LEDP2=P2_LED;17 数码管显示 4X4 矩阵键盘按键号/* 名称:数码管显示 4X4 矩阵键盘按键号 说明:按下任意键时,数码管都会显示其键的序号,扫描程 序首先判断按键发生在哪一列, 然后根据所发生的行附加不同的 值,从而得到按键的序号。*/#in clude#define uchar un sig ned char #define uint un sig ned int/段码uchar code DSY_CODE=0 xc0,0 xf9,0 xa4,0 xb0,0 x99,0
39、x92,0 x82,0 xf8,0 x80,0 x90,0 x88,0 x83,0 xc6,0 xa1,0 x86,0 x8e,0 x00;sbit BEEP=P3A7;/上次按键和当前按键的序号,该矩阵中序号范围015, 16 表示无按键uchar Pre_KeyNo=16,KeyNo=16;/延时void DelayMS(ui nt x)h M IM&MTR3UKS和呻PdJWX1m:浊m4MJ4”呻P3IVU1戟ZPZAID*i3um F24A!2皿F2XA1-4FT-ZWraL l -*awnPjRrir口Pi .Iuchar i;while(x-) for(i=0;i4A0 x0f;
40、/按键后 f0 变成 XXXX0000 , X 中有 1 个为 0,三个仍为 1;高 4 位转移到低 4 位并 异或得到改变的值switch(Tmp) /对 03 行分别附加起始值 0,4,8,12case 1: KeyNo+=0;break;case 2: KeyNo+=4;break;case 4: KeyNo+=8;break;case 8: KeyNo+=12;/蜂鸣器 void Beep()uchar i;for(i=0;i100;i+)DelayMS(1);BEEP=BEEP;BEEP=0;/主程序void main()P0=0 x00;BEEP=0;whileP 仁 OxfO;i
41、f(P1!=OxfO) Keys_Sca n();/ 获取键序号if(Pre_KeyNo!=KeyNo)PO=DSY_CODEKeyNo;Beep();Pre_KeyNo=KeyNo;DelayMS(100); 18 开关控制 LED/* 名称:开关控制 LED说明:开关 S1 和 S2 分别控 制LED1 和 LED2。*/#in cludesbit S 仁 P1A0;sbit S2=P1A1;sbit LED1=P0A0;sbit LED2=P0A1;/主程序void mai n()while(1)LED1=S1;LED2=S2;C1a.rn X1U1貿TL2ciRySTiiL.-R1厂:
42、;jj,CSk.w.4 4.t$sr.t$sr第兽阳了19 继电器控制照明设备/* 名称:继电器控制照明设备 说明:按下 K1 灯点亮,再次 按下时灯熄灭*/#in clude#define uchar un sig ned char#define uint un sig ned intPQ.UAD1PCI.:工Hi AjFfl 4FAM1Fn.sAbs冈 用 川 禹P0rAP7*jCUADtji ri怖加血时加皿RIPlAEMP2诬令P2 210PXN ALEEtF2.W11 PIF2 W14P2T.M.15psnkKbM DFli 1p|l jp|i Pli TP3 Mil曲删1Fl 5U
43、MF4l ?MT祐亠玄二P2O/WQP2W翅F22JWM0P2SIA11P3.4JAt2工:心心j P211P2佃若P3.T/D二MFmP34HO啤列PS勺两勺两P3w,flD亠lammR3沁沁.R2車D27J0VL2220II说明:系统显示拨码开关所设置的编码000255*/#in clude#in clude#define uchar un sig ned char#define uint un sig ned int/各数字的数码管段码(共阴)uchar code DSY_CODE=0 x3f,0 x06,0 x5b,0 x4f,0 x66,0 x6d,0 x7d,0 x07,0 x7f
44、,0 x6f;/显示缓冲uchar DSY_Buffer3=0,0,0;/延时void DelayMS(ui nt ms)uchar t; while(ms-)for(t=0;t120;t+);/主程序void mai n()sbit K 仁 P1A0;sbit RELAY=P2A4;/延时void DelayMS(ui nt ms)uchar t;while(ms-)for(t=0;t时 UNTIFlJP3JiTC町粗M WMJP -3 ? MrBn.mJIrr*Muchar i,m,Num;PO=Oxff;P2=0 xff;while(1)m=0 xfe;Num=P1; /读取拨码开关的值
45、DSY_Buffer0=Num/100;P1.0 输出两种不同频率的声音, 模拟很逼真的报警效果DSY_Buffer1=Num/10%10;DSY_Buffer2=Num%10; for(i=0;i50ittKDFIJI 吩PaiiTMD 说逝r 1 ?P3 3WNT1Pl.*P3 iTTOiiP3 5/TiPI 牟Pl 7何 titl4ILMJJi说明:用 K1 开关控制报警器,程序控制*/#in clude#define uchar un sig ned char#define uint un sig ned int sbitSPK=P1A0;sbit K 仁 P7;/发声函数void A
46、larm(uchar t)uchar i,j;for(i=0;i200;i+)SPK=SPK;for(j=0;jt;j+);由参数 t 行成不同的频率void mai n()SPK=0;while(1)FOOMODPO1/W)1FO2/A32l-QWSpoeri-iELCT U.IXTAL2PSTKKTPicuuska P21M P2卫恥id PJ.3AA1 iPZ-AW2 P2J5胆伯P2.7W1Spm M 1P12 PI 3pmro i田FlT功P3-ZJNT5-PI *P3 41HUF3.&T1PI 5Pl aPI .7IM I-亠二玄二工丄亠圭二二:!,-,-if(K1=1)Alarm
47、(90); Alarm(120);22 按键发音/*名称:按键发音说明:按下不同的按键会是SOUNDER输出,以后也可使用定时器*/#in clude#define uchar un sig ned char#define uint un sig ned intsbit BEEP=P3A7;sbit K 仁 P1A4;sbit K2=P1A5;sbit K3=P6;sbit K4=P1A7;/延时void DelayMS(ui nt x)uchar t;while(x-) for(t=0;t120;t+);/按周期 t 发音void Play(uchar t)uchar i;for(i=0;i
48、100;i+)BEEP=BEEP; DelayMS(t);BEEP=0;void mai n()P 仁 Oxff;BEEP=0;while(1)if(K1=0) Play(1);发出不同频率的声音。本例使用延时函数实现不同频率的声音MCTHLJlWTO|=ET曲曲储PO?JA&7-SEs贋2童小P24UA1J陀却J pm XicEAPd 0P11P3 1 HMDPI 2POr3.3T4T1lPI 4psjimPH 5punriP!l BP3.E3AF7P37CIC1LJS. Mif(K2=0)Play(2);if(K3=0)Play(3);if(K4=0)Play(4);23播放音乐/* 名称
49、:播放音乐说明:程序运行时播放生日快乐歌, 未使用定时器中断,所有频率完全用延时实现 */#include#define uchar unsigned char#define uint unsigned intsbit BEEP=P3A7;/生日快乐歌的音符频率表,不同频率由不同的延时来决定 uchar codeSONG_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; /生日快乐歌节拍表,节拍决定每个音符的演奏长短 uchar
50、codeSONG_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;/延时void DelayMS(uint x)uchar t;while(x-) for(t=0;t120;t+);/播放函数void PlayMusic()uint i=0,j,k;while(SONG_LONGi!=0|SONG_TONEi!=0)/ 播放各个音符, SONG_LONG 为拍子长度for(j=0;jSONG_LONGi*20;j+)BEEP=BEEP;/SONG_TONE 延时表决定了每个音符的频率for(k=
51、0;kSONG_TONEi/3;k+);DelayMS(10);i+;void main()BEEP=0;while(1)PlayMusic(); 播放生日快乐DelayMS(500);/播放完后暂停一段时间24INTO 中断计数 /* 名称:INT0 中断计数说明:每次按下计数键时触发 INT0中断,中断程序累加计数, 计数值显示在 3 只数码管上,按下 清零键时数码管清零*/#in clude#defi ne uchar un sig ned char#defi ne uint un sig ned int09 的段码uchar code DSY_C0DE=0 x3f,0 x06,0 x5
52、b,0 x4f,0 x66,0 x6d,0 x7d,0 x07,0 x7f,0 x6f,0 x00;/计数值分解后各个待显示的数位uchar DSY_Buffer=0,0,0;uchar Coun t=0;sbit Clear_Key=P3A6;/数码管上显示计数值 void Show_Co un t_ON_DSY()DSY_Buffer2=Count/1OO; /获取 3 个数DSY_Buffer1=Cou nt%100/10;DSY_BufferO=Cou nt%10;if(DSY_Buffer2=0)/高位为 0 时不显示DSY_Buffer2=0 x0a;if(DSY_Buffer1=
53、O) /高位为 0,若第二位为 0 同样不显示DSY_Buffer1=0 x0a;P0=DSY_CODEDSY_Buffer0;P1=DSY_CODEDSY_Buffer1;P2=DSY_CODEDSY_Buffer2;/主程序void mai n()P0=0 x00;叫吃U4r gKilMIJig-TAi.itFI 1iTC- pjPI巴屮wP1=0 x00;P2=0 x00;IE=0 x81; / 允许 INTO 中断IT0=1;下降沿触发while(1)if(Clear_Key=O) Cou nt=O; 清 Show_Co unt_O N_DSY();/INT0 中断函数void EX_
54、INT0() in terrupt 0Cou nt+;/计数值递增25外部 INT0 中断控制 LED/* 名称:外部 INT0 中断控制 LED说明:每次按键都会触发 INT0 中 断,中断发生时将 LED 状态取反,产 生 LED 状态由按键控制的效果*/#in clude#define uchar un sig ned char#define uint un sig ned intsbit LED=P0A0;II 主程序 void mai n()LED=1;EA=1;EX0=1;IT0=1;while(1);IIINT0 中断函数void EX_INT0() in terrupt 0LE
55、D=LED; II 控制 LED 亮灭26 INT0 及 INT1 中断计数I* 名称:INT0 及 INT1 中断计数说明:每次按下第 1 个计数键时,第 1 组计数值累加并显示在右边3 只数=:订13PaEUADD直 M 廡 IIWWIS Pa 础 w凶倔%PDTJlAD?P2L1MSP2 ?!A !1PSEFT止 LE陀 till2EAP? 7X15F1On 师曲pi 1P3.iDi&P12M2jii/rcrPi5PSajtTiFlAffDP 4书卯F3 6JWRFl IEMTPS 和pfl。蚀PQIfJkD I卩山2蚀 上PQIfADlrl IRLCPD 4fAI4PD U.C1EPD
56、.7fAOJMilPZQIAE:陆皿 曰加0PHUP2 3m:ii皆F24AA13 P2 5JA13P2 fcjfl 14 RamisFi nPi 1pg.ijpflDPI 2P| 3P3 WN11PI.4PI 5Pl EP3BIVMRPi 7_11C-FJ1-L码管上, 每次按下第 2 个计数键时,第 2 组计数值累加并显示在左边 3 只数码管上,后两个按键分别清 零。*/#include#define uchar unsigned char#define uint unsigned intsbit K3=P3A4; 2 个清零键sbit K4=P3A5;/数码管段码与位码uchar cod
57、e DSY_CODE=0 xc0,0 xf9,0 xa4,0 xb0,0 x99,0 x92,0 x82,0 xf8,0 x80,0 x90,0 xff;uchar code DSY_Scan_Bits=0 x20,0 x10,0 x08,0 x04,0 x02,0 x01;/2 组计数的显示缓冲,前 3 位一组,后 3 位一组uchar data Buffer_Counts=0,0,0,0,0,0;uint Count_A,Count_B=0;/延时void DelayMS(uint x)uchar t;while(x-) for(t=0;t120;t+);/数据显示void Show_Co
58、unts()uchar i;Buffer_Counts2=Count_A/100;Buffer_Counts1=Count_A%100/10;Buffer_Counts0=Count_A%10;if( Buffer_Counts2=0)Buffer_Counts2=0 x0a;if( Buffer_Counts1=0)Buffer_Counts1=0 x0a;Buffer_Counts5=Count_B/100;Buffer_Counts4=Count_B%100/10; Buffer_Counts3=Count_B%10;if( Buffer_Counts5=0)Buffer_Counts5
59、=0 x0a;if( Buffer_Counts4=0)Buffer_Counts4=0 x0a;for(i=0;i6;i+)P2=DSY_Scan_Bitsi;P1=DSY_CODEBuffer_Countsi;DelayMS(l);/主程序void mai n()IE=0 x85;PX0=1;中断优先IT0=1;IT 1=1;while(1)if(K3=0) Cou nt_A=0; if(K4=O) Cou nt_B=O; Show_Cou nts();/INTO 中断函数void EX_INT0() in terrupt 0Coun t_A+;/INT1 中断函数void EX_INT1
60、() in terrupt 2Cou nt_B+;27 定时器控制单只 LED /* 名称:定时器控制单只 LED说明:LED 在定时器的中断例程控制下不断闪烁。*/ #in clude#defi ne uchar un sig ned char#defi ne uint un sig ned intsbit LED=P0A0;uchar T_Coun t=0;/主程序void mai n()TMOD=0 x00;/定时器 0 工作方式 0TH0=(8192-5000)/32;/5ms 定时TL0=(8192-5000)%32;IE=0 x82;允许 T0 中断TR0=1;UiUtlALfKi
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 湖北省恩施市达标名校2026届中考押题物理预测卷含解析
- 湖南省郴州市第五完全中学2026届中考语文对点突破模拟试卷含解析
- 2026届江苏省扬州市重点中学中考三模物理试题含解析
- 2026届浙江省温州市瑞安市集云实验校中考联考英语试卷含答案
- 农民互助增收农业技术推广服务协议
- 消防报警系统维护协议
- 项目合作开发协议及实施细则签署函件通知
- 农业电商平台物流配送体系优化2025年研究报告:效率提升与成本控制
- 2025年零售企业数字化供应链协同模式创新案例分析报告
- 2025年工业互联网平台传感器网络自组网技术产品创新与研发趋势报告
- 2024运维服务保密协议
- TSG-T7001-2023电梯监督检验和定期检验规则宣贯解读
- 叙事护理学智慧树知到期末考试答案章节答案2024年中国人民解放军海军军医大学
- 2024年西安市安居建设管理集团有限公司招聘笔试冲刺题(带答案解析)
- PDCA提高卧床患者踝泵运动的执行率
- 票务购票合同
- 河南省城市生命线安全工程建设指引V1
- 中国古代建筑史读后感
- 运维管理安全需求分析
- 人才发展(培训课件)
- 纺织行业市场调研及授信指引
评论
0/150
提交评论