《西南科技大学单片机上机考试题答案(共23页).doc》由会员分享,可在线阅读,更多相关《西南科技大学单片机上机考试题答案(共23页).doc(23页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、精选优质文档-倾情为你奉上/* * file 识别最大模拟输入通道 * author 秘密作战实验室(FREES) * version v1.0 * date 2015-06-26 * 功 能:利用0809采集两路模拟电压, 将电压值最大的通道号显示在LED显示器上。(硬件电路参见AD_CH2_1.DSN)。 * */#include /51单片机头文件#include /宏定义#defineTIMER1DEF( 65536 - 50000 ) /定时时间#defineAD_Convert(i)(*(unsigned char volatile xdata *) (0x3c00 + i) =
2、0) /返回片外地址#defineAD_Read(i)(*(unsigned char volatile xdata *) (0x3c00 + i) /全局变量定义int Flag=0;intbAD_Val_2 = 0;/ AD通道2转换结果intbAD_Val_7 = 0;/ AD通道7转换结果int table10=0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90; /共阳数码管0-9 /* 函数名称:delay(n)* 功 能:程序延时n ms* 入口参数:无* 出口参数:无*/void delay(int n)/int i=0,j=0;
3、for(i=n;i0;i-)for(j=114;j0;j-); /* 函数名称:TimeT1()* 功 能:定时器1初始化 50ms定时* 入口参数:无 * 出口参数:无*/void TimeT1() TMOD=0X10; /定时器1 方式1TH1=TIMER1DEF/256;/装定时初值高8位,定时50ms 计算公式 高位us=(65535-50000)/256TL1=TIMER1DEF%256;/装定时初值低8位,定时50ms 计算公式 低位us=(65535-50000)%256PT1=1; /定时器1 中断优先级 高ET1=1; /定时器1 中断控制位 TR1=1; /定时器1 启动控
4、制位/* 函数名称:main()* 功 能:程序入口* 入口参数:无* 出口参数:无*/void main(void)/-加油/ 初始化P1=0Xff;/外部中断初始化IT1=1; /脉冲触发方式1:负跳变沿有效0:EX1=1; /外部中断1中断控制位TimeT1(); /定时器1初始化EA = 1; / 开中断delay(500);while( 1 ) / 主循环 delay(50); if(bAD_Val_2=bAD_Val_7) P1=table2; if(bAD_Val_7bAD_Val_2) P1=table7;/* 函数名称:INT_INT1()* 功 能:INT1中断服务程序,使
5、用工作寄存器组1* 入口参数:无* 出口参数:无*/voidINT_INT1(void)interrupt 2 using 1if(Flag=1) bAD_Val_2=AD_Read(2);if(Flag=2) bAD_Val_7=AD_Read(7);/* 函数名称:INT_T1()* 功 能:T1中断服务程序,使用工作寄存器组1* 入口参数:无* 出口参数:无*/voidINT_T1() interrupt 3 using 1static intbCount = 3 ; -bCount; TH1=TIMER1DEF/256; TL1=TIMER1DEF%256;if( bCount = 2
6、)Flag=1;AD_Convert(2);if(bCount=1)Flag=2;AD_Convert(7);if(bCount=0) bCount=4;/* * file 按键扫描 * author 秘密作战实验室 * version v1.0 * date 2015-06-26 * 功 能:利用8255的PC口实现3X3键盘扫描(硬件电路参见3X3KEY_8255.DSN)。 当18号键独立按下时,连接在PA口对应的LEDx点亮(即1号键按下时LDE1亮,2号键按下时LDE2亮), 当9号键按下时,所有LED点亮,当没有键按下时,所有LED熄灭。*/#includereg52.h#incl
7、udeabsacc.h /Direct access to 8051sbit CS=P27; /片选段 #define PA XBYTE0x0000/定义端口A地址#define PB XBYTE0x0400/定义端口B地址#define PC XBYTE0x0800/定义端口C地址#define CN XBYTE0xC000/定义控制口地址unsigned char Key_Scanf(void)/按键扫描函数unsigned char key=0;PC=0xFB;/把PC2置0,PC1和PC0置1第一列if(PC=0xDB)key=1;if(PC=0xBB)key=4;if(PC=0x7B
8、)key=7;PC=0xFD;/把PC1置0,PC2和PC0置1第二列if(PC=0xDD)key=2;if(PC=0xBD)key=5;if(PC=0x7D)key=8;PC=0xFE;/把PC0置0,PC2和PC1置1第三列if(PC=0xDE)key=3;if(PC=0xBE)key=6;if(PC=0x7E)key=9;return(key);void main(void) /给我最亲爱的女盆友 unsigned int a=0xff; CS=0;CN=0x88;/8255初始化,写控制字while(1)switch(Key_Scanf()case 0:PA=0xff;break; c
9、ase 1:PA=0xfe;break;case 2:PA=0xfd;break; case 3:PA=0xfb;break;case 4:PA=0xf7;break;case 5:PA=0xef;break;case 6:PA=0xdf;break;case 7:PA=0xbf;break;case 8:PA=0x7f;break;case 9:PA=0x00;break;default:break; /* * file 50Hz锯齿波 * author 秘密作战实验室 (Frees) * version v1.0 * date 2015-06-26 * 功 能:利用0832同步输出两个频率
10、为50赫兹的锯齿波(硬件电路参见DA_BUF2_1.DSN)。*/#includereg52.h#includeabsacc.h#define DA_1 XBYTE0x2000/设置DAC08321的选通地址#define DA_2 XBYTE0x2400/设置DAC08322的选通地址#define DA_S XBYTE0x3c00/设置DAC0832的选通地址unsigned int DAVAL=0;void delay(unsigned int time)unsigned int i=0,j=0;for(i=0;itime;i+)for(j=0;j=255)DAVAL=0;/* * fi
11、le Pwm发生器 * author 秘密作战实验室 * version v1.0 * date 2015-06-26 * 功 能:在硬件电路PWM.DSN中实现P1.7输出PWM波。周期T=100ms,初始占空比(T1/T)为50%, 按键KEY1每次增加占空比10%(直到90%),KEY2每次减小占空比10%(直到10%)。 */#includereg52.hsbit Key0=P10;/P10sbit Key1=P11;/P11sbit PWM=P17;unsigned char num=0,Duty=5;void Delay(unsigned int time)unsigned int
12、 i=0,j=0;for(i=0;itime;i+)for(j=0;j1?Duty:1;Duty=Duty9?Duty:9;void Timer0_Inits(void)TMOD|=0x01;TH0=(65535-10000)/256;TL0=(65535-10000)%256;TR0=1;ET0=1;EA=1;void main(void)Timer0_Inits();while(1)Key_Scanf();void PIT0(void) interrupt 1TH0=(65535-10000)/256;TL0=(65535-10000)%256;+num;if(num9)num=0;/*
13、* file 编码显示器 * author 秘密作战实验室 * version v1.0 * date 2015-06-26 * 功 能: 利用8255扩展并行端口(硬件电路参见CodeDisplay_8255.DSN)。 当KEY按下时,利用8255的PC口输入二进制值编码(6位), 将该值转换成十进制后显示在2位7段LED显示器上。 */#includereg52.h#includeabsacc.hsbit CS=P27; #define PA XBYTE0x0000#define PB XBYTE0x0400#define PC XBYTE0x0800#define CN XBYTE0x
14、C000unsigned table=0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f;unsigned char number=0;void display(unsigned char num)/PA=0xff;PA=tablenum/10;/PB=0xff;PB=tablenum%10;void main(void) CS=0;CN=0x89; /8255初始化,写控制字while(1)number=PC&0x3f;display(number);/* * file 步进电机 * author 秘密作战实验室(FREE) * version
15、 v1.0 * date 2015-06-26 * 功 能: 在SMSpeed.DSN的电路上实现:当KEY2按下时,电机停止转动,释放时继续转动。 当KEY1按下时,电机以60转/min的转速正转,释放时以120转/min的转速反转。 */#includereg52.hsbit Key1=P33;char num=0;unsigned int Speed=50000;/25000对应120r/min,50000对应60r/minchar dir=1; /电机旋转方向定义void delay(unsigned int time) unsigned int i,j; for(i=0;itime;
16、i+) for(j=0;j=4)num=0;if(num0)num=3;moto(num);/* * file 步进输出模拟电压 * author 秘密作战实验室 * version v1.0 * date 2015-06-26 * 功 能:利用0832在按键控制下步进输出模拟电压(硬件电路参见DA_BUF1_1.DSN)。要求每 按键一次递增或递减0.1V。设输出最大值为4V,最小值为1V。 */#includereg52.h#includeabsacc.hsbit Key2=P16;sbit Key1=P17;#define DA_S XBYTE0x3c00unsigned char DA
17、VAL=128;void delay(unsigned int time)unsigned int i=0,j=0;for(i=0;itime;i+)for(j=0;j200?200:DAVAL;/三目运算符,对DAVAL进行限幅DAVAL=DAVAL50?50:DAVAL;signal(DAVAL);/* * file 单个模拟电压等级识别 * author 秘密作战实验室 * version v1.0 * date 2015-06-26 * 功 能: 利用0809采集单路模拟电压,将其分级(10级),并将分级数(09)显示在LED 显示器上。(硬件电路参见AD_CH1_1.DSN)。 */
18、#include /宏定义#defineTIMER1DEF( 65536 - 50000 )#defineAD_Convert(i)(*(unsigned char volatile xdata *) (0x3c00 + i) = 0)#defineAD_Read(i)(*(unsigned char volatile xdata *) (0x3c00 + i) /全局变量定义intbAD_Val = 0;/ 转换结果unsigned char code table=0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90;/* 函数名称:delay(
19、)* 功 能:延时n毫秒* 入口参数:无* 出口参数:无*/void delay(int time)int i=0,j=0; for(i=time;i0;i-)for(j=114;j0;j-);/* 函数名称:TimeT1()* 功 能:定时器1初始化,定时50ms* 入口参数:无* 出口参数:无*/void TimeT1() TMOD=0X10; /定时器1 方式1 TH1=TIMER1DEF/256; TL1=TIMER1DEF%256; PT1=1;/定时器1 中断优先级 高 ET1=1;/定时器1 中断控制位 TR1=1;/* 函数名称:main()* 功 能:程序入口* 入口参数:无
20、* 出口参数:无*/void main(void)P1=0Xff; / 初始化TimeT1();IT1=1; /脉冲触发方式EX1=1;EA =1; / 开中断delay(500);while( 1 )/ 主循环 delay(50); P1=table10*bAD_Val/256;/* 函数名称:INT_INT1()* 功 能:INT1中断服务程序,使用工作寄存器组1* 入口参数:无* 出口参数:无*/voidINT_INT1(void)interrupt 2 using 1 bAD_Val=AD_Read(4);/* 函数名称:INT_T1()* 功 能:T1中断服务程序,使用工作寄存器组1
21、* 入口参数:无* 出口参数:无*/voidINT_T1() interrupt 3 using 1staticintbCount = 2; TH1=TIMER1DEF/256; TL1=TIMER1DEF%256;if( -bCount = 0)/ 判断100毫秒时间到 bCount=2; AD_Convert(4);/* * file 单个模拟电压监测 * author 秘密作战实验室 * version v1.0 * date 2015-06-26 * 功 能: 在VoltageMonitor_1.DSN的电路中测量由电位器产生的模拟电压,当电压小于1V时, 使连接在P1.0上的(黄)色
22、LED亮;当电压大于4V时,使连接在P1.1上的(红)色 LED亮当电压在14V时,所有LED熄灭。 要求:当信号变化后,必须在100毫秒内做出响应。 */#include /宏定义#defineTIMER1DEF( 65536 - 50000 )#defineAD_Convert(i)(*(unsigned char volatile xdata *) (0x2000 + i) = 0)#defineAD_Read(i)(*(unsigned char volatile xdata *) (0x2000 +i)/全局变量定义intbAD_Val = 0;/ 转换结果sbit P1_0=P10
23、;sbit P1_1=P11;/* 函数名称:delay()* 功 能:延时n毫秒* 入口参数:无* 出口参数:无*/void delay(int time) int i,j; for(i=0;itime;i+) for(j=0;j114;j+);/* 函数名称:TimeT1()* 功 能:定时器1初始化,定时50ms* 入口参数:无* 出口参数:无*/void TimeT1() TMOD=0X10; /定时器1 方式1 TH1=TIMER1DEF/256; TL1=TIMER1DEF%256; PT1=1;/定时器1 中断优先级 高 ET1=1;/定时器1 中断控制位 TR1=1;/* 函数
24、名称:main()* 功 能:程序入口* 入口参数:无* 出口参数:无*/void main(void)P1=0xcf;/ 初始化IT1=1;/脉冲触发方式EX1=1;TimeT1();EA = 1;/ 开中断delay(500);while( 1 ) / 主循环 if(bAD_Val=204) P1_1=0; if(bAD_Val51&bAD_Val204)P1_0=1;P1_1=1;/* 函数名称:INT_INT1()* 功 能:INT1中断服务程序,使用工作寄存器组1* 入口参数:无* 出口参数:无*/voidINT_INT1(void)interrupt 2 using 1 bAD_Val=AD_Read(6); / 此处添加读和保存AD转换结果的语句(结果保存到bAD_Val)/*