📄 2.c
字号:
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
//寄存器地址宏定义
#define DECODE_MODE 0x09 //译码控制寄存器
#define INTENSITY 0x0A //亮度控制寄存器
#define SCAN_LIMIT 0x0B //扫描界限寄存器
#define SHUT_DOWN 0x0C //关断模式寄存器
#define DISPLAY_TEST 0x0F //测试控制寄存器
//数码管位定义
#define D0 0x01 //Digit0
#define D1 0x02 //Digit1
#define D2 0x03 //Digit2
#define D3 0x04 //Digit3
#define D4 0x05 //Digit4
#define D5 0x06 //Digit5
#define D6 0x07 //Digit6
#define D7 0x08 //Digit7
//数组定义
uint Ad_Value[5];
//数码管不译码按段显示定义 七段+点格式 D7-D0 DP-A-B-C-D-E-F-G
//不带点 0 0x7e 1 0x30 2 0x6d 3 0x79 4 0x33
// 5 0x5b 6 0x5f 7 0x70 8 0xff 9 0x7c
// - 0x01 E 0x4f H 0x37 L 0x0e P 0x67 blank 0x00
//MAX7219管脚定义
sbit CLK=P1^0; //MAX7219串行时钟 13脚
sbit LOAD=P1^1; //MAX7219片选 ( CS ) 12脚
sbit DIN=P1^2; //MAX7219串行数据 1脚
//TLC2543定义四线制接口
sbit clk = P3^4; //时钟 18
sbit din = P3^5; //数据入口 17
sbit dout = P3^6; //数据出口 16
sbit cs = P3^7; //片选 15
//函数声明
void Initial(void); //MAX7219初始化函数
void Write7219(uchar address,uchar dat); //数码管
void delay(); //延时函数
uint AD_Conver(uchar channel); //AD转换
//主函数
void main()
{
uint j;
uchar d0,d1,d2,d3;
Initial(); //MAX7219初始化
delay();
while(1)
{
Ad_Value[0] = AD_Conver(1); //0通道,转换数据12位,高位在前,低位在后
d3=Ad_Value[0]/1000;
d2=(Ad_Value[0]%1000)/100;
d1=Ad_Value[0]%100/10;
d0=Ad_Value[0]%10;
Write7219(D3,d3);
Write7219(D2,d2);
Write7219(D1,d1);
Write7219 (D0,d0);
for(j=0;j<45000;j++);
}
}
//--------------------------------------------------
// 函数名称: delay
// 函数功能: 延时55us
// 入口参数: 无
// 出口参数: 无
//--------------------------------------------------
void delay()
{
uchar i = 5;
while(i--);
}
//--------------------------------------------------
// 函数名称: AD_Conver
// 函数功能: AD转换
// 入口参数: 地址命令字
// 出口参数: AD值
//--------------------------------------------------
uint AD_Conver(uchar channel)
{
uchar i;
uint ad_value = 0;
clk = 0;
cs = 1;
delay();
cs = 0;
channel <<=4;
for (i = 0; i < 12; i++) //注意:在12个时钟周期的下降沿产生了数据输出
{ //在前4个时钟周期内,TLC2543已经知道下一次将
if (dout) ad_value |= 1; //哪个通道做转换,在后8个时钟内就一直对此通道
din = (bit)(channel & 0x80); //进行采样,并保持到第12个时钟周期结束,此后才
clk = 1; //开始进行A/D转换,转换时间需要10us.
delay(); //在第4-8个时钟周期内输入的是命令控制字
clk = 0; //可根据需要输入
channel<<=1;
ad_value<<=1;
}
clk =1;
ad_value>>=1;
return ad_value;
}
//地址、数据发送子程序
void Write7219(uchar address,uchar dat)
{
uchar i;
LOAD=0; //拉低片选线,选中器件
//发送地址
for (i=0;i<8;i++) //移位循环8次
{
CLK=0; //清零时钟总线
DIN=(bit)(address&0x80); //每次取高字节
address<<=1; //左移一位
CLK=1; //时钟上升沿,发送地址
}
//发送数据
for (i=0;i<8;i++)
{
CLK=0;
DIN=(bit)(dat&0x80);
dat<<=1;
CLK=1; //时钟上升沿,发送数据
}
LOAD=1; //发送结束,上升沿锁存数据
}
//MAX7219初始化,设置MAX7219内部的控制寄存器
void Initial(void)
{
Write7219(SHUT_DOWN,0x01); //开启正常工作模式(0xX1) 关断状态(0xX0)
Write7219(DISPLAY_TEST,0x00); //选择工作模式(0xX0) 测试状态(0xX1)
Write7219(DECODE_MODE,0xff); //选用全译码模式 (0xff) 不译码(0x00)
//只Digit0译码 (0x01) 只Digit0-3(0x0f)
Write7219(SCAN_LIMIT,0x03); //8只LED全用 (0xX7) 0xXN 用Digit0--DigitN
Write7219(INTENSITY,0x04); //设置初始亮度(0xX0--0xXF )
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -