/*********************************************************************************************
说明:罗斯蒙特压力变送器数字表头驱动
表头有个六针插座,双排三个.
标注1的是正5V,同排第二个是面板跳线HL切换的中间脚,即跳线跳到H时候,输出接电源正,跳到L时候输出接地,同排第三个是电源地
第二排与正挨着的是LOD引脚,接地时候显示不刷新,后台数据持续输入到内部移位寄存器,高电平时候立即把内部寄存器显示出来
第二排中间的是CLK时钟输入脚,每次从低变高就把数据引脚的电平移入移位寄存器
第二排与地挨着的是DAT引脚,高电平笔画点亮,低电平熄灭
/*********************************************************************************************/
#include <REG51.h> //通用89C51头文件
#include <intrins.h>
sfr AUXR = 0x8e; //Auxiliary register
sbit DAT = P1 ^ 0;
sbit CLK = P1 ^ 1;
sbit LOD = P1 ^ 2;
//显示用内存变量寄存器:倒数后四个是数字
unsigned char disp[8]={0x00,0x00,0x00,0x00,0xCF,0xDB,0x86,0xBF};
/************* 本地常量声明 **************/
unsigned char code t_display[]={ //标准字库
// 0 1 2 3 4 5 6 7 8 9 A B C D E F
0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71,
//black - H J K L N o P U t G Q r M y
0x00,0x40,0x76,0x1E,0x70,0x38,0x37,0x5C,0x73,0x3E,0x78,0x3d,0x67,0x50,0x37,0x6e};
unsigned char code t_displaydot[]={
0xBF,0x86,0xDB,0xCF,0xE6,0xED,0xFD,0x87,0xFF,0xEF,0x46}; //0. 1. 2. 3. 4. 5. 6. 7. 8. 9. -1
#define FOSC 11059200L
#define T1MS (65536-FOSC/100) //1T模式
unsigned int adc_value;
/**********************************************************************************************/
/**************** 向显示器发送显示数据 ******************/
void Send()
{
unsigned char i,j,k;
for(i=0; i<8; i++)
{
k=disp;
for(j=0; j<8; j++)
{
k <<= 1;
DAT = CY;
CLK = 1;
CLK = 0;
}
}
LOD = 1;
LOD = 0;
}
/*********************************************************************************************
函数名:毫秒级CPU延时函数
调 用:DELAY_MS (?);
参 数:1~65535(参数不可为0)
返回值:无
结 果:占用CPU方式延时与参数数值相同的毫秒时间
备 注:应用于1T单片机时i<600,应用于12T单片机时i<125
/*********************************************************************************************/
void DELAY_MS (unsigned int a)
{
unsigned char i, j;
while( a-- != 0)
{
_nop_();
_nop_();
_nop_();
i = 11;
j = 190;
do
{
while (--j);
} while (--i);
}
}
/*********************************************************************************************/
/*********************************************************************************************
函数名:定时/计数器初始化函数
调 用:T_C_init();
参 数:无
返回值:无
结 果:设置SFR中T/C1和(或)T/C0相关参数
备 注:本函数控制T/C1和T/C0,不需要使用的部分可用//屏蔽
/**********************************************************************************************/
void Timer0Init(void) //50毫秒@11.0592MHz
{
AUXR &= 0x7F; //定时器时钟12T模式
TMOD &= 0xF0; //设置定时器模式
TL0 = 0xF0; //设置定时初值
TH0 = 0x4B; //设置定时初值
TF0 = 0; //清除TF0标志
TR0 = 1; //定时器0开始计时
ET0 = 1; //使能定时器0中断
EA = 1;
}
/**********************************************************************************************/
//-----------------------------------------------
/* Timer0 interrupt routine */
void tm0_isr() interrupt 1 using 1
{
unsigned char i;
i++;
if (i>19)
{ i=0;
adc_value++;
if (adc_value>9999)
{
adc_value=0;
}
}
}
//-----------------------------------------------
void main (void)
{
Timer0Init();
//UART_init();
while(1)
{
DELAY_MS(100);
// disp[3] = t_display[adc_value / 10000];
disp[7] = t_display[adc_value % 10000 / 1000];
disp[6] = t_displaydot[adc_value % 1000 / 100];
disp[5] = t_display[adc_value % 100 / 10];
disp[4] = t_display[adc_value % 10];
Send();
// UART_TC("d9887321$");
}
}
文章评论(0条评论)
登录后参与讨论