求基于AVR单片机的计数程序 30
使用的是AVR单片机,怎么样用keil编写单片机的计数程序?其过程是周期性地敲打一硬性物体,通过压力传感器感应敲打次数,直到物体断裂为止,并且进行报警。最好有编好的程序加...
使用的是AVR单片机,怎么样用keil编写单片机的计数程序?其过程是周期性地敲打一硬性物体,通过压力传感器感应敲打次数,直到物体断裂为止,并且进行报警。最好有编好的程序加注释,兄弟在这先谢了!
展开
1个回答
展开全部
AVR有专门的编译环境,如ICC,AVR Studio,AVR Codevision,GCC等,keil貌似还不支持AVR编译的。
貌似你这个问题问的还不太清楚,压力传感器能感受到次数,但是多少次能够断裂,貌似感受不到吧?难道是碎了就检测不到信号?
不管怎么说,就以mega16为目标单片机给你写一段啊,只是框架:
#include<iom16v.h>
#include<macros.h>
#define uchar unsigned char
#define uint unsigned int
#define press (PINB&0x01) //PB0作为压力传感器入口检测
#define HIT_H PORTB |= BIT(1) //PB1口作为敲打的控制口
#define HIT_L PORTB &=~BIT(1)
#define BEEP_H PORTB |=BIT(2) //PB2作为报警端口
#define BEEP_L PORTB &=~BIT(2)
uint beep_num=0; //蜂鸣器定时累加
uint hit_num =0; //打击次数
uint add_num =0; //定时器定时累加
uint set_num =0; //预先设定的打击次数
//定时器T0初始化
void timer0_init(void)
{
TCCR0 = 0x00;//停止定时器
TCNT0 = 0x83;//初始值
OCR0 = 0x82;//匹配值
TIMSK |= 0x01;//中断允许
TCCR0 = 0x13;//启动定时器
}
//T0溢出中断服务程序
#pragma interrupt_handler timer0_ovf_isr:10
void timer0_ovf_isr(void)
{
TCNT0 = 0x83; //重装1MS定时初值
add_num ++;
if(add_num%1000==0) //拟定1S打击一次
{HIT_H;}
else{HIT_L;}if(add_num >1999)add_num =0;
//以下检测传感器计数
if(press==0) //拟定有压力时传感器输出低电平
{
NOP();NOP();NOP();NOP();NOP();//软件延时,防止轻微抖动
if(press==0){hit_num++} //打击次数累加
}
if(hit_num==set_num) //打击次数等于预设次数,及打碎了
{
beep_num++;
if(beep_num<500){BEEP_H} //响0.5s,停1s
else{BEEP_L}if(beep_num>1499)beep_num=0;
}
}
端口初始化就不写了,主函数你可以模拟一个死循环就行。
貌似你这个问题问的还不太清楚,压力传感器能感受到次数,但是多少次能够断裂,貌似感受不到吧?难道是碎了就检测不到信号?
不管怎么说,就以mega16为目标单片机给你写一段啊,只是框架:
#include<iom16v.h>
#include<macros.h>
#define uchar unsigned char
#define uint unsigned int
#define press (PINB&0x01) //PB0作为压力传感器入口检测
#define HIT_H PORTB |= BIT(1) //PB1口作为敲打的控制口
#define HIT_L PORTB &=~BIT(1)
#define BEEP_H PORTB |=BIT(2) //PB2作为报警端口
#define BEEP_L PORTB &=~BIT(2)
uint beep_num=0; //蜂鸣器定时累加
uint hit_num =0; //打击次数
uint add_num =0; //定时器定时累加
uint set_num =0; //预先设定的打击次数
//定时器T0初始化
void timer0_init(void)
{
TCCR0 = 0x00;//停止定时器
TCNT0 = 0x83;//初始值
OCR0 = 0x82;//匹配值
TIMSK |= 0x01;//中断允许
TCCR0 = 0x13;//启动定时器
}
//T0溢出中断服务程序
#pragma interrupt_handler timer0_ovf_isr:10
void timer0_ovf_isr(void)
{
TCNT0 = 0x83; //重装1MS定时初值
add_num ++;
if(add_num%1000==0) //拟定1S打击一次
{HIT_H;}
else{HIT_L;}if(add_num >1999)add_num =0;
//以下检测传感器计数
if(press==0) //拟定有压力时传感器输出低电平
{
NOP();NOP();NOP();NOP();NOP();//软件延时,防止轻微抖动
if(press==0){hit_num++} //打击次数累加
}
if(hit_num==set_num) //打击次数等于预设次数,及打碎了
{
beep_num++;
if(beep_num<500){BEEP_H} //响0.5s,停1s
else{BEEP_L}if(beep_num>1499)beep_num=0;
}
}
端口初始化就不写了,主函数你可以模拟一个死循环就行。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询