stm8s单片机2位数码管显示_STM8S005 ADC采集 5位共阴数码管显示

程序包含TM1618驱动的4位或5位共阴数码管函数,包含ADC采集函数,求平均函数,

实现STM8S005单片机B0口采集后,将电压值用4位或5位共阴数码管显示。

在IAR环境编译通过

下面贴出main.c程序 :

// 要用到stm8s_clk.c和stm8s_gpio.c

// 要用到stm8s_adc1.c,该文件头要有 #include "stm8s.h"和 #include "stm8s_adc1.h"

// 且"stm8s.h"放在"stm8s_adc1.h"之前,否则编译出错

//******************************************************************************************

//

//#include "stm8s.h" //用 V2.0.0 25-February-2011 版本

#include "stm8s_gpio.h" //用 V2.0.0 25-February-2011 版本

#include "stm8s_clk.h" //用 V2.0.0 25-February-2011 版本

#include "stm8s_adc1.h" //用 V2.1.0 18-November-2011 版本

void command(unsigned char com) ; //1618命令参数com函数

void send_8bit(unsigned char dat); //1618发送显示参数dat的函数

void TM1618_IOset();

void TM1618_CMDset();

void dpy(unsigned int sz); //显示函数

void Adc_cfg(); //ADC配置函数

void adc_zs8(); //ADC采集函数

unsigned int sz=0;                                 // TM1618 要显示的数值 全局变量

//*****************************************************************************

// 定义数据 数码管0-9 4位8段模式下,共阴数码管0-9的编码

// 高8位:***edcba 低8位:**pgf***

unsigned const CODE[ ][2]={{0x1f,0x08},{0x06,0x00},{0x1b,0x10},{0x0f,0x10},

{0x06,0x18},{0x0d,0x18},{0x1d,0x18},{0x07,0x00},

{0x1f,0x18},{0x0f,0x18} }; //可放在main 的前面

//***************************************************************

//*** 延时函数3

void delay3(void) //用于ADC开启稳定的间隔

{

unsigned int i0,i2;

for (i0=0;i0<30000;i0++)

{for (i2=0;i2<100;i2++);}

}

//***** 功能:TM1618端口设置 ***************************************************

//****************************************************************************

void TM1618_IOset(void)

{

#define DIO_0 GPIO_WriteLow(GPIOC,GPIO_PIN_6) //定义LED芯片TM1618 输入口低

#define DIO_1 GPIO_WriteHigh(GPIOC,GPIO_PIN_6) //定义LED芯片TM1618 输入口高

#define STB_0 GPIO_WriteLow(GPIOC,GPIO_PIN_7) //定义LED芯片TM1618

#define STB_1 GPIO_WriteHigh(GPIOC,GPIO_PIN_7) //定义LED芯片TM1618 低

#define CLK_0 GPIO_WriteLow(GPIOC,GPIO_PIN_5) //定义LED芯片TM1618 时钟低

#define CLK_1 GPIO_WriteHigh(GPIOC,GPIO_PIN_5) //定义LED芯片TM1618 时钟高

#define K2_0 GPIO_WriteLow(GPIOE,GPIO_PIN_5) //定义LED芯片TM1618 键扫低

#define K2_1 GPIO_WriteHigh(GPIOE,GPIO_PIN_5) //定义LED芯片TM1618 键扫高

//***********************************************

GPIO_Init(GPIOC, GPIO_PIN_6, GPIO_MODE_OUT_PP_HIGH_FAST ); //初始化1618的DIO

GPIO_Init(GPIOC, GPIO_PIN_5, GPIO_MODE_OUT_PP_HIGH_FAST ); //初始化1618的CLK

GPIO_Init(GPIOC, GPIO_PIN_7, GPIO_MODE_OUT_PP_HIGH_FAST ); //初始化1618的STB

GPIO_Init(GPIOE, GPIO_PIN_5, GPIO_MODE_OUT_PP_HIGH_FAST ); //初始化1618的K2

}

//*** 功能:配置 TM1618 ************************************************************

//*****************************************************************************

void TM1618_CMDset(void)

{

command(0x00);            //显示模式指令,0x00为 4位8段模式;0x01为 5位7段模式

command(0x40);            //芯片设为写数据模式指令,地址自动加1模式;

//0x44 为写固定地址指令;0x42 为读键扫指令

command(0x88);            //显示控制命令,打开显示并设置为最暗

//command(0x8F);          //8F设置为最亮

//command(0x87);         //87设置为关

//command(0xC0);        //设置显示首地址命令,放在每次发送显示数据函数中

}

// ********** 功能:向TM1618发送1字节8位数据 *******************************************

// *************************************************************************************

void send_8bit(unsigned char dat) //dat是要发的数据变量

{

STB_0;                                 //C7;STB=0保证“STB”为低电平,程序不依赖于之前端

//口的状态保证程序在实际运行中不会出现“端口迷失”

for(char i=0;i<8;i++)              // i为轮发循环次数发送8位,移位8次一个字节

{

if (dat&0x01)

DIO_1;                            // C6口置高

else

DIO_0;                            //C6口置低

CLK_0;                            //C5口置低 TM1618最大输入时钟1MHz

CLK_1;                            //C5口置高

dat=dat>>1;                    //移位发送

}

}

//**** 功能:向TM1618发送命令 ***********************************************************

//***********************************************************************************

void command(unsigned char com)            //com是命令字符参数变量

{

STB_1;                    //C7口置高

STB_0;                    //C7口置低

send_8bit(com);      //调发送字节函数

}                                 //下降沿后由DIO输入的第一个字节作为指令

//下降沿后由DIO输入的第一个字节作为指令

// **************************************************************

// 功能:在1-5位数码管显示数字 全局变量sz,在main中

// **************************************************************

void dpy(unsigned int sz)

{

/*                                                   //sz_n 本函数要显示数值

unsigned char i,nxs[5];                 //5位显示

nxs[0]=sz_n%100000/10000;

nxs[1]=sz_n%10000/1000;

nxs[2]=sz_n%1000/100;

nxs[3]=sz_n%100/10;

nxs[4]=sz_n%10/1;

*/

unsigned char i,nxs[4];                 //4位显示,定义数组nxs

if(sz>9999)

sz=9999;

nxs[0]=sz%10000/1000;              //定义i为轮发次数和位数组位置 变量

nxs[1]=sz%1000/100;                 //sz 要显示的数值,全局变量

nxs[2]=sz%100/10;                     //计算显示的个十百千位

nxs[3]=sz%10/1;

command(0xC0);                        //轮发4位首地址设置指令,非轮发可其它地址

for(i=0;i<4;i++)                            //轮发次数 i=4次

//for(i=0;i<5;i++)                          //轮发送显示数5位

{

send_8bit(CODE[nxs[i]][0]);        //i是nxs数组位置变量,如i=3,则取出nxs[3]的值

send_8bit(CODE[nxs[i]][1]);        //如nxs[3]的值=7,去CODE数组取7高低8位并发送

}

STB_1;                                       //C7=1 关片选

}

//**************************************************************************************

//*** ADC设置函数,可与ADC采集放一起,更好的是分开 *************************

void Adc_cfg(void) //使用ADC1的转换共12步

{

GPIO_Init(GPIOB, GPIO_PIN_0, GPIO_MODE_IN_FL_NO_IT );  //  设置B0口为悬浮无中断输入

ADC1_DeInit();                                                                                //  ADC1口复位初始状态

ADC1_Init(ADC1_CONVERSIONMODE_SINGLE,                        //  设置ADC1为单次转

ADC1_CHANNEL_0,                                                                      //   选择ADC1的通道0

ADC1_PRESSEL_FCPU_D2,                                                        //   设ADC内置时钟 2分频

ADC1_EXTTRIG_TIM, DISABLE,                                                  //  外部触发ADC事件关闭

ADC1_ALIGN_RIGHT,                                                                   //  数据对齐方向右对齐

ADC1_SCHMITTTRIG_CHANNEL0, DISABLE);                          //  关闭ADC1通道0的施密特触发器

// ADC1_Cmd(ENABLE);                                                               //  使能ADC1

}

//************************************************************************************

//*** ADC采集函数 ********************************************************************

void adc_zs8()

{

float adsz1=0;

delay1();                                                   //加入延时,防止采集间隔太快

ADC1_Cmd(ENABLE);                            //  使能ADC1

ADC1_StartConversion();                        //   ADC1开始转换

adsz1 = ADC1_GetConversionValue();   //   得到转换结果

//ADC1_Cmd(DISABLE);                         //   关闭ADC1,下次重开

adsz1=(adsz1/1024)*3339;                     //1024对应转速满量程 ;

sz=adsz1;

}

//*************************************************************************************

//***** 求平均函数

void sumpj(void)

{

unsigned int sum = 0;

unsigned char i;

for (i=0;i<15;i++)

{

adc_zs8(); //AD采集

sum=sum+sz; //累加

}

sz=sum/15; //求平均

}

//***********************************************************

// 主程序开始

//*********************************************************

main(void)

{

CLK_DeInit();                                                                     //复位时钟寄存器

CLK_HSICmd(ENABLE);                                                   //内部高速时钟使能

CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV1); //内部1分频 16M

sim();                                                                                  //关总中断

TM1618_IOset();                                                               //配置TM1618芯片的IO

TM1618_CMDset();                                                          //配置TM1618芯片的指令

Adc_cfg();                                                                         //配置ADC

while (1)                                                                            //死循环

{

sumpj();                                                                         //AD求平均

dpy(sz);                                                                         //ADC显示

delay3();

}

}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值