哪位大神有TLC3548的程序,基于430或者51单片机的,分数全给

哪位大神有TLC3548的程序,基于430或者51单片机的,分数全给,第1张

#include<reg52.h>

#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)//绘图显示开

}


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12428684.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-25
下一篇 2023-05-25

发表评论

登录后才能评论

评论列表(0条)

保存