1、程序设计复习要点程序设计复习要点5、MEGA16单片机的USART模块中一帧数据中空闲位和起始位是什么状态?画图说明校验位,可以为奇校验或偶校验起始位,总是为低电平数据位 (0 8)停止位,总是为高电平1.通讯线上没有数据传输 (RxD 或 TxD),线路空闲时必须为高电平四、按图编程1、想使用单片机的PA口接8位发光二极管,PB1PB2接两个按键,PB7接一只继电器,请这几这样的一个电路原理图(10分)2、由图所示,编程实现U2、U1单片机的双机通信功能。(15分)要求:单片机使用内部晶振1兆赫兹,波特率4800时URBB=12,8位数据、无奇偶校验、1位停止位,异步通信,按下各自的按键时使
2、另一块单片机上的LED闪烁4次。四、按图编程1、根据图1所示2位共阳数码管,试用动态显示编程实现显示12数字(10分)#includeiom16v.h #define ledseg1_on PORTA|=(1PA0)#define ledseg1_off PORTA&=(1PA0) #define ledseg2_on PORTA|=(1PA1)#define ledseg2_off PORTA&=(1PA1) /*GONG YANG XING */const unsigned char Num_Dis_TDB=0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0
3、x80,0x90; void Delay_1_ms(void) unsigned char cnt_i,cnt_j; for(cnt_i=0;cnt_i40;cnt_i+) for(cnt_j=0;cnt_j33;cnt_j+) void Delay_n_ms(unsigned int n_ms) unsigned int cnt_i; for(cnt_i=0;cnt_in_ms;cnt_i+) Delay_1_ms(); void main(void) unsigned char dis_temp,i; DDRA=0xFF; PORTA=0xFF; DDRB=0xFF; PORTB=0xFF
4、; 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
5、分)#includeiom16v.h #include macros.h#define led_on PORTC|=(1PC0)#define led_off PORTC&=(1PC0)void Delay_1_ms(void) unsigned char cnt_i,cnt_j; for(cnt_i=0;cnt_i40;cnt_i+) for(cnt_j=0;cnt_j33;cnt_j+) void Delay_n_ms(unsigned int n_ms) unsigned int cnt_i; for(cnt_i=0;cnt_in_ms;cnt_i+) Delay_1_ms(); #pr
6、agma interrupt_handler INT0_isr:2 void INT0_isr(void) unsigned char i; for(i=0;i3;i+) led_on; Delay_n_ms(50); led_off; Delay_n_ms(50); void main(void) CLI(); /全局中断标志禁止 DDRD=0x00; PORTD=0xFF; DDRC=0xFF; MCUCR =(1 ISC01)+ (1 ISC00);/ 0x02;/中断0 触发方式控制,由ISC01=1, ISC00=0,两位设置,表示INT0 的下降沿产生异步中断请求 GICR = (
7、1INT0); / / Bit 6 INT0:使能外部中断请求 0 ,I 0,0x40;/ SEI(); /全局中断标志使能,I 1 while(1) /等待中断信号 2、由图2所示,编程实现A/D模块的读数据及初始化子程序。(15分)要求:10位数据转换结果,只完成AD部分的初始化及数据读取的子程序。(1)ADC初始化子程序void ATmega16_ADC_Init(void) ADCSRA=0x00; /关闭ADCADMUX=0x40; /选择参考电压为AVCC、数据右对齐、通道0 ACSR=0x80; /关闭模拟比较器的电源 ADCSRA=0x87; /使能ADC、单次转换、ADC转换
8、中断禁止、128分频(2)ADC转换读数据子程序unsigned int ATmega16_ADC_Convert()/void unsigned int adc_value; ATmega16_AD_Start; /启动AD转换 while(!(ADCSR&(1ADIF); /等待AD转换结束 adc_value=(unsigned int)ADCL; /读取低8位 adc_value|=(unsigned int)(ADCH&0x03)8; /读取高2位 NOP(); return adc_value;1、根据图1所示,完整编程序让LED亮一秒,灭一秒,循环不止(8分)假设晶振为4Mhz。
9、程序如下:#includeiom16v.h #define led_on PORTA|=(1PA1)#define led_off PORTA&=(1PA1)void Delay_1_ms(void) unsigned char cnt_i,cnt_j; for(cnt_i=0;cnt_i40;cnt_i+) for(cnt_j=0;cnt_j33;cnt_j+) void Delay_n_ms(unsigned int n_ms) unsigned int cnt_i; for(cnt_i=0;cnt_in_ms;cnt_i+) Delay_1_ms(); void main(void) D
10、DRA=0xFF; PORTA=0xFF; while(1) led_on; Delay_n_ms(1000); led_off; Delay_n_ms(1000); 2、由图2所示,完成编写按键扫描程序,可以直接使用第1题中延时子程序名称,按键值任意。(8分)#includeiom16v.h #define led_on PORTC|=(1PC7)#define led_off PORTC&=(1PC7)void Delay_1_ms(void) void Delay_n_ms(unsigned int n_ms) unsigned char Get_Key_Val( ) unsigned
11、char key_val=0; if(PINA!=0XFF)/ key_val=PINA; switch(key_val)/ case 0xdf:key_val=1;break; default:break; return key_val;/ void main(void) unsigned char cnt_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; Del
12、ay_n_ms(10); 3、由图3所示,编写单片机AD转换模块的,初始化及获取转换值的两个子程序,要求数据右对齐,其他按图设置。(10分)(1)ADC多工选择寄存器ADMUXBit7:6REFS1:0:参考电压选择Bit5ADLAR:ADC转换结果左对齐Bits4:0MUX4:0:模拟通道与增益选择位(2)ADC控制和状态寄存器AADCSRABit7ADEN:ADC使能Bit6ADSC:ADC开始转换Bit5ADATE:ADC自动触发使能Bit4ADIF:ADC中断标志Bit3ADIE:ADC中断使能Bits2:0ADPS2:0:ADC预分频器选择位(1)ADC初始化void ATmega1
13、6_ADC_Init(void) ADCSRA=0x00; /关闭ADCADMUX=0x43; /选择参考电压为AVCC、数据右对齐、通道3 ACSR=0x80; /关闭模拟比较器的电源 ADCSRA=0x87; /使能ADC、单次转换、ADC转换中断禁止、128分频(2) ADC转换子程序unsigned int ATmega16_ADC_Convert()/void unsigned int adc_value; ATmega16_AD_Start; /启动AD转换 while(!(ADCSR&(1ADIF); /等待AD转换结束 adc_value=(unsigned int)ADCL; /读取低8位 adc_value|=(unsigned int)(ADCH&0x03)8; /读取高2位 NOP(); return adc_value;