程序设计复习要点.docx
《程序设计复习要点.docx》由会员分享,可在线阅读,更多相关《程序设计复习要点.docx(14页珍藏版)》请在冰豆网上搜索。
程序设计复习要点
程序设计复习要点
5、MEGA16单片机的USART模块中一帧数据中空闲位和起始位是什么状态?
画图说明
校验位,可以为奇校验或偶校验
起始位,总是为低电平
数据位(0~8)
停止位,总是为高电平
1.通讯线上没有数据传输(RxD或TxD),线路空闲时必须为高电平
四、按图编程
1、想使用单片机的PA口接8位发光二极管,PB1\PB2接两个按键,PB7接一只继电器,请这几这样的一个电路原理图(10分)
2、由图所示,编程实现U2、U1单片机的双机通信功能。
(15分)
要求:
单片机使用内部晶振1兆赫兹,波特率4800时URBB=12,8位数据、无奇偶校验、1位停止位,异步通信,按下各自的按键时使另一块单片机上的LED闪烁4次。
四、按图编程
1、根据图1所示2位共阳数码管,试用动态显示编程实现显示12数字(10分)
#include"iom16v.h"
#defineledseg1_onPORTA|=(1<#defineledseg1_offPORTA&=~(1<#defineledseg2_onPORTA|=(1<#defineledseg2_offPORTA&=~(1<//***GONGYANGXING**
//constunsignedcharNum_Dis_TDB[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};
voidDelay_1_ms(void)
{
unsignedcharcnt_i,cnt_j;
for(cnt_i=0;cnt_i<40;cnt_i++)
{
for(cnt_j=0;cnt_j<33;cnt_j++)
{
}
}
}
voidDelay_n_ms(unsignedintn_ms)
{
unsignedintcnt_i;
for(cnt_i=0;cnt_i{
Delay_1_ms();
}
}
voidmain(void)
{
unsignedchardis_temp,i;
DDRA=0xFF;
PORTA=0xFF;
DDRB=0xFF;
PORTB=0xFF;
DDRD=0x00;
PORTD=0xff;
while
(1)
{
PORTB=0xF9;
ledseg1_on;
Delay_n_ms(20);
ledseg1_off;
PORTB=0xA4;
ledseg2_on;
Delay_n_ms(20);
ledseg2_off;
}
}
2、由图2所示,编程实现U2单片机的按键动作控制U1单片机的LED亮灭。
(15分)
要求:
单片机使用内部晶振1兆赫兹,波特率4800时URBB=12,8位数据、无奇偶校验、1位停止位,异步通信,发送采用查询方式、接收采用中断方式。
1、根据图1所示用外部中断0外接一个按键,在中断服务程序中使LED闪烁3次
时间间隔1秒(10分)
#include"iom16v.h"
#include"macros.h"
#defineled_onPORTC|=(1<#defineled_offPORTC&=~(1<voidDelay_1_ms(void)
{
unsignedcharcnt_i,cnt_j;
for(cnt_i=0;cnt_i<40;cnt_i++)
{
for(cnt_j=0;cnt_j<33;cnt_j++)
{
}
}
}
voidDelay_n_ms(unsignedintn_ms)
{
unsignedintcnt_i;
for(cnt_i=0;cnt_i{
Delay_1_ms();
}
}
#pragmainterrupt_handlerINT0_isr:
2
voidINT0_isr(void)
{
unsignedchari;
for(i=0;i<3;i++)
{
led_on;
Delay_n_ms(50);
led_off;
Delay_n_ms(50);
}
}
voidmain(void)
{
CLI();//全局中断标志禁止
DDRD=0x00;
PORTD=0xFF;
DDRC=0xFF;
MCUCR=(1<GICR=(1<使能外部中断请求0,I←0,0x40;/
SEI();//全局中断标志使能,I←1
while
(1)
{
//等待中断信号
}
}
2、由图2所示,编程实现A/D模块的读数据及初始化子程序。
(15分)
要求:
10位数据转换结果,只完成AD部分的初始化及数据读取的子程序。
(1)ADC初始化子程序
voidATmega16_ADC_Init(void)
{
ADCSRA=0x00;//关闭ADC
ADMUX=0x40;//选择参考电压为AVCC、数据右对齐、通道0
ACSR=0x80;//关闭模拟比较器的电源
ADCSRA=0x87;//使能ADC、单次转换、ADC转换中断禁止、128分频
}
(2)ADC转换读数据子程序
unsignedintATmega16_ADC_Convert()//void
{unsignedintadc_value;
ATmega16_AD_Start;//启动AD转换
while(!
(ADCSR&(1<adc_value=(unsignedint)ADCL;//读取低8位
adc_value|=((unsignedint)(ADCH&0x03))<<8;//读取高2位
NOP();
returnadc_value;
}
1、根据图1所示,完整编程序让LED亮一秒,灭一秒,循环不止(8分)
假设晶振为4Mhz。
程序如下:
#include"iom16v.h"
#defineled_onPORTA|=(1<#defineled_offPORTA&=~(1<voidDelay_1_ms(void)
{
unsignedcharcnt_i,cnt_j;
for(cnt_i=0;cnt_i<40;cnt_i++)
{
for(cnt_j=0;cnt_j<33;cnt_j++)
{
}
}
}
voidDelay_n_ms(unsignedintn_ms)
{
unsignedintcnt_i;
for(cnt_i=0;cnt_i{
Delay_1_ms();
}
}
voidmain(void)
{
DDRA=0xFF;
PORTA=0xFF;
while
(1)
{
led_on;
Delay_n_ms(1000);
led_off;
Delay_n_ms(1000);
}
}
2、由图2所示,完成编写按键扫描程序,可以直接使用第1题中延时子程序名称,按键值任意。
(8分)
#include"iom16v.h"
#defineled_onPORTC|=(1<#defineled_offPORTC&=~(1<voidDelay_1_ms(void)
{
}
voidDelay_n_ms(unsignedintn_ms)
{
}
unsignedcharGet_Key_Val()
{
unsignedcharkey_val=0;
if(PINA!
=0XFF)//
{
key_val=PINA;
switch(key_val)//
{
case0xdf:
key_val=1;break;
default:
break;
}
}
returnkey_val;//
}
voidmain(void)
{
unsignedcharcnt_i;
DDRA=0x00;
PORTA=0xFF;
//DDRC=0xFF;
//PORTC=0xFF;
while
(1)
{
while(Get_Key_Val()==0);//
if(Get_Key_Val()==1)
{
led_on;
Delay_n_ms(10);
led_off;
Delay_n_ms(10);
}
}
}
3、由图3所示,编写单片机AD转换模块的,初始化及获取转换值的两个子程序,要求数据右对齐,其他按图设置。
(10分)
(1)ADC多工选择寄存器-ADMUX
Bit7:
6-REFS1:
0:
参考电压选择Bit5-ADLAR:
ADC转换结果左对齐
Bits4:
0-MUX4:
0:
模拟通道与增益选择位
(2)ADC控制和状态寄存器A-ADCSRA
Bit7-ADEN:
ADC使能Bit6-ADSC:
ADC开始转换Bit5-ADATE:
ADC自动触发使能Bit4-ADIF:
ADC中断标志Bit3-ADIE:
ADC中断使能Bits2:
0-ADPS2:
0:
ADC预分频器选择位
(1)ADC初始化
voidATmega16_ADC_Init(void)
{
ADCSRA=0x00;//关闭ADC
ADMUX=0x43;//选择参考电压为AVCC、数据右对齐、通道3
ACSR=0x80;//关闭模拟比较器的电源
ADCSRA=0x87;//使能ADC、单次转换、ADC转换中断禁止、128分频
}
(2)ADC转换子程序
unsignedintATmega16_ADC_Convert()//void
{
unsignedintadc_value;
ATmega16_AD_Start;//启动AD转换
while(!
(ADCSR&(1<adc_value=(unsignedint)ADCL;//读取低8位
adc_value|=((unsignedint)(ADCH&0x03))<<8;//读取高2位
NOP();
returnadc_value;
}