📄 test_7135.c
字号:
//*************************************************
//测试功能:7135的ad功能。将采集到的数据以四位由高到低发给上位机显示
//测试方法:注意:采集到的电压单位为mv
//测试结果:ok
//时钟频率:外部8m
//管脚分配:1脚(pb0)接7135的25,4脚(pb3)接7135的22
//16脚(pd2)接7135的21
//注意事项:基准电压为:1v.输入电压不大于2v
//完成时间:2009.03.22
//**************************************************
//**************************************************
//头文件
//**************************************************
#include <iom16v.h>
#include <macros.h>
//**************************************************
//*****************************************************
//全局变量定义
//*****************************************************
unsigned char N=0;//用来区别是第一次外部中断还是第二次中断
unsigned int T1OVF_NUM=0;//用来计定时器T1的溢出次数
unsigned long int T1_NUM;//T1计的总时钟的个数
unsigned int VIN;//测到的电压,单位为mv
//*****************************************************
//函数声明
//*****************************************************
void DELAY_1MS(void);
void DELAY_NMS(unsigned int n);
void PORT_INIT(void);
void INT0_INIT(void);
void T1_INIT(void);
void T0_125K(void);
void USART_INIT(void);
void USART_TX(unsigned char data);
void DATA_DISPLAY(unsigned int data);
//*****************************************************
//函数名称:void DELAY_1MS(void)
//函数功能:延时1ms
//注意事项:i=143*n-2
//*****************************************************
void DELAY_1MS(void)
{
unsigned int i;
for(i=1142;i>0;i--)
;
}
//*****************************************************
//函数名称:void DELAY_NMS(void)
//函数功能:延时Nms
//注意事项:
//*****************************************************
void DELAY_NMS(unsigned int n)
{
for(;n>0;n--)
DELAY_1MS();
}
//*****************************************************
//函数名称:void INT0_INIT(void)
//函数功能:int0初始化,上升沿产生中断,使能中断
//注意事项:未开总中断
//*****************************************************
void PORT_INIT(void)
{
DDRB=0X09;
PORTB=0X00;
DDRD=0X00;
PORTD=0XFF;
}
//**********************************************************
//函数名称:void T0_250K(void)
//函数功能:t0工作于CTC模式,产生250k方波
//注意事项:一分频,pb3(oc0)接7135 clk
//**********************************************************
void T0_125K(void)
{
TCCR0=0X00;
TCNT0=0X00;
OCR0=31;
TIMSK&=~(1<<OCIE0);
TCCR0=0X19;
}
//*****************************************************
//函数名称:void INT0_INIT(void)
//函数功能:int0初始化,上升沿产生中断,使能中断
//注意事项:未开总中断
//*****************************************************
void INT0_INIT(void)
{
MCUCR|=((1<<ISC01)|(1<<ISC00));
GICR|=(1<<INT0);
}
//*****************************************************
//函数名称:void INT0_INTERRUPT(void)
//函数功能:中断处理,N+1
//注意事项:
//*****************************************************
#pragma interrupt_handler INT0_INTERRUPT:2
void INT0_INTERRUPT(void)
{
if(!N)
{
TCCR1B=0X01;//开始内部计数
MCUCR=0X02;//设置外部中断0下降沿产生中断
N++;
}
else
{
TCCR1B=0X00;//定时器t1停止工作
CLI();//关中断,进行数据处理
//数据处理
T1_NUM=T1OVF_NUM;
T1_NUM=(T1_NUM*65536+TCNT1);
T1_NUM/=64;
T1_NUM-=10001;
VIN=T1_NUM/10;
DATA_DISPLAY(VIN);
//数据处理结束
T1OVF_NUM=0;
TCNT1=0X0000;
MCUCR|=((1<<ISC01)|(1<<ISC00));//设置外部上升沿中断
N=0;//
PORTB&=~(1<<0);//上位机发0x01,测量一次,停止ad
//SEI();先进行1次采样
}
}
//**************************************************
//函数名称:void T1_INIT(void)
//函数功能:内部定时
//注意事项,定时器未工作,定时器工作,需+TCCR1B=0X01;
//**************************************************
void T1_INIT(void)
{
TCCR1A=0X00;
TCNT1=0X0000;
TIMSK|=(1<<TOIE1);
}
//**************************************************
//函数名称:void T1_OVF(void)
//函数功能:ti溢出处理
//注意事项:
//**************************************************
#pragma interrupt_handler T1_OVF:9
void T1_OVF(void)
{
T1OVF_NUM++;
}
//*****************************************************
//函数名称:void USART_INIT(void)
//函数功能:8M,波特率9600
//注意事项:
//*****************************************************
void USART_INIT(void)
{
UBRR=0X33;//fosc=8mhz,波特率9600
UCSRA=0X20;
UCSRC=0X86;
UCSRB=0X98;
}
//*****************************************************
//函数名称:void USART_INIT(void)
//函数功能:8M,波特率9600
//注意事项:
//*****************************************************
void USART_TX(unsigned char data)
{
UDR=data;
while(!(UCSRA&(1<<TXC)))
;
DELAY_NMS(1);
}
//*****************************************************
//函数名称:void USART_INIT(void)
//函数功能:下位机收到0x01,则进行1次ad转换
//注意事项:
//*****************************************************
#pragma interrupt_handler usart_receive:12
void usart_receive(void)
{
unsigned char d;
d=UDR;
if(d==0x01)
{
PORTB|=(1<<0);
SEI();
}
else
{
PORTB&=~(1<<0);
CLI();
}
}
//*****************************************************
//函数名称:void USART_INIT(void)
//函数功能:8M,波特率9600
//注意事项:
//*****************************************************
void DATA_DISPLAY(unsigned int data)
{
unsigned char temp[4],i;
temp[0]=data/1000;
temp[1]=(data/100)%10;
temp[2]=(data/10)%10;
temp[3]=data%10;
for(i=0;i<4;i++)
{
USART_TX(temp[i]);
DELAY_NMS(1);
}
}
//**********************************************************
//主函数
//**********************************************************
void main(void)
{
CLI();
PORT_INIT();
T0_125K();
INT0_INIT();
T1_INIT();
USART_INIT();
SEI();
//PORTB|=(1<<0);//先不 进行ad采样,等待上位机命令
while(1)
;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -