📄 ad-dis.c
字号:
#include "reg51.h" //寄存器定义头文件
#include "intrins.h"
//****** 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
//****** TLC549时序延时定义 ******
#define Wait1us _nop_();
#define Wait2us {_nop_();_nop_();}
#define Wait4us {Wait2us;Wait2us;}
#define Wait8us {Wait4us;Wait4us;}
#define Wait10us {Wait8us;Wait2us;}
#define Wait30us {Wait10us;Wait8us;Wait4us;Wait2us;}
//////////////////////////////////////////////////////////////////////////////////////////////
//函数申明
//////////////////////////////////////////////////////////////////////////////////////////////
void send_byte(unsigned char out_byte);
unsigned char receive_byte();
void long_delay(void);
void short_delay(void);
unsigned char ADCSelChannel(void);
void TODISP(unsigned char AD_result);
//////////////////////////////////////////////////////////////////////////////////////////////
//全局变量
//////////////////////////////////////////////////////////////////////////////////////////////
unsigned int tmr;
unsigned int H; //存放显示的最高位
unsigned int M; //存放显示的中间位
unsigned int L; //存放显示的最低位
//sbit key= P1^3; //7279接口定义
sbit clk= P1^6;
sbit dat = P1^7;
sbit cs = P2^7;
//AD接口定义
sbit DAT0 = P1^0; //数据输出口线
sbit CLK0 = P1^1; //时钟口线
sbit CS0 = P1^2; //片选口线
///////////////////////////////////////////////////////////////////////////////////////////////
//主函数
///////////////////////////////////////////////////////////////////////////////////////////////
main()
{
unsigned char AD_result;
while(1)
{
AD_result=ADCSelChannel();
TODISP(AD_result);
clk=1;
dat=1;
for (tmr=0;tmr<0x2000;tmr++); //
send_byte(CMD_RESET); // HD7279A
cs = 1;
send_byte(0x80); //显示在第一个数码管
send_byte(L);
send_byte(0x81); //显示在第二个数码管
send_byte(M);
send_byte(0x82); //显示在第三个数码管
send_byte(H);
}
}
//////////////////////////////////////////////////////////////////////////////////////////////
//命令发送子函数
//功能:发送命令(8位)
//////////////////////////////////////////////////////////////////////////////////////////////
void send_byte(unsigned char out_byte)
{
unsigned char i;
cs=0; //cs下降沿开始发送数据
long_delay();
for (i=0;i<8;i++)
{
if (out_byte&0x80)
{
dat=1;
}
else
{
dat=0;
}
clk=1;
short_delay();
clk=0;
short_delay();
out_byte=out_byte*2;
}
dat=0;
}
//////////////////////////////////////////////////////////////////////////////////////////////
//命令接收子函数
//功能:接收命令(8位)
//////////////////////////////////////////////////////////////////////////////////////////////
unsigned char receive_byte()
{
unsigned char i, in_byte;
dat=1;
long_delay();
for (i=0;i<8;i++)
{
clk=1;
short_delay();
in_byte=in_byte*2; //相当与左移一位
if (dat)
{
in_byte=in_byte|0x01; //dat输出1,让in_byte末位为1
}
clk=0;
short_delay();
}
dat=0;
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<8;i++);
}
//////////////////////////////////////////////////////////////////////////////////////////////
//ADCSelChannel
//功能:转换指定通道的模拟量为数字量
//////////////////////////////////////////////////////////////////////////////////////////////
unsigned char ADCSelChannel(void)
{
unsigned char ConvertValue = 0;
unsigned char i;
CS0 = 1; //芯片复位
CS0 = 0;
CS0 = 1;
CLK0 = 0;
Wait4us;
CS0 = 0; //芯片起始
Wait4us; //等待延时
for (i = 0; i < 8; i ++) //输入采样转换时钟
{
CLK0 = 1;
CLK0 = 0;
}
CS0 = 1; //开始转换
Wait10us; //等待转换结束
CS0 = 0; //读取转换结果
Wait4us;
for (i = 0; i < 8; i ++) //
{
CLK0 = 1;
ConvertValue <<= 1;
if (DAT0)
{
ConvertValue |= 0x01;
}
CLK0 = 0;
}
CS0 = 1;
return (ConvertValue); //返回转换结果
}
//////////////////////////////////////////////////////////////////////////////////////////////
//TODISP
//功能:将转换结果拆成三位分别在数码管上显示
//////////////////////////////////////////////////////////////////////////////////////////////
void TODISP(unsigned char AD_result)
{
float cell,temp;
unsigned int number;
H=0;
M=0;
L=0;
cell=5.0/256.0;
temp=(float)AD_result*cell; //将数字的结果换算成模拟结果(0-5V)
number=(unsigned int)(temp*100); //保留前三位有效数字
H = number/100;
H |=0x80;
number=(number%100); //显示小数点
M = number/10;
L = number%10;
}
/*
#include <reg51.h>
#include <intrins.h>
sbit P1_0 = P1^0;
sbit DOUT = P1^5 ;
sbit IOCLK = P1^4;
sbit CS = P2^7;
typedef unsigned char uchar ;
typedef unsigned int uint;
void delay(uint n)
{
while(n--);
}
void main()
{
uchar j ;
uchar isFirst=0;
uchar b ;
uchar figure[16]={0x3f,0x06,0x5B, 0x4F,0x66,0x6D,0x7D,0x07, //0-7
0x7f, 0x6f, 0x77, 0x7c, 0x39,
0x5e, 0x79, 0x71};
while(1)
{
j=0; b=0;
CS=0;
//delay(10);
b=(b<<1)|DOUT; //获取最高位
j++;
while(j<8)
{
IOCLK =1;
// delay(2);
IOCLK =0;
// delay(2);
b=(b<<1)|DOUT;
j++;
} //while(j)
CS=1;
isFirst++;
//b=0x46;
if(isFirst!=1) //第一个周期不显示,因为不准确
{
//b=0x35;
P1=0x01;
P2=figure[b/16];
delay(60000);
P1<<=1; //把结果用数码管显示出来
P2=figure[b%16];
delay(60000);
}
}
}
*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -