#include <iom64v.h> //头文件,ATmega64单片机的寄存器定义
#include <macros.h> //包含有SEI()、CLI()、NOP()、WDR()、等宏定义.
typedef unsigned char uchar; //数据类型说明
typedef unsigned int uint; //数据类型说明
//*** 函数定义 ***
void long_delay(void); // 长延时
void short_delay(void); // 短暂延时
void write7279(unsigned char, unsigned char); // 写入到HD7279
unsigned char read7279(unsigned char); // 从HD7279读出
void send_byte(unsigned char); // 发送一个字节
unsigned char receive_byte(void); // 接收一个字节
void delay_us(int); // 微秒延时
void dely_ms(unsigned int); // 毫秒延时
//*** 变量及I/O口定义 ***
unsigned char digit[8];
unsigned char j,k,key_number;
unsigned int tmr;
unsigned long wait_cnter;
//HD7279_DATA
#define HD7279_DATA_H PORTA|=BIT(PA4)
#define HD7279_DATA_L PORTA&=~BIT(PA4)
//HD7279_CLK
#define HD7279_CLK_H PORTA|=BIT(PA1)
#define HD7279_CLK_L PORTA&=~BIT(PA1)
//HD7279_CS
#define HD7279_CS_H PORTA|=BIT(PA5)
#define HD7279_CS_L PORTA&=~BIT(PA5)
//DDR
#define HD7279_DDR_H DDRA|=BIT(PA4) //数据输入与输出的设置
#define HD7279_DDR_L DDRA&=~BIT(PA4)
#define key PINA0
#define HD7279_DATA PINA
uchar buf[]={0,0,0,0};
//****** HD7279A 指令 ******
#define CMD_RESET 0xa4
#define CMD_TEST 0xbf
#define DECODE0 0x80
#define DECODE1 0xc8
#define CMD_READ 0x15
#define UNDECODE 0x90
#define RTL_CYCLE 0xa3
#define RTR_CYCLE 0xa2
#define RTL_UNCYL 0xa1
#define RTR_UNCYL 0xa0
#define ACTCTL 0x98
#define SEGON 0xe0
#define SEGOFF 0xc0
#define BLINKCTL 0x88
#define vref 5000 //转换值
/************************************************
函 数 名: DelaymS()
功 能: 毫秒级延时函数
输入参数: 延迟时间/系统晶体
输出参数: 做相应的延迟处理
描 述: /
***********************************************/
void DelaymS (uint i) //延时函数,参数i为延时时间
{
uint j,k; //双重延时
for (j=0;j<i;j++)
{
for (k=0;k<=500;k++);
}
}
/************************************************
函 数 名: Init_mcu()
功 能: 单片机初始化函数
输入参数: /
输出参数: /
描 述: 相关口方向的设置等
***********************************************/
void Init_mcu(void)
{
DDRC = 0xff; //PC口为推挽1输出,段码
DDRD = 0xff; //PD口为推挽1输出,位码
DDRA = 0x00; //PA口为输入
PORTA = 0x00; //内部不接上拉电阻
PORTA = 0x00;
DDRA = 0x32; //KEY输入,其他输出
PORTC = 0x00;
PORTD=0xff;
DDRC = 0x07;
MCUCR = 0x02;
DDRF=0x00; //PF口是输入口
PORTF=0x00;//关闭上拉
}
/************************************************
函 数 名: adc_Init()
功 能: ADC初始化函数
输入参数: /
输出参数: /
描 述: 设置片内模数转换器ADC的一些参数
***********************************************/
void Init_adc(void)
{
ADCSRA = 0x00; //设置前,先关闭ADC
ADMUX =(1<<REFS0)|(1<<REFS1)|(1<<MUX0)|(0<<ADLAR); //选择通道1,结果左对齐,参考电源为内部AVcc
ACSR =(1<<ACD); //关闭模拟比较器,禁止位P148
ADCSRA=(0<<ADFR)|(1<<ADSC)|(1<<ADEN)|(0<<ADPS0)|(1<<ADPS1)|(1<<ADPS2)|(1<<ADIE);//ADC时钟8分频
}
/************************************************
函 数 名: adc_convert()
功 能: A/D转换函数
输入参数: /
输出参数: /
描 述: 读取采样获得的10位数据
***********************************************/
uint adc_convert(void)
{
uint temp1,temp2;
temp1 = (uint)ADCL; //必须先读低字节
temp2 = (uint)ADCH;
temp2 = (temp2<<8) + temp1; //左移8位
return (temp2);
}
/********************************************************
子程序名: process()
输入参数: 数据处理函数
输出参数: /
描 述:
数据格式:
输出数据: 数据处理函数,将转换的值转换为4位BCD码。
********************************************************/
void process (uint i )
{i=(unsigned int)(((unsigned long)((unsigned long)i*vref))/2048);
buf[0] = i/1000 ; i=i%1000;
buf[1] = i/100 ; i=i%100;
buf[2] = i/10 ; i=i%10;
buf[3] = i ;
}
//*****************主程序**********************************
void main (void)
{
for (tmr=0;tmr<0x2000;tmr++); // 上电延时
send_byte(CMD_RESET); // 复位HD7279A
Init_mcu(); //单片机初始化
Init_adc(); //adc初始化
PORTD=0xfe;
DelaymS(50); //延迟
PORTD=0xff;
DelaymS(50);
PORTD=0xfe;
DelaymS(50);
PORTD=0xff;
while(1)
{ DelaymS(100);
Init_adc(); //adc重新初始化
while ((ADCSRA&(1<<ADIF))==0); //等待ADC完成,实际程序中可以运行其它任务
process (adc_convert());//读AD的值
write7279(DECODE0,buf[3]);
write7279(DECODE0+1,buf[2]);
write7279(DECODE0+2,buf[1]);
write7279(DECODE0+3,buf[0]);
write7279(SEGON,0x1f);
//send_byte(CMD_RESET); //刷新屏幕
//write7279(SEGON,0x1f);
DelaymS(100);
}
}
/****************************************************/
void write7279(unsigned char cmd, unsigned char dta)
{
send_byte (cmd);
send_byte (dta);
}
unsigned char read7279(unsigned char command)
{
send_byte(command);
return(receive_byte());
}
void send_byte( unsigned char out_byte)
{
unsigned char i;
HD7279_CS_L;
long_delay();
for (i=0;i<8;i++)
{
if (out_byte&0x80)
{
HD7279_DATA_H;
}
else
{
HD7279_DATA_L;
}
HD7279_CLK_H;
short_delay();
HD7279_CLK_L;
short_delay();
out_byte=out_byte*2;
}
HD7279_DATA_L;
}
unsigned char receive_byte(void)
{
unsigned char i, in_byte;
HD7279_DDR_L;
HD7279_DATA_H;
long_delay();
for (i=0;i<8;i++)
{
HD7279_CLK_H;
short_delay();
in_byte=in_byte*2;
if (HD7279_DATA&0x10)
{
in_byte=in_byte|0x01;
}
HD7279_CLK_L;
short_delay();
}
HD7279_DATA_L;
HD7279_DDR_H;
return (in_byte);
}
void long_delay(void)
{
unsigned char i;
for (i=0;i<0x30;i++);
}
void short_delay(void)
{
unsigned char i;
for (i=0;i<5;i++);
}
// ************************* 延时 n*ms *************************
void delay_us(int time) //微秒级延时
{
do
time--;
while(time>1);
}
void dely_ms(unsigned int time)
{
while(time!=0)
{
delay_us(1000); //0.001MS
time--;
}
}
AD转换的内部电压2.56--电压表.rar_AD转换的内部电压表_atmega64 例程_电压
版权申诉
54 浏览量
2022-09-24
21:33:19
上传
评论
收藏 2KB RAR 举报
刘良运
- 粉丝: 69
- 资源: 1万+
最新资源
- 基于STC15F104E系列单片机的EEPROM应用程序测试例程KEIL工程源码.zip
- 基于STC15F104E系列单片机的串口通讯应用程序测试例程KEIL工程源码.zip
- java-leetcode题解之第844题比较含退格的字符串.zip
- java-leetcode题解之第824题山羊拉丁文.zip
- java-leetcode题解之第819题最常见的单词.zip
- 基于STC15F104E系列单片机产生PWM信号测试例程KEIL工程源码.zip
- STC15F104E系列单片机-串口、外部中断、掉电存储、定时器同时应用程序KEIL工程源码.zip
- java-leetcode题解之第686题重复叠加字符串匹配.zip
- java-leetcode题解之第680题验证回文串II.zip
- java-leetcode题解之第557题反转字符串中的单词III.zip
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈