背景:
阅读内容

数字式0~5V直流电压表

[日期:2011-12-01] 来源:net  作者:佚名 [字体: ]

用电位器RV1作模拟量的输入,右边4位数码管显示输入电压值。我们使用PA端口的第7位进行模拟量输入,而PA端口的第0~6位作数码管的段驱动,由于PA7设计时本来用于驱动点亮数码管的小数点,这样,显示的数字中小数点不能被点亮。因此,“千”位数码管相当于显示整数,而“个”、 “十”、 “百”位数码管相当于显示小数,例如:显示3265相当于3.265V电压。

#include <iom16v.h>    //包含头文件
#define uchar unsigned char    //变量类型的宏定义
#define uint  unsigned int
uchar const SEG7[10]={0x3f,0x06,0x5b, //共阴极数码管0~9的字形码
0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
uchar const ACT[4]={0xfe,0xfd,0xfb,0xf7};//4位共阴极数码管的位选码
uint adc_val,dis_val;    //定义全局变量
uchar i,cnt;
/************************************************/
void port_init(void)    //端口初始化子函数
{    //端口初始化子函数开始
 PORTA = 0x7F;    // PA端口初始化输出01111111
 DDRA  = 0x7F;    //将PA端口的低7位设为输出,最高位设为输入
 PORTB = 0xFF;    // PB端口初始化输出11111111
 DDRB  = 0xFF;    //将PB端口设为输出
 PORTC = 0xFF;     // PC端口初始化输出11111111
 DDRC  = 0xFF;    //将PC端口设为

 PORTD = 0xFF;    // PD端口初始化输出11111111
 DDRD  = 0xFF;    //将PD端口设为输出
}    //端口初始化子函数结束
/************************************************/
void adc_init(void)    //模数转换初始化子函数
{    //模数转换初始化子函数开始
ADCSRA = 0xE3;     //ADC工作在自由转换模式
ADMUX = 0xC7;    //选择ADC输入通道为7
}    //模数转换初始化子函数结束
//***************************
void timer0_init(void)    //定时器0初始化子函数
{    //定时器0初始化子函数开始
TCNT0 = 0x83;     //1mS的定时初值
TCCR0 = 0x03;     //定时器0的计数预分频取64
TIMSK = 0x01;     //使能T/C0中断
}    //定时器0初始化子函数结束
/*********************************************/
void init_devices(void)    //芯片的初始化子函数
{
 port_init();    //调用端口初始化子函数
 timer0_init();    //调用定时器0初始化子函数
 adc_init();    //调用模数转换初始化子函数                  // 
 SREG=0x80;    //使能总中断
}
//***************************
#pragma interrupt_handler timer0_ovf_isr:10//T/C0中断服务子函数
void timer0_ovf_isr(void)
{
 TCNT0 = 0x83;     //重装1mS的定时初值
 cnt++;    //变量cnt递增
 if(++i>3)i=0;    //变量i的计数范围0~3
 switch(i)    // switch语句,根据i的值分别点亮4位数码管
 {
 case 0:PORTA=SEG7[dis_val%10];PORTC=ACT[0];break;
 case 1:PORTA=SEG7[(dis_val/10)%10];PORTC=ACT[1];break;
 case 2:PORTA=SEG7[(dis_val/100)%10];PORTC=ACT[2];break;
 case 3:PORTA=SEG7[dis_val/1000];PORTC=ACT[3];break;                         //

 default:break;
 }
}
//=========================
uint ADC_Convert(void)    //模数转换子函数
{uint temp1,temp2;    //定义无符号整型局部变量
 temp1=(uint)ADCL;    //取得模数转换值
 temp2=(uint)ADCH;
 temp2=(temp2<<8)+temp1;
 return(temp2);    //返回取得的模数转换值
}
/**************************/
uint conv(uint i)    //数据转换子函数,定义i为无符号整型变量
{
long x;    //定义无符号长整型局部变量
uint y;    //定义无符号整型局部变量
x=(5000*(long)i)/1023;    //将变量i转换成需要显示的形式
y=(uint)x;    //将无符号长整型变量x强制转换成无符号整型变量y                      //

return y;    //返回y的值

/***********************/
void delay(uint k)    //延时子函数
{
uint i,j;
 for(i=0;i<k;i++)
 {     
 for(j=0;j<140;j++); 
 }
}
/***********************/
void main(void)    //定义主函数
{        //主函数开始
init_devices();    //调用芯片初始化子函数
  while(1)    //无限循环
  {    //无限循环语句开始
       if(cnt>100)    //如果cnt大于100,进入if语句
{
adc_val=ADC_Convert();//调用单片机论坛模数转换子函数得到单片机教程转换值
dis_val=conv(adc_val); //将adc_val转换成需要显示的形式
cnt=0;    //cnt回零
}
delay(10);    //延时10mS
  }
}

收藏 推荐 打印 | 录入:admin | 阅读:
产品购买方式
广州市东哥电子科技有限公司欢迎您
东哥单片机学习网--提供单片机学习开发板,单片机实验板,编程器,仿真器,无线发射接收控制模块,电子元器件,单片机技术交流,是单片机爱好者,单片机初学者,电子工程师不容错过的单片机学习交流网站。
1.广东省可以货到付款(即货到了你把钱给快递公司),购物零风险.
2.外省的需先转账后发货,部分城市可以货到付款,需外加3%代收手续费.
3.可以通过本站淘宝店购买(淘宝网担保交易购物零风险).
淘 宝 店:进入本站淘宝店请点击
业务咨询:罗小姐/廖先生
技术咨询:廖先生
联系电话:020 86307431
联系手机:13512767404
购买方式:查看请点击
公司地址:广州市天河新赛格电子城二楼
您还可以通过QQ咨询:279068079