📄 adc.c
字号:
#include<iom16v.h>
#include<macros.h>
#include "abs.h"
/* 七段译码字形表 */
/*const unsigned char tabel[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,
0x88,0x83,0xc6,0xa1,0x86,0x8e};*/
//放一个串口通讯时自己能看懂的数据简单处理
const unsigned char tabel[]={0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x10,0x11,0x12,0x13,0x14,0x15};
/* 显示缓冲区 */
unsigned int d[]={0,0,0,0,0,0,0,0,0,0,0};
void port_init(void)//端口初始化
{
PORTA = 0x00;DDRA = 0xff; PORTB = 0x00;DDRB = 0x00;
PORTC = 0x00;DDRC = 0x00; PORTD = 0xff;DDRD = 0x00;
DDRA =0xff&((~(1<<PA3))|(~(1<<PA6)) );
}
void display()
{
USART_Transmit8(tabel[d[3]]); //送数据
delay_nms(10);
USART_Transmit8(tabel[d[2]]);
delay_nms(10);
USART_Transmit8(tabel[d[1]]);
delay_nms(10);
USART_Transmit8(tabel[d[0]]);
delay_nms(10);
}
unsigned int ad_con;//存放PA0的AD转换结果
/* 将AD结果转换成电压 */
#define vref 502
void adctovol(unsigned int adc)
{
unsigned int temp;
unsigned char i;
unsigned char *char_p;
temp=(unsigned int)(((unsigned long)((unsigned long)adc*vref))/1024);
for(i=0;i<3;i++)
{
d[i]=temp%10;
temp=temp/10;
}
}
/* AD转换程序 */
#pragma interrupt_handler adc_isr:15
void adc_isr(void)
{
unsigned int temp=0;
while(temp<6)
temp++;
ad_con=ADC;
ADCSR|=(1<<ADSC);//启动转换
}
//将AD转换结果转换成电压数值
void main(void)
{
unsigned char i;
port_init();
WDT_ON();
USART_InitM1681(9600);
Red_LedON;Green_LedON;
delay_nms(500); //延时1秒
Red_LedOFF; Green_LedOFF;
USART_Transmit8(2);
USART_Transmit8(0x0d); //发送一个回车
USART_Transmit8(0x0a); //发送一个换行
MCUCSR=0;
//ADMUX=0x00;//0通道
ADMUX=0x03;//3
// ADMUX=0x06;//6
ADCSR=(1<<ADEN)|(1<<ADSC)|(1<<ADIF)|(1<<ADIE)|0x06;
SEI();
i=0;
USART_Transmit_2();//发个Hello
while(1)
{
if((i==127)|(i==0))
adctovol(ad_con);//降低AD结果刷新速率
display(); //使末位闪烁不太明显
Red_D1glint;delay_nms(500);//红绿灯交替亮灭
Green_D1glint;delay_nms(500);
i++;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -