当前位置:首页 > 西南科技大学单片机上机考试题答案
/****************************************************************************************
* @file 识别最大模拟输入通道 * @author 秘密作战实验室(FREES) * @version v1.0
* @date 2015-06-26
* 功 能: 利用0809采集两路模拟电压,
将电压值最大的通道号显示在LED显示器上。(硬件电路参见AD_CH2_1.DSN)。 *
***************************************************************************************/
#include
#define TIMER1DEF ( 65536 - 50000 ) //定时时间 #define AD_Convert(i) (*((unsigned char volatile xdata *) (0x3c00 + i)) = 0) //返回片外地址
#define AD_Read(i) (*((unsigned char volatile xdata *) (0x3c00 + i))) //全局变量定义 int Flag=0;
int bAD_Val_2 = 0; // AD通道2转换结果 int bAD_Val_7 = 0; // AD通道7转换结果
int table[10]={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;i>0;i--) for(j=114;j>0;j--); }
/*********************************************************************** ** 函数名称: TimeT1()
** 功 能: 定时器1初始化 50ms定时 ** 入口参数: 无 ** 出口参数: 无
***********************************************************************/ void TimeT1() {
TMOD=0X10; //定时器1 方式1 TH1=TIMER1DEF/256; //装定时初值高8位,定时50ms 计算公式 高位us=(65535-50000)/256 TL1=TIMER1DEF%6; //装定时初值低8位,定时50ms 计算公式 低位us=(65535-50000)%6 PT1=1; //定时器1 中断优先级 高 ET1=1; //定时器1 中断控制位 TR1=1; //定时器1 启动控制位 }
/***********************************************************************
** 函数名称: 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=table[2]; if(bAD_Val_7>bAD_Val_2) P1=table[7]; } }
/*********************************************************************** ** 函数名称: INT_INT1()
** 功 能: INT1中断服务程序,使用工作寄存器组1 ** 入口参数: 无 ** 出口参数: 无
***********************************************************************/ void INT_INT1(void) interrupt 2 using 1 { if(Flag==1) { bAD_Val_2=AD_Read(2); } if(Flag==2) { bAD_Val_7=AD_Read(7); } }
/*********************************************************************** ** 函数名称: INT_T1()
** 功 能: T1中断服务程序,使用工作寄存器组1 ** 入口参数: 无 ** 出口参数: 无
***********************************************************************/ void INT_T1() interrupt 3 using 1 {
static int bCount = 3 ; --bCount;
TH1=TIMER1DEF/256; TL1=TIMER1DEF%6;
if( bCount == 2) { 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)。 当1~8号键独立按下时,连接在PA口对应的LEDx点亮(即1号键按下时LDE1亮,2号键按下时LDE2亮),
当9号键按下时,所有LED点亮,当没有键按下时,所有LED熄灭。
***************************************************************************************/
#include\
#include\sbit CS=P2^7; //片选段
#define PA XBYTE[0x0000] //定义端口A地址 #define PB XBYTE[0x0400] //定义端口B地址 #define PC XBYTE[0x0800] //定义端口C地址 #define CN XBYTE[0xC000] //定义控制口地址 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=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; case 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同步输出两个频率为50赫兹的锯齿波(硬件电路参见DA_BUF2_1.DSN)。 ********/
#include\ #include\
#define DA_1 XBYTE[0x2000] //设置DAC0832—1的选通地址 #define DA_2 XBYTE[0x2400] //设置DAC0832—2的选通地址 #define DA_S XBYTE[0x3c00] //设置DAC0832的选通地址 unsigned int DAVAL=0;
void delay(unsigned int time) { unsigned int i=0,j=0; for(i=0;i
共分享92篇相关文档