河北理工大学轻工学院毕业设计说明书 第 39 页 共 51页
Y延时消抖主程序有键按下Y按键中断N判断键值N主程序按键是否按下NY延时消抖返回 图16 按键流图
4.2 各程序设计函数说明
4.2.1 主程序模块
/*****************************************************************/
// projection : // Author Name :
// Last modify time: 2007-6-20 15:18:53 // Target IC : M16 // Crystal : 8.0000Mhz
/****************************************************************
河北理工大学轻工学院毕业设计说明书 第 40 页 共 51页
**/
/********************
头
文
件
引
用
********************************/
#include
/************* 定义引申变量类型************************* *********/
#define uchar unsigned char #define uint unsigned int
/******************** 系统常量定义 ******************************/
……………………………………………………………………………………. /********************** 定义结构体 ******************************/ ……………………………………………………………………………………. /******************* 定义全局变量 *******************************/ …………………………………………………………………………………… /******************* 定义函数************************************/ ……………………………………………………………………………………. void main() {
port_init s( ); uart0_init( ); LEDSCAN( ); ad_handler( );
ADMUX=0x00; //选择第0通道
ADCSR=0x86; //采用单次转换模式,64分频
ADCSR |=BIT(ADSC); //启动一次哑转换 SREG=0x80; //开中断 ADCSR |=BIT(ADSC); //启动一次转换
河北理工大学轻工学院毕业设计说明书 第 41 页 共 51页
keyint();
DDRB&=~BIT(PB0); //设置键盘输入,无上拉 DDRB&=~BIT(PB1); DDRB&=~BIT(PB2);
GIMSK=0x40; //开外部中断0 MCUCR=0x30; //设置上升中断触发 SREG=0x80; //开中断 while(1) //等待中断 {
KEYPRESSED ( ); WDR( ); }
}
4.2.2 设定输入/ 输出引脚
ATmega16单片机C口的8个端口作为数据输出使用,同时将A口的PA0引脚设定为模拟电压输入。系统初始指令如下所示:
/************************** 端口初始化 **************************/ Void port_init(void) {
//端口A
DDRA = 0x07; PORTA = 0xFF; //端口B DDRB= 0xF7; PORTB = 0xFF; //端口C DDRC= 0x00; PORTC = 0xFF;
河北理工大学轻工学院毕业设计说明书 第 42 页 共 51页
}
//端口D DDRD= 0x07;
PORTD= 0xFF;
4.2.3 A/ D 转换模块
ATmega16 单片机采用中断方式,ADC按自由模式工作,自第一次置位ADSC开始,ADC就连续不断进行采样转换,数据更新。A/ D 转换的程序如下:
/************************** 定时器/计数器初始化 *****************/ void timer2_init(void) { }
/************************** 启动A/D转换*********************/ #pragma interrupt_handler timer2_ovf_isr:5 void timer2_ovf_isr(void) { }
/*********************模拟转换完成中断************************/ #pragma interrupt_handler ad_handler:15 void ad_handler(void) {
addata=ADC>>2;
TCCR2 = 0x00; ASSR = 0x00; OCR2 = 0x7D; TCCR2 = 0x04;
//停止 //设置异步模式
//开始
TCNT2 = 0x83; //加载计数值 delay_counter ++;
//用于毫秒级延时
pwm_ctrler( &l_trap, &r_trap );

