1、用查表方式编写 yx1 3x2 3x3 3。 (x 为 09 的整数)#includevoid main()int code a10=0,1,8,27,64,125,216,343,512,729;/将 09 对应的每位数字的三次方的值存入 code 中, code 为程序存储器,当所存的值在 0255 或 -128+127 之间的话就用 char,而现在的值明显超过这个范围,用 int 较合适。 int 的范围是 065535 或 -3276832767。int y,x1,x2,x3;/此处定义根据习惯,也可写成 char x1,x2,x3 但是变量 y 一定要用 int 来定义。x1=2;
2、x2=4;x3=9;/x1,x2,x3 三个的值是自定的,只要是 09 当中的数值皆可,也可重复。y=ax1+ax2+ax3;while(1);/单片机的程序不能停,这步就相当于无限循环的指令,循环的内容为空白。/结果的查询在 Keilvision 软件内部,在仿真界面点击右下角(一般初始位置是右下角)的watch 的框架内双击 “double-click or F2 to add”文字输入 y 后按回车,右侧会显示其 16 进制数值如 0x34,鼠标右键该十六进制,选择第一行的 decimal,可查看对应的 10 进制数。1、有 10 个 8 位二进制数据,要求对这些数据进行奇偶校验,凡是满
3、足偶校验的数据(1 的个数为偶数)都要存到内 RAM50H 开始的数据区中。试编写有关程序。#includevoid main()int a10=0,1,5,20,24,54,64,88,101,105;/将所要处理的值存入 RAM 中,这些可以根据个人随意设定,但建议不要超过 0255 的范围。char i; /定义一个变量char *q=0x50; /定义一个指针 *q 指向内部 0x50 这个地址。for(i=9;i=0;i-)/90 循环,共十次,也可以用 for(i=0;ivoid main()char data a10=-50,-36,0,-128,1,99,127,89,-89,
4、40 ;/将所有值存入 RAM 中,因为有负数,所以不能用 unsigned char。因为是 char 所以假设的数值不要超过 -128+127 之外unsigned char *q=0x50; /定义指针 *q 指向 0x50unsigned char i,j;char t; /定义三个变量,用于循环及换位。在换位时有赋值,所以 t 要用 char 不能用 unsigned char。for(i=0;iaj+1)t=aj;aj=aj+1;aj+1=t; for(i=0;ivoid delay(unsigned char x) /定义延迟函数,用于后面 LED 灯亮的持续时间。unsigne
5、d char i,j,k; dofor(i=10;i0;i-)for(j=100;j0;j-)for(k=249;k0;k-);while(-x);main()P1=0xfe;/11111110 第一个灯亮while(1)delay(1);/延时 500msP1=P1sbit p1_0=P10;sbit p1_1=P11;sbit p1_2=P12;sbit p1_3=P13;/程序不能对单个引脚进行编程,需要用 sbit 定义才可用。main() p1_0=1;p1_1=1;p1_2=1;p1_3=1;/前两个引脚置一是为了让其能获取输入信号,后两个引脚是赋初值,方便后面取反工作。while
6、(1)if(!p1_0)/判断 P1.0 的引脚是否有变化。p1_2=!p1_2; /如果 P1.0 引脚变化, P1.2 引脚也跟随变化。if(!p1_1)/判断 P1.1 的引脚是否有变化。p1_3=!p1_3;/如果 P1.1 引脚变化, P1.3 引脚也跟随变化。2、扩展部分:(1) 利用 P1 口控制发光二极管 LED 灯按照下面方式工作:a) LED 灯从左到右依次点亮;b) LED 灯从右到左依次点亮;c) 按照以上步骤重复运行,其中要求灯亮的时间为 500ms。#include void delay(unsigned char x)unsigned char i,j,k;dof
7、or(i=10;i0;i-)for(j=100;j0;j-)for(k=249;k0;k-);while(-x);main()while(1) /无限循环里面的内容P1=0XFE;/右移完毕后赋初值,为左移做准备delay(1);while(1)P1=P11;/如果左移右移是单个灯移动的话,那么这句改为LED=LED1|0x80;就可以了。delay(1);if(P1=0x00)/判断右移是否完毕,完毕后 break 跳出break;(2) 利用 P1 口控制发光二极管 LED 灯按照下面方式工作:a)从左到右奇数 LED 灯依次点亮;b)从右到左偶数 LED 灯依次点亮;c)按照以上步骤重复
8、运行,其中要求灯亮的时间为 500ms。#include /此程序也可以用 来实现,具体细节可以来问我#include/当程序中有涉及到 _crol_或者 _nop_等库函数时,必须添加此头文件。void delay(unsigned char x)unsigned char i,j,k;dofor(i=10;i0;i-)for(j=100;j0;j-)for(k=249;k0;k-);while(-x);main()while(1) /无限循环括号里的内容P1=0xfe; /第一个灯亮,while(1)delay(1);P1=_crol_(P1,2); /P1 左移两个位置if(P1=0xf
9、e) /判断左移结束break;P1=0X7f;while(1)delay(1);P1=_cror_(P1,2); /P1 右移两个位置if(P1=0x7f) /判断右移结束break;#includevoid delay(unsigned char x)/延时函数 500msunsigned char i,j,k;dofor(i=10;i0;i-)for(j=100;j0;j-)for(k=249;k0;k-);while(-x);main()while(1) /无限循环括号里的内容P1=0xfe;/赋值,为左移做准备delay(1);while(1)P1=(P11)|0x80; /P1 右
10、移一个位,补位补的是 1,同样的,不明白来找我P1=P11; /P1 右移一个位delay(1);if(P1=0x55) /判断右移是否完毕,退出此次循环。break;本实验模拟交通信号灯控制,一般情况下正常显示,有急救车到达时,两个方向交通信号灯全红,以便让急救车通过。设急救车通过路口时间为 5 秒,急救车通过后,交通恢复正常,本实验用单次脉冲申请外部中断,表示有急救车通过。#includeunsigned char x,y,i,j,k; /设置unsigned char d0,d1,d2,d3; /定义四个变量用于记录中断时的现场,以便恢复现场。void delay(x)/延时函数dofo
11、r(i=10;i0;i-)for(j=100;j0;j-)for(k=249;k0;k-);while(-x);zd() interrupt 0 /定义中断函数,无需声明。 interrupt 0 表示外部中断 0的中断函数y=P1; d0=x; d1=i;d2=j;d3=k; /记录中断时 P1 的值,延时函数的 x,i,j,k 也要记录。P1=0xf6; /P1 应为东西红南北红,所以设为 F6。delay(5);x=d0;i=d1;j=d2;k=d3;P1=y; /现场恢复,包括延时函数中的 x,i,j,k。main()P1=0xf6; /P1 设定初始状态,两路皆为红灯,此步骤可以忽略
12、。delay(1);EA=1; /开总中断EX0=1; /开外部中断 0 中断。IT0=1; /设置外部中断 0 为下降沿触发有效方式。 IT0=0 为低电平有效while(1) /下列四种灯亮的状态循环。P1=0xf3;/东西绿,南北红delay(10); P1=0xf5; /东西黄,南北红delay(3);P1=0xde;/东西红,南北绿delay(10);P1=0xee; /东西红,南北黄delay(3);1、基本部分:用 CPU 内部定时器中断方式计时,实现每一秒钟输出状态发生一次反转.#includesbit p1_0=P10; /要使用单个引脚应先定义unsigned char i
13、;void main()TMOD=0X01;/t0 工作在定时器,工作方式 1TL0=0XB0;TH0=0X3C;/设定定时器初值,初值的计算可查看书本 P143,此处定时器定时时间为100msIE=0X82; /开 EA 总中断,开 t0 中断TR0=1; /定时器工作开关开启i=10; /设定 i 作为后面定时一秒的使用while(1);t_0() interrupt 1/T0 定时 /计数器的中断i-; /进入一次中断, i 的值减一if(i=0) /当进入 10 次中断,即 i=0 的时候,定时时间为 1S。i=10; /重新让 i=10,使得后面继续定时 1S。p1_0=p1_0;
14、/P1.0 取反。TL0=0XB0;TH0=0X3C;/赋定时初值,定时器或计数器必要步骤,除工作方式 2 外。2、扩展部分:利用 P1 口控制发光二极管 LED 灯按照下面方式工作:1)从左到右奇数 LED 灯依次点亮;2)从右到左偶数 LED 灯依次点亮;3)按照以上步骤重复运行,其中要求灯亮的时间为 500ms,由定时器 T1 实现。#include#includeunsigned char i,j,k;void main()TMOD=0X10; /设定 T1 工作在定时器 T1,方式 1。同时也会设定 T0 工作在定时器T0,方式 0,但是我们后面没有 interrupt 1 的子函数
15、,所以 T0 没发挥作用。IE=0X88; /开总中断,开 T1 中断TL1=0XB0;TH1=0X3C;/定时器初值,时间为 100msTR1=1; /开定时器 T1 的开关i=5;j=0;k=0; /用三个变量来判断时长,循环阶段。P1=0xfe; /赋 P1 初值,第一个灯亮while(1); /等待定时工作完成t_1() interrupt 3 /T1 的中断子函数i-; /进入一次, i 就减 1TL1=0xB0;TH1=0x3C; /每次进入中断定时器的初值就为 0,所以需要重装if(i=0) /500ms 后i=5; /让 i=5,继续定时 500ms。j+; /j 一开始为 0
16、, j 加一if(j=4)/如果 j 等于 4,代表 P1 口左移了四次j=0; k=!k; /k 取反,用于后面左移右移的执行if(k=0) /P1 口左移if(P1=0xfd) /左移到头了,要右移需要把灯亮的位置变化下P1=0xbf; P1=_crol_(P1,2);if(k!=0)/P1 口右移if(P1=0xbf)/右移到头了,要右移需要把灯亮的位置变化下P1=0xfd;P1=_cror_(P1,2); #includeunsigned char i,j;void main()i=5;j=0;P1=0xfe;/只亮第一个灯TMOD=0X10; /设置 T1 的工作方式为 1,定时器工
17、作IE=0X88; /中断 EA 开, ET1 开TL1=0XB0; TH1=0X3C; /初值设定为 100msTR1=1; /开启工作开关while(1); /等待定时工作完成t_1() interrupt 3 /T1 中断子函数i-; TL1=0XB0;TH1=0X3C; /赋初值if(i=0)/时间为 500msi=5;j+; /利用 j 来判断左移或右移是否结束if(j4) /右移阶段P1=P11|0X80;P1=P11|0X80;/P1 口右移两位,且补位是补 1。也可以用 P1=P12|0XC0代替if(j=8) /右移结束,赋 P1 值准备左移P1=0xfe; j=0; /最后
18、还要将 J 恢复为 0 以便下次循环。1、基本部分:8031 内部定时计数器 T0,按计数器模式和方式 1 工作,对 P3.4(T0)引脚进行计数。将其数值按二进制数在 P1 口驱动 LED 灯上显示出来。#includevoid main()TMOD=0X05; /T0 工作方式 1,计数器工作TL0=0X00;TH0=0Xff;/初值设置方法可以参考 P143 页IE=0X82; /中断 EA=1, ET0 中断开启TR0=1; /开启中断开关while(1)P1=TL0; /计数器的值存在 TL0 里面。每加一个值,所得的值就是以八位二进制形式存在 TL0 里面的。 t_0() inte
19、rrupt 1 /T0 的计数器中断TL0=0X00;TH0=0Xff;2、扩展部分:利用 T0 作为定时器,T1 作为计数器,将试验箱上的脉冲信号源接到 T1 引脚,测量出脉冲信号源的频率。#includeunsigned char i,a;void main()a=0;i=10;TMOD=0X51; /设置 T0 为工作方式 1,定时器工作。 T1 为工作方式 1,计数器工作EA=1;ET0=1;ET1=0;/这里也可以设置为 IE=0x82。关闭了 T1 的中断TL0=0XB0;TH0=0X3C;/时间设定为 100msTL1=0X00;TH1=0X00; /计数器开启最大范围计数TR0
20、=1;TR1=1; /皆开启开关while(1)/等待计数定时工作完成if(TF1=1)/查询溢出标志位。a+; /溢出一次 a 的值加 1TF1=0; /将溢出标志位清零TH1=0x00;TL1=0X00;/重新装上计数器初值t_0() interrupt 1 /定时器 T0 的中断子程序TL0=0XB0;TH0=0X3C; /赋初值i-;if(i=0)i=10;P1=TL1;/将低位记录的次数赋给 P1 显示出来。P2=TH1;/将高位记录的次数赋给 P2 显示出来,即一秒内的计数次数,即为频率。TR0=0;TR1=0;/频率读出后关闭 T0 和 T1/一般情况下,所测频率不能超过 500
21、kHz,否则此程序结果有错。程序频率计算为:P1 和 P2 的读数转为十进制数字,加上( a*65536)得出频率总和。1、基本部分:利用 74ls165 读入拨盘开关的状态,利用单片机串行口将状态读入并通过 P1 口输出到 LED,从而实现拨盘开关对 LED 灯的控制。#includesbit P1_6=P16; /实验箱内部已经将 P1.6 引脚与 165 的 S/L 引脚相连,也把 P3.6与 165 的 CLK 引脚相连void main()SM0=0; SM1=0; REN=1; /串行口工作方式 0,也可用 SCON=0x10 EA=1;ES=1; /开总中断和串行口中断 whil
22、e(1);I_0() interrupt 4 /串行口中断子程序P1_6=0; /让 74LS165 将按键的状态读入 P1_6=1; /让 74LS165 将读入的 8 位按键码用串行方式输出,从低位到高位 ; P2=SBUF; /将 SBUF 缓冲器里的数据读给 P2RI=0;/RI 要由软件置 02、扩展部分:利用 74ls165 读入拨盘开关的状态,利用单片机 P3 口将状态读入并通过 P1 口输出到 LED,从而实现拨盘开关对 LED 灯的控制。#includesbit p1_6=P16;/与 165 的内部 S/L 相连sbit p3_6=P36; /与 165 的内部 CLK 相
23、连sbit p1_7=P17; /P1.7 短路帽扣上时, P1.7 与 165 的 QH 相连unsigned char i,x;main()while(1)p1_6=0; /数据移入 165 芯片p1_6=1; /数据从 165 芯片输出x=p1_7; /防止第一位丢失for(i=0;ivoid main()SM0=0;SM1=1;SM2=0;/设定串行口工作方式 1,单对单通信,可用 SCON=0X40 代替EA=0;ES=0;ET1=0; /关串行口中断,关总中断,关定时 /计数器 T1 中断PCON=0; /设置 SMOD=0,波特率不加倍TMOD=0X20; /设置定时 /计数器
24、T1 为工作方式 2,定时器工作TH1=0XFE;TL1=0XFE; /赋初值,此处赋值与定时或计数赋初值不同,此处初值用于波特率,可参考 P168TR1=1; /开定时器 T1while(1)SBUF=P2; /把 P2 口接收到的值赋给发送 SBUF,准备发送while(TI=0); /等待发送完毕TI=0; /将发送标志位 TI 置 0,此步一定要软件操作乙方:#includevoid main()SM0=0;SM1=1;SM2=0;REN=1; /串行口工作方式 1,单对单通信,可用 SCON=0x50 代替EA=0;ET1=0;ES=0; /关所有中断TMOD=0X20; /T1 工
25、作方式 2,定时器工作PCON=0; /SMOD=0,波特率不加倍TH1=0XFE;TL1=0XFE; /与发送端相同的波特率,则初值也应当一样TR1=1;while(1)while(RI=0); /等待接收完毕P1=SBUF; /将接收到的值赋给 P1RI=0; /将接收标志位置 02、扩展部分:利用单片机的串行口完成数据的自发自收,发送数据在内部 RAM30H 为首的 8 个单元中,数据分别是:55H,AAH,33H ,CCH,0FH,F0H,66H ,99H;接收后能在LED 显示出接收的数据值(二进制形式) 。#includeunsigned char x,i,*p,*q;void d
26、elay(x)unsigned char j,k,l;dofor(j=10;j0;j-)for(k=100;k0;k-)for(l=249;l0;l-);while(-x);main()unsigned char data a8=0x55,0xAA,0x33,0xCC,0x0F,0xF0,0x66,0x99;p=0x30;for(i=0;i8;i+)*p=ai;p+;SM0=0;SM1=1;REN=1;/串行口工作方式 1,可用 SCON=0X50 代替TMOD=0X20; /T1 工作在方式 2,定时器工作PCON=0; /SMOD=0,波特率不加倍TH1=0Xe8;TL1=0Xe8; /设
27、定初值,用于设定波特率,换算公式参考 P168EA=1; /开总中断ET1=0; /关定时器 T1 中断,此处一定要关中断,因为我们不是用该定时器来做定时工作的ES=1; /开串行口中断q=0x30; /指针指向 0x30 地址TR1=1; /开 T1 工作开关SBUF=*q; /将指针指向的值赋给发送 SBUF 等待发送while(1); T_1() interrupt 4 /串行口中断程序q+; /传输完一个数据后,指针加 1,指向下一个位置P1=SBUF;/将接收到的数据在 P1 口显示出来delay(1);/延时 500MS(晶振在 12MHz 的前提下)SBUF=*q; /将指针指向的值赋给发送 SBUF,准备发送TI=0; RI=0;/置 TI 和 RI 为 0