#include"absacc.h"
#include "LCD1602.h"
#include<intrins.h>
#include <stdio.h>
#define uchar unsigned char
#define uint unsigned int
#define SUM 50
uchar t1[]="1602 START NOW!"
uchar t2[]="voltage . V"
unsigned long int tmp//数据类型要注意
sbit CLOCK=P1^7/*2543时钟*/碧带
sbit D_IN= P1^6/*2543输入*/
sbit D_OUT= P1^5/*2543输出*/
sbit _CS= P1^4/*2543片选*/
/**************************************
名称:delay
功能:延时模块
输入参数:n要延时的周期数
输出参数:无
*************************************/
void delay(uchar n)
{
uchar i
for(i=0i<ni++)
{
_nop_()
}
}
/**************************************
名称:read2543
功能:TLC2543驱动模悔源芦块
输入参数:port通道号
输出参数:ad转换值
*************************************/
uint read2543(uchar port)
{
uint ad=0,i
CLOCK=0
_CS=0
port<<=4
for(i=0i<12i++)
{
if(D_OUT)
{
ad|=0x01
}
D_IN=(bit)(port&0x80)
CLOCK=1
delay(3)
CLOCK=0
delay(3)
port<<=1
ad<<=1
}
_CS=1
ad>>=1
return(ad)
}
void main()
{
unsigned long int tmp1
int i
i=SUM
init00()
LCD_1602_str(0,t1,0,t2) //显示初始化
while(1)
{
tmp1+= read2543(0x01) //进行AD转换
i-- //取20次裂唤AD转换的结果,求平均值
if(i==0)
{
tmp1=tmp1/SUM
tmp=tmp1*50000/4096
tmp1=0
i=SUM
}
LCD_1602_num(20,0,8,tmp/10000 )
LCD_1602_num(20,0,9,tmp/1000%10)
LCD_1602_num(20,0,11,tmp/100%10)
LCD_1602_num(20,0,12,tmp/10%10)
}
}
将干簧管脉冲信号通过单片机实现到数码管显示:
/********************************************************************
* 文件名 : TLC549.c
* 描述 : 该程序实现了对TLC549的控制。通过TLC549把电压转换为数字信号并通过数码管显示出来。实际工作中进行AD采样时,一般都要把AD信号处理后再用。在这里,采集了30次,去掉最大和最小的5个,中间20个取平均值,最大型伏限度的保证了所要采集AD的准确性。
***********************************************************************/
#include
#include
#define uchar unsigned char
#define uint unsigned int
sbit AD_Out = P3^2 //TLC549输出端
sbit CS = P1^0 //TLC549片选信号
sbit AD_In = P1^1 //TLC549输入端
uchar code table[10] = {0x03, 0x9f, 0x25, 0x0d, 0x99, 0x49, 0x41, 0x1f, 0x01, 0x09}
uchar code table_d[10] = {0x02, 0x9e, 0x24, 0x0c, 0x98, 0x48, 0x40, 0x1e, 0x00, 0x08} //带点数码管显示
/********************************************************************
* 名称 : AD_Change(void)
* 功能 : TLC549驱动程序,在“视频及教程”中有讲解。
* 输入 : 无
* 输出 : temp (电压值)
***********************************************************************/
uchar AD_Change(void)
{
uchar i,temp = 0
CS = 0
_nop_()
_nop_()
_nop_()
_nop_()
for(i=0 i<8 i++)
{
AD_In = 1
_nop_()
_nop_()
temp = temp << 1
if(AD_Out == 1) temp += 1
AD_In = 0
_nop_()
_nop_()
}
CS = 1
return temp
}
/********************************************************************
* 名称 : Delay()
* 功能 : 延时,延时时间为 1ms * del
* 输入 : del
* 输出 : 绝租歼无
***********************************************************************/
void Delay(uint del)
{
uchar i, j
for(i=0 i
for(j=0 j<=148 j++)
}
/***********************************************************************
* 名 称: Average()
* 功 能: 中位值平均滤波法,取一共三十个数据,最大和最小的五个数据不要
对中间的二十个数据求平均值
* 输 入: 三十个待处理的值
* 输 出:得到一个中位的平均值
***********************************************************************/
uint Average(uint buffer[30])
{
uchar i,j
uint temp
for(i=1 i<30 i++) ////先对整个数组的三十个值进行从小到大的排列
for(j=29 j>=i --j)
{
if(buffer[j-1] > buffer[j])
{
temp = buffer[j-1]
buffer[j-1] = buffer[j]
buffer[j] = temp
}
}
////对数组进行处理,去掉一个最大值和一个最小值,中间的二十个值再来求平均值
temp = 0
for(i=5 并冲i<25 i++)
{
temp += buffer[i]
}
temp = (uint)(((float)temp) / 20 + 0.5)
return(temp)
}
/***********************************************************************
* 名 称: AD_Filter()
* 功 能: 进行AD采集30次,并进行滤波处理
* 输 入: 三十次AD采集值
* 输 出:经过处理后的AD值
***********************************************************************/
uint AD_Filter()
{
uint Date_Buffer[30] = {0}, temp
uchar i
for(i=0 i<30 i++)
{
Date_Buffer[i] = AD_Change()
Delay(1) //延时1毫秒采集一次。这里可以根据工作需要调整时间。
}
temp = Average(Date_Buffer)
return(temp)
}
/********************************************************************
* 名称 : Main()
* 功能 : 主函数
* 输入 : 无
* 输出 : 无
***********************************************************************/
void Main()
{
uint i = 0,temp
uint j
P2 = 0x00
P1 = 0xff
while(1)
{
temp = AD_Filter()
j = temp * 2
for(i=0 i<40 i++)
{
P0 = table_d[j / 100]
P2 = 0x04
Delay(10)
P0 = table[j/ 10 % 10]
P2 = 0x02
Delay(10)
P0 = table[j % 10]
P2 = 0x01
Delay(10)
}
}
}
/****************打点******************/void point(uchar x,uchar y)
{
uchar y1,hang,lie,msb_data,lsb_data,temp=0x01
if(y1!=y)
{
msb_data=0
lsb_data=0
}
y1=y
if(y<32)
{
hang=0x80+y
lie=0x80
}
if(y>31)
{
hang=0x80+y-32
lie=0x88
}
if(y>63)//return
{
lcm_com(0x80)
_nop_()
hanzi("温度超出显示范轿扰围")
while(1)
flash()
}
lie=lie+x/16
if(x%16==0)
{
msb_data=0
lsb_data=0
}
if(x%16<8)
{
msb_data=msb_data|(temp<<(7-x%16))
lsb_data=0x00|lsb_data
}//保留以前的数据,把第x个点亮闹陪
if(x%16==8)
{
msb_data=msb_data|0x00
lsb_data=lsb_data|0x80
}
if(x%16>8)大于24小于32
{
msb_data=msb_data|0x00
lsb_data=lsb_data|(temp<<(15-x%16))
}
lcm_com(0x34)//扩闭弯旦充指令集
lcm_com(hang)
lcm_com(lie)
lcm_dat(msb_data)
lcm_dat(lsb_data)
lcm_com(0x36)//绘图显示开
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)