#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
sbit CS=P3^5
sbit Clk=P1^6 //时钟
sbit DO=P3^7 //ADC0832输出引链敏脚
sbit DI=P3^6 //ADC0832输入引脚
sbit key=P3^3 //按键
bit keydownflg// *** 作位的定义
bit adc_flg
uchar dat,channel
uchar key_buffer
uchar P2_buffer
uchar Beep_cnt
uchar disp_cnt
uchar count4ms
uchar disp_buff[5] //数码管显示缓存
uchar codeTab1[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83,0xA7,0xA1,0x86,0x8E}//共阳数码表
uchar code Tab[5]={0x7f,0xbf,0xdf,0xef,0xf7} //数码管位选表
uchar A_D(uchar CH) //AD函数
{
uchar i,adval,test //定义局部变量并初始戚唤段化
adval=0x00
test=0x00
Clk=0//clk低电平
DI=1 //DI初始高电平在第一个时钟脉冲的下降沿前保持高电平,表示启动信号
_nop_()
CS=0 //片选
_nop_()
Clk=1//clk上升沿,起始位写入
_nop_()
if(CH==0x00) //选择通道0
{
Clk=0 //clk低电平
DI=1
_nop_()
Clk=1 /高誉/clk上升沿,通道0的第一位写入
_nop_()
Clk=0
DI=1
_nop_()
Clk=1 //clk上升沿,通道0的第二位写入
_nop_()
}
else
{
Clk=0
DI=1
_nop_()
Clk=1 //clk上升沿,通道1的第一位写入
_nop_()
Clk=0
DI=1
_nop_() //clk上升沿,通道1的第二位写入
Clk=1
_nop_()
}
Clk=0
DI=1
for(i=0i<8i++)//从高位向低位读取八位AD值
{
_nop_()
adval<<=1
Clk=1
_nop_()
Clk=0
if(DO)
adval|=0x01
else
adval|=0x00
}
for(i=0i<8i++)
{
test>>=1//从低位向高位读取八位AD值
if(DO)
test|=0x80
else
test|=0x00
_nop_()
Clk=1
_nop_()
Clk=0
}
if(adval==test)dat=test//判断两个读取值是否相等相等就把读取的数赋值给DAT
_nop_()
CS=1
DO=1
Clk=1
return dat
}
void FillDispBuffer(void) //数码管显示缓存函数
{
disp_buff[0]=channel //显示通道
disp_buff[1]=12//显示"C"
disp_buff[2]=dat/51 //显示个位
disp_buff[3]=dat%51*10/51 //显示十分位
disp_buff[4]=((dat%51)*10%51)*10/51 //显示百分位
}
void dealkey(void) //按键处理
{
if(keydownflg) return //keydownflg控制位为1,不对按键进行处理
key_buffer=P2
if((key_buffer&0x80)!=0x80) channel=0//选择通道0
if((key_buffer&0x40)!=0x40) channel=1//选择通道1
FillDispBuffer()//数码管显示缓存
Beep_cnt=0
keydownflg=1 //keydownflg控制位置1
}
void main(void) //主函数
{
P0=0xff //初始化
P2=0xff
dat=0x00
disp_cnt=0
count4ms=0
channel=0
TMOD=0x10
TH0=(65535-4000)/256
TL0=(65535-4000)%256
EA=1
TR0=1
ET0=1
while(1)
{
if(adc_flg) //ADC转换控制位,防止输入与输出产生冲突
{
adc_flg=0
A_D(channel) //ADC函数
FillDispBuffer() //数码管显示缓存
}
if(!key) //按键
dealkey()
}
}
void T0_service(void)interrupt 1 //定时器0中断子函数
{
TH0=(65535-4000)/256
TL0=(65535-4000)%256
P2_buffer=Tab[disp_cnt] //查表,数码管的位选择
if(keydownflg) //蜂鸣器0.4s的短时间鸣叫
{
P2_buffer=P2_buffer&0xfe
Beep_cnt++
if(Beep_cnt==100)keydownflg=0
}
P2=P2_buffer //数码管显示数字符号
if(disp_cnt==2) //第三位数码管显示小数点
P0=Tab1[disp_buff[disp_cnt]]&0x7f
else
P0=Tab1[disp_buff[disp_cnt]]
disp_cnt++ //
if(disp_cnt==5) disp_cnt=0
count4ms++
if(count4ms==50) //0.2s ADC转换一次
{
adc_flg=1
count4ms=0
}
}
//******************adc0832****************************// sbit CS=P1^0//使能。 sbit CLK=P1^1//时钟 sbit Do=P1^2// 数据输出锋竖 sbit Di=P1^2//数据输入 unsigned char CH=0x02//通道的选择:0x02就是单通道0;0x03就是单通道1; //0x00就是双通道ch0=“+”; ch0=“-” //0x01就是双通道ch0=“-”; ch0=“+”
//*****************************************************// unsigned char ADconv(void) {unsigned char i
unsigned int data_f=0,data_c=0Di=1CS=1_nop_() CS=0
Di=1//芯片使能之前的初始化。第一个下降沿 CLK=1_nop_()_nop_()
/****************************************/ CLK=0// 确定通道模式、第2个下降沿 _nop_()_nop_()CLK=1
Di=(bit)(0x02&CH)//设定通道初始化 _nop_()CLK=0_nop_()_nop_() CLK=1
Di=(bit)(0x01&CH)//设定通道初始化 .第3个下降沿 _nop_()
_nop_()
CLK=0//AD转化的初始化完成。 Di=1 CLK=1_nop_()_nop_() CLK=0_nop_() CLK=1
for(i=8i>0i--)//得到一个斗野正常排序的8位数空基喊据 {
data_f|=Dodata_f<<=1 CLK=1_nop_()_nop_() CLK=0_nop_() }
for(i=8i>0i--)//得到一个反序排列的8位数据 {
data_c<<=1data_c|=Do_nop_()CLK=1_nop_()_nop_()CLK=0_nop_()} CLK=0_nop_()
_nop_()CLK=1_nop_()_nop_()CLK=0_nop_()_nop_()CLK=1_nop_()CS=1_nop_()_nop_()return data_f}
我贴两个头文件ADC0832.h
#ifndef _ADC0832_H_
#define _ADC0832_H_
#define uchar unsigned char
#define uint unsigned int
#define channel_0 0x02 //单通道0输入选择
#define channel_1 0x03 //单通道1输入选择
/***************************************************/
/* 位定义 */
/***************************************************/
sbit ADC_DI = P2^3 //数据输入输出复用
sbit ADC_DO = P2^3 //DI和DO端都接在P1.0
sbit ADC_CLK= P2^4 //时钟端
sbit ADC_CS = P2^5 //片选端
sbit ACC0=ACC^0 //通道与输入方式控制字
sbit ACC1=ACC^1 //通道与输入方式控制字
/***************************************************/
/* 函数声明 方便查阅 */
/***************************************************/
//uchar ADC_read(uchar mode) //AD采集
//mode可选 channel_0(通道0) channel_1(通道1) 或 其他方式
/********************************************************************/
/* 启动ADC转换 */
/********************************************************************/
void ADC_start()
{
ADC_CS=1//一个转换周期开始
_nop_()
ADC_CLK=0
_nop_()
ADC_CS=0//CS置0,片选物汪有效
_nop_()
ADC_DI=1//DI置1,起始位
_nop_()
ADC_CLK=1 //第一个脉冲
_nop_()
ADC_DI=0//在负跳变之前加一个DI反转 *** 作
_nop_()
ADC_CLK=0
_nop_()
}
/********************************************************/
/* 函数功能: AD转换 */
/* 选择输入通道,输入信号的模式《单端输入,或差罩盯仔分输入》 */
/* 入口参数: mode(采集通道或方式) */
/* 返回值 : ACC (电压转换后的数字量) */
/********************************************************/
uchar ADC_read(uchar mode)
{
uchar i
ADC_start() //启动转换开始
ACC=mode
ADC_DI=ACC1 //输出则嫌控制位1,DI=1,单通道输入,DI=0,差分输入。
ADC_CLK=1 //第二个脉冲
_nop_()
ADC_DI=0
ADC_CLK=0
_nop_()
ADC_DI=ACC0 //输出控制位0,DI=0,通道0输入,DI=1,通道1输入。
ADC_CLK=1 //第三个脉冲
_nop_()
ADC_DI=1
ADC_CLK=0 //输入模式和通道号已经选择完。
ADC_CLK=1 //第四个脉冲
ACC=0
for(i=8i>0i--) //读取8位数据
{
ADC_CLK=0 //脉冲下降沿
ACC=ACC<<1
ACC0=ADC_DO //读取DO端数据
_nop_()
_nop_()
ADC_CLK=1
}
ADC_CS=1//CS=1,片选无效。
return(ACC)
}
#endif
1602.H
#ifndef _1602_H_
#define _1602_H_
#define uchar unsigned char
#define uint unsigned int
/*******************************************/
/* 位定义 */
/*******************************************/
sbit RS=P2^0 //
sbit RW=P2^1 //
sbit E=P2^2 //
/*******************************************/
/* 函数声明 方便查阅 */
/*******************************************/
//void init() //1602初始化
//void zhiling(uchar dat) //写命令 第一行地址0x80~0x8f 第二行地址0xc0~0xcf
//void shuju(uchar dat) //写数据 显示为ASCLL码字符
/************************************************/
/* 函数功能: 延时子函数 */
/* 入口参数: ms */
/************************************************/
void delay_1602(uint ms)
{
uchar time
while(ms--)
{
for(time = 0time <125time++)
}
}
/********************************************/
/* 函数功能: 写命令函数 */
/* 入口参数: dat(待写入的数据) */
/********************************************/
void zhiling(uchar dat)
{
E=0RS=0RW=0 //写命令
E=1
P0=dat
delay_1602(10) //延时 5ms
E=0
delay_1602(10) //延时 5ms
}
/********************************************/
/* 函数功能: 写数据函数 */
/********************************************/
void shuju(uchar dat)
{
E=0RS=1RW=0 //写数据
E=1
P0=dat
delay_1602(10) //延时 5ms
E=0
delay_1602(10) //延时 5ms
}
/********************************************/
/* 函数功能: 1602初始化函数 */
/********************************************/
void init() //初始化
{
zhiling(0x01) //清屏
zhiling(0x38) //功能设置
zhiling(0x0e) //开/关显示设置
zhiling(0x06) //输入方式设置(左移)
}
#endif
你要的ASC码很简单,这么做,
zhiling(0x80)//地址
shuju(6+'0')//假如你要显示6,6+'0'也就是6加上0的ASC码自然就转换成6的ASC码了
如果是66
你在显示前线换算 66/10 和 66%10,就会分别得到10位和个位,楼主自己举一反三了。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)