西南科技大学单片机上机考试题答案_第1页
西南科技大学单片机上机考试题答案_第2页
西南科技大学单片机上机考试题答案_第3页
西南科技大学单片机上机考试题答案_第4页
西南科技大学单片机上机考试题答案_第5页
已阅读5页,还剩18页未读 继续免费阅读

下载本文档

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

文档简介

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) = 0) /返回片外地址#de

2、fineAD_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;for(i=n;i0;i-

3、)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 启动控制位/* 函数名称:mai

4、n()* 功 能:程序入口* 入口参数:无* 出口参数:无*/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中断服务程序,使用工作寄存器组1* 入口参

5、数:无* 出口参数:无*/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)Flag=1;AD_Co

6、nvert(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#includeabsacc.h /

7、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)key=7;PC=0xF

8、D;/把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; case 1:PA=0xfe

9、;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同步输出两个频率为50赫兹的锯齿波(硬件电

10、路参见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;/* * file Pwm发生器 * a

11、uthor 秘密作战实验室 * 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 i=0,j=0;for(

12、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;/* * file 编码显示器

13、* 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 XBYTE0xC000unsigned

14、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 v1.0 * date

15、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;i+) for(j=0;j

16、=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 DAVAL=128;void

17、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)。 */#include /宏定义

18、#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()* 功 能:延时n毫秒*

19、 入口参数:无* 出口参数:无*/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()* 功 能:程序入口* 入口参数:无* 出口参数:无*/voi

20、d 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上的(黄)色LED亮;当电压大于4V时

22、,使连接在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;sbit P1_1=P1

23、1;/* 函数名称: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;/* 函数名称:main()* 功

24、能:程序入口* 入口参数:无* 出口参数:无*/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)

25、; / 此处添加读和保存AD转换结果的语句(结果保存到bAD_Val)/* 函数名称:INT_T1()* 功 能:T1中断服务程序,使用工作寄存器组1* 入口参数:无* 出口参数:无*/voidINT_T1() interrupt 3 using 1staticintbCount = 2;/ 秒计数 TH1=TIMER1DEF/256;/ 重置定时常数的语句TL1=TIMER1DEF%256;if( -bCount = 0) / 判断100毫秒时间到 bCount=2; /重置秒计数的语句 AD_Convert(6);/启动AD转换的语句 /* * file 汉字显示 * author 秘密作

26、战实验室(FREE) * version v1.0 * date 2015-06-26 * 功 能:在8X8的LED点阵显示器上显示汉字“大”(硬件电路参见Displayer_dot.DSN)。 */#includereg52.hunsigned char Line=0x10,0x10,0xff,0x10,0x28,0x24,0x42,0x81;unsigned char Row=0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80;void delay(unsigned int time) unsigned int i,j; for(i=0;itime;i+) fo

27、r(j=0;j114;j+);void SendData(unsigned char dat) SBUF = dat; while(!TI); TI = 0; void SendString(unsigned char *s) while(*s!=0)/ 0 表示字符串结束标志,通过检测是否字符串末尾 SendData(*s+); void display(void)unsigned char i=0;for(i=0;i8;i+)SendData(Linei);P1=Rowi;delay(70);void main(void)SCON=0x00;P1=0x00;/关闭显示while(1) di

28、splay();/* 文件名:两个模拟信号差超限时报警* 功 能:利用0809采集两路模拟电压,当两电压值相差超过1V时,蓝色LED亮, 此时若低通道号的电压值大,红色LED亮;若高通道号的电压值大,则黄色LED亮。 (硬件电路参见AD_CH2_2.DSN)。 */#include /宏定义#defineTIMER1DEF( 65536 - 50000 )#defineAD_Convert(i)(*(unsigned char volatile xdata *) (0x3c00 + i) = 0)#defineAD_Read(i)(*(unsigned char volatile xdata

29、*) (0x3c00 +i)/全局变量定义unsigned intbAD_Val_1=0; / 转换结果unsigned intbAD_Val_5=0;unsigned int flag=0;sbit P1_0=P10;sbit P1_3=P13;sbit P1_5=P15;/* 函数名称:delay()* 功 能:延时n毫秒* 入口参数:无* 出口参数:无*/void delay(int time) int i,j; for(i=0;itime;i+) for(j=0;j51) P1_0=0; P1_3=0; elseif(bAD_Val_5-bAD_Val_1)51) P1_0=0; P1_5=0; else P1=0xff;

温馨提示

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

评论

0/150

提交评论