基于STC12C5A60S2系列1T 8051单片机A/D转换器应用

基于STC12C5A60S2系列1T 8051单片机A/D转换器应用

  • STC12C5A60S2系列1T 8051单片机管脚图
  • STC12C5A60S2系列1T 8051单片机I/O口各种不同工作模式及配置
  • STC12C5A60S2系列1T 8051单片机I/O口各种不同工作模式介绍
  • STC12C5A60S2系列1T 8051单片机A/D转换器介绍
  • STC12C5A60S2系列1T 8051单片机A/D转换器的结构
  • 基于STC12C5A60S2系列1T 8051单片机A/D转换器的特殊功能寄存器列表
    • 基于STC12C5A60S2系列1T 8051单片机A/D转换器用到的特殊功能寄存器
      • A/D转换器P1口模拟功能控制寄存器P1ASF
      • A/D转换器控制寄存器ADC_CONTR
      • A/D转换器控制寄存器ADC_RES ADC_RESL
      • A/D转换器中断寄存器
      • 基于STC12C5A60S2系列1T 8051单片机A/D转换器转换电压模拟量为数字量
      • 基于STC12C5A60S2系列1T 8051单片机A/D转换器转换电压模拟量为电压数字量

STC12C5A60S2系列1T 8051单片机管脚图

在这里插入图片描述在这里插入图片描述

STC12C5A60S2系列1T 8051单片机I/O口各种不同工作模式及配置

在这里插入图片描述

STC12C5A60S2系列1T 8051单片机I/O口各种不同工作模式介绍

在这里插入图片描述在这里插入图片描述

STC12C5A60S2系列1T 8051单片机A/D转换器介绍

基于STC12C5A60S2系列1T 8051单片机A/D转换器应用_第1张图片基于STC12C5A60S2系列1T 8051单片机A/D转换器应用_第2张图片基于STC12C5A60S2系列1T 8051单片机A/D转换器应用_第3张图片

STC12C5A60S2系列1T 8051单片机A/D转换器的结构

基于STC12C5A60S2系列1T 8051单片机A/D转换器应用_第4张图片基于STC12C5A60S2系列1T 8051单片机A/D转换器应用_第5张图片基于STC12C5A60S2系列1T 8051单片机A/D转换器应用_第6张图片

基于STC12C5A60S2系列1T 8051单片机A/D转换器的特殊功能寄存器列表

基于STC12C5A60S2系列1T 8051单片机A/D转换器应用_第7张图片

基于STC12C5A60S2系列1T 8051单片机A/D转换器用到的特殊功能寄存器

A/D转换器P1口模拟功能控制寄存器P1ASF

基于STC12C5A60S2系列1T 8051单片机A/D转换器应用_第8张图片作用:用来设置STC12C5A60S2系列1T 8051单片机A/D转换器模拟输入通道

A/D转换器控制寄存器ADC_CONTR

基于STC12C5A60S2系列1T 8051单片机A/D转换器应用_第9张图片基于STC12C5A60S2系列1T 8051单片机A/D转换器应用_第10张图片基于STC12C5A60S2系列1T 8051单片机A/D转换器应用_第11张图片
作用:用来设置STC12C5A60S2系列1T 8051单片机A/D转换器以下功能
(1)、设置A/D转换器电源
(2)、设置A/D转换器转换速度
(3)、设置A/D转换器转换结束标志位
(4)、设置A/D转换器转换启动
(5)、设置A/D转换器模拟输入通道

A/D转换器控制寄存器ADC_RES ADC_RESL

基于STC12C5A60S2系列1T 8051单片机A/D转换器应用_第12张图片基于STC12C5A60S2系列1T 8051单片机A/D转换器应用_第13张图片基于STC12C5A60S2系列1T 8051单片机A/D转换器应用_第14张图片
作用:用来设置STC12C5A60S2系列1T 8051单片机A/D转换器保存转换的结果

A/D转换器中断寄存器

基于STC12C5A60S2系列1T 8051单片机A/D转换器应用_第15张图片基于STC12C5A60S2系列1T 8051单片机A/D转换器应用_第16张图片
作用:用来设置STC12C5A60S2系列1T 8051单片机A/D转换器中断

基于STC12C5A60S2系列1T 8051单片机A/D转换器转换电压模拟量为数字量

#include <stc12c5a60s2.h>
#include <intrins.h>
#define uchar unsigned char//自定义无符号字符型为uchar
#define uint unsigned int//自定义无符号整数型为uint
#define NixieTubeSegmentCode P0//自定义数码管段码为单片机P0组引脚
#define NixieTubeBitCode P2//自定义数码管位码为单片机P2组引脚
//#define SinglechipVoltage 5.000//自定义单片机电压为5V
uchar Code NixieTubeBitCodeArray = [0xfe,0xfd,0xfb,0xf7];//定义共阴数码管位码数组变量
uchar NixieTubeDisplayDataArray[0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x40,0x00];//定义共阴数码管显示0~F数据、符号“—”及熄灭数组变量
uchar NixieTubeCacheDataArray[];//定义数码管缓存数据数组变量
uchar AdcChangeResult;//声明A/D转换器转换结果变量
uchar AdcLowBitResult;//声明A/D转换器低位转换结果变量
uchar AdcChangeOverFlag = 0;//定义A/D转换器转换结束标志位清0 
uint AdcDataResult;//声明A/D转换器数字结果变量
//float InputVoltage;//声明外部输入电压变量
void AdcInit();//A/D转换器初始化函数
void AdcChangeResult();//A/D转换器转化结果函数
void NixieTubeDisplayDataSplit();//数码管显示数据分解函数
void NixieTubeDisplayData();//数码管显示数据函数  
void Timer0Init(void);//定时器0初始化函数
  void main(void)//主函数
{
   Timer0Init();//定时器0初始化函数 
   AdcInit();//A/D转换器初始化函数
   while(1)//主循环
  {
    AdcDataResult = AdcChangeResult();//A/D转换器转化结果赋给A/D转换器数字结果变量
    //InputVoltage = SinglechipVoltage * AdcDataResult / 1023;//计算输入电压 
   }
  }
  void AdcInit()//A/D转换器初始化函数
 {
   P1ASF= 0x01;//设置P1.0端口为A/D转换器模拟输入通道
   AUXR1 = 0x00;//设置A/D转换器转换结果寄存器CON_RES存放高八位A/D转换器转换结果 CON_RESL存放低二位A/D转换器转换结果 
   AD_CONTR= 0x80;//打开A/D转换器电源
   _nop_();
   _nop_();
   _nop_();
   _nop_();
   AD_CONTR = 0xe1;//设置A/D转换器转换速度为最高 选P1.0端口作为A/D转换器模拟输入通道 A/D转换器转换结束标志位清0 A/D转换器转换启动控制位清0
   AD_CONTR= 0x08;//启动A/D转换器
  }
  uint AdcChangeResult()//A/D转换器转化结果函数
 {
   while(AdcChangeOverFlag = 0)//当A/D转换器转换结束标志位为0
  {
    AdcChangeOverFlag = AD_CONTR & 0x10;//判断A/D转换器转换是否结束 当AdcChangeOverFlag = 0x10表示A/D转换器转换结束 跳出while()循环
   }
   AD_CONTR & = 0xe7;//A/D转换器转换结束后 A/D转换器结束标志位与转换启动控制位都清0
   AdcChangeResult = ADC_RES;//A/D转换器高位A/D转换结果寄存器高八位存放值赋给A/D转换器转换结果变量
   AdcChangeResult << = 2;//A/D转换器转换结果左移2位变成高八位和空出低二位
   AdcLowBitResult = ADC_RESL;//A/D转换器低位A/D转换结果寄存器低二位存放值赋给A/D转换器低位转换结果变量
   AdcLowBitResult & = 0x03;//保留A/D转换器低位A/D转换结果寄存器低二位存放值 屏蔽A/D转换器低位A/D转换结果寄存器其他位
   AdcChangeResult |= AdcLowBitResult;//A/D转换器高位A/D转换结果寄存器高八位存放值或上A/D转换器低位A/D转换结果寄存器低二位存放值组成一个十位数据
   return AdcChangeResult;//返回A/D转换器转换结果
  }
  void NixieTubeDisplayDataSplit()//数码管显示数据分解函数
 {
   uchar NixieTubeQianWei,NixieTubeBaiWei,NixieTubeShiWei,NixieTubeGewei;//声明数码管千位、百位、十位、个位变量
   NixieTubeQianWei = AdcDataResult / 1000 ;//数码管千位分解
   NixieTubeBaiWei = AdcDataResult / 100 % 10;//数码管百位分解
   NixieTubeShiWei = AdcDataResult / 10 % 10 ;//数码管十位分解
   NixieTubeGeWei = AdcDataResult % 10 ;//数码管个位分解
   if(AdcDataResult < 1000 )
  {
    NixieTubeCacheDataArray[0] = 0x00;//数码管千位不显示
   }
   else 
  {
    NixieTubeCacheDataArray[0] = NixieTubeQianWei;//数码管千位显示数据
   }
   if(AdcDataResult < 100 )
  {
    NixieTubeCacheDataArray[1] = 0x00;//数码管百位不显示
   }
   else 
  {
    NixieTubeCacheDataArray[1] = NixieTubeBaiWei;//数码管百位显示数据
   }
   if(AdcDataResult < 10 )
  {
    NixieTubeCacheDataArray[2] = 0x00;//数码管十位不显示
   }
   else 
  {
    NixieTubeCacheDataArray[2] = NixieTubeShiWei;//数码管十位显示数据
   }
   NixieTubeCacheDataArray[3] = NixieTubeGeWei;//数码管个位显示数据
  }
  void NixieTubeDisplayData()//数码管显示数据函数  
 {  
   static uchar i = 0;//定义静态数码管位变化变量
   switch(i)//数码管位变化筛选
  {
    case 0 ://数码管千位显示
            NixieTubeSegmentCode = 0x00;//数码管段码消影
            NixieTubeSegmentCode = NixieTubeDisplayDataArray[NixieTubeCacheDataArray[0]];//数码管千位的段码显示
            NixieTubeBitCode = NixieTubeBitCodeArray[0];//数码管千位码显示
            i++;//数码管位变化自加1
            break;//跳出
    case 1 ://数码管百位显示
            NixieTubeSegmentCode = 0x00;//数码管段码消影
            NixieTubeSegmentCode = NixieTubeDisplayDataArray[NixieTubeCacheDataArray[1]];//数码管百位的段码显示
            NixieTubeBitCode = NixieTubeBitCodeArray[1];//数码管百位码显示
            i++;//数码管位变化自加1
            break;//跳出 
    case 2 ://数码管十位显示
            NixieTubeSegmentCode = 0x00;//数码管段码消影
            NixieTubeSegmentCode = NixieTubeDisplayDataArray[NixieTubeCacheDataArray[2]];//数码管十位的段码显示
            NixieTubeBitCode = NixieTubeBitCodeArray[2];//数码管十位码显示
            i++;//数码管位变化自加1
            break;//跳出
    case 3 ://数码管个位显示
            NixieTubeSegmentCode = 0x00;//数码管段码消影
            NixieTubeSegmentCode = NixieTubeDisplayDataArray[NixieTubeCacheDataArray[3]];//数码管个位的段码显示
            NixieTubeBitCode = NixieTubeBitCodeArray[3];//数码管个位码显示
            i = 0;//数码管位变化清0
            break;//跳出
    default:break;//跳出
   }
  }
  void Timer0Init(void)//定时器0定时1ms初始化函数 晶振为12MHz
 {
   TMOD &= 0xf0;//设定定时器/计数器工作模式清0
   TMOD |= 0x01;//设定定时器/计数器为定时器 工作模式为16位定时器0模式1
   TH0 = 0xfc;//设定定时器0高8位初值 
   TL0 = 0x18;//设定定时器0低8位初值
   TF0 = 0;//定时器0溢出中断标志位清0
   ET0 = 1;//打开定时器中断开关
   EA = 1;//打开定时器中断总开关
   TR0 = 1//打开定时器0开关
  } 
  void Timer0(void) interrupt 1//定时器0定时1ms中断函数 晶振为12MHz
 {
   TR0 = 0;//关定时器0开关
   NixieTubeDisplayData();//数码管显示数据函数
   TH0 = 0xfc;//设定定时器0高8位初值
   TL0 = 0x18;//设定定时器0低8位初值
   TR0 = 1;//开定时器0开关
  }

基于STC12C5A60S2系列1T 8051单片机A/D转换器转换电压模拟量为电压数字量

#include <stc12c5a60s2.h>
#include <intrins.h>
#define uchar unsigned char//自定义无符号字符型为uchar
#define uint unsigned int//自定义无符号整数型为uint
#define NixieTubeSegmentCode P0//自定义数码管段码为单片机P0组引脚
#define NixieTubeBitCode P2//自定义数码管位码为单片机P2组引脚
#define SinglechipVoltage 5.000//自定义单片机电压为5V
uchar Code NixieTubeBitCodeArray = [0xfe,0xfd,0xfb,0xf7];//定义共阴数码管位码数组变量
uchar NixieTubeDisplayDataArray[0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef,0xf7,0xfc,0xb9,0xde,0xf9,0xf1,0x40,0x00];//定义共阴数码管显示0~F、0~F带小数点数据及符号“—”及熄灭数组变量
uchar NixieTubeCacheDataArray[];//定义数码管缓存数据数组变量
uchar AdcChangeResult;//声明A/D转换器转换结果变量
uchar AdcLowBitResult;//声明A/D转换器低位转换结果变量
uchar AdcChangeOverFlag = 0;//定义A/D转换器转换结束标志位清0 
uint AdcDataResult;//声明A/D转换器数字结果变量
float InputVoltage;//声明外部输入电压变量
void AdcInit();//A/D转换器初始化函数
void AdcChangeResult();//A/D转换器转化结果函数
void NixieTubeDisplayDataSplit();//数码管显示数据分解函数
void NixieTubeDisplayData();//数码管显示数据函数  
void Timer0Init(void);//定时器0初始化函数
  void main(void)//主函数
{
   Timer0Init();//定时器0初始化函数 
   AdcInit();//A/D转换器初始化函数
   while(1)//主循环
  {
    AdcDataResult = AdcChangeResult();//A/D转换器转化结果赋给A/D转换器数字结果变量
    InputVoltage = SinglechipVoltage * AdcDataResult / 1023;//计算输入电压 
   }
  }
  void AdcInit()//A/D转换器初始化函数
 {
   P1ASF= 0x01;//设置P1.0端口为A/D转换器模拟输入通道
   AUXR1 = 0x00;//设置A/D转换器转换结果寄存器CON_RES存放高八位A/D转换器转换结果 CON_RESL存放低二位A/D转换器转换结果 
   AD_CONTR= 0x80;//打开A/D转换器电源
   _nop_();
   _nop_();
   _nop_();
   _nop_();
   AD_CONTR = 0xe1;//设置A/D转换器转换速度为最高 选P1.0端口作为A/D转换器模拟输入通道 A/D转换器转换结束标志位清0 A/D转换器转换启动控制位清0
   AD_CONTR= 0x08;//启动A/D转换器
  }
  uint AdcChangeResult()//A/D转换器转化结果函数
 {
   while(AdcChangeOverFlag = 0)//当A/D转换器转换结束标志位为0
  {
    AdcChangeOverFlag = AD_CONTR & 0x10;//判断A/D转换器转换是否结束 当AdcChangeOverFlag = 0x10表示A/D转换器转换结束 跳出while()循环
   }
   AD_CONTR & = 0xe7;//A/D转换器转换结束后 A/D转换器结束标志位与转换启动控制位都清0
   AdcChangeResult = ADC_RES;//A/D转换器高位A/D转换结果寄存器高八位存放值赋给A/D转换器转换结果变量
   AdcChangeResult << = 2;//A/D转换器转换结果左移2位变成高八位和空出低二位
   AdcLowBitResult = ADC_RESL;//A/D转换器低位A/D转换结果寄存器低二位存放值赋给A/D转换器低位转换结果变量
   AdcLowBitResult & = 0x03;//保留A/D转换器低位A/D转换结果寄存器低二位存放值 屏蔽A/D转换器低位A/D转换结果寄存器其他位
   AdcChangeResult |= AdcLowBitResult;//A/D转换器高位A/D转换结果寄存器高八位存放值或上A/D转换器低位A/D转换结果寄存器低二位存放值组成一个十位数据
   return AdcChangeResult;//返回A/D转换器转换结果
  }
  void NixieTubeDisplayDataSplit()//数码管显示数据分解函数
 {
   uchar NixieTubeQianWei,NixieTubeBaiWei,NixieTubeShiWei,NixieTubeGewei;//声明数码管千位、百位、十位、个位变量
   NixieTubeQianWei = InputVoltage / 1000 ;//数码管千位分解
   NixieTubeBaiWei = InputVoltage / 100 % 10;//数码管百位分解
   NixieTubeShiWei = InputVoltage / 10 % 10 ;//数码管十位分解
   NixieTubeGeWei = InputVoltage % 10 ;//数码管个位分解
   NixieTubeCacheDataArray[0] = NixieTubeQianWei + 15;//数码管千位带小数点显示数据
   NixieTubeCacheDataArray[1] = NixieTubeBaiWei;//数码管百位显示数据
   NixieTubeCacheDataArray[2] = NixieTubeShiWei;//数码管十位显示数据
   NixieTubeCacheDataArray[3] = NixieTubeGeWei;//数码管个位显示数据
  }
  void NixieTubeDisplayData()//数码管显示数据函数  
 {  
   static uchar i = 0;//定义静态数码管位变化变量
   switch(i)//数码管位变化筛选
  {
    case 0 ://数码管千位显示
            NixieTubeSegmentCode = 0x00;//数码管段码消影
            NixieTubeSegmentCode = NixieTubeDisplayDataArray[NixieTubeCacheDataArray[0]];//数码管千位的段码显示
            NixieTubeBitCode = NixieTubeBitCodeArray[0];//数码管千位码显示
            i++;//数码管位变化自加1
            break;//跳出
    case 1 ://数码管百位显示
            NixieTubeSegmentCode = 0x00;//数码管段码消影
            NixieTubeSegmentCode = NixieTubeDisplayDataArray[NixieTubeCacheDataArray[1]];//数码管百位的段码显示
            NixieTubeBitCode = NixieTubeBitCodeArray[1];//数码管百位码显示
            i++;//数码管位变化自加1
            break;//跳出 
    case 2 ://数码管十位显示
            NixieTubeSegmentCode = 0x00;//数码管段码消影
            NixieTubeSegmentCode = NixieTubeDisplayDataArray[NixieTubeCacheDataArray[2]];//数码管十位的段码显示
            NixieTubeBitCode = NixieTubeBitCodeArray[2];//数码管十位码显示
            i++;//数码管位变化自加1
            break;//跳出
    case 3 ://数码管个位显示
            NixieTubeSegmentCode = 0x00;//数码管段码消影
            NixieTubeSegmentCode = NixieTubeDisplayDataArray[NixieTubeCacheDataArray[3]];//数码管个位的段码显示
            NixieTubeBitCode = NixieTubeBitCodeArray[3];//数码管个位码显示
            i = 0;//数码管位变化清0
            break;//跳出
    default:break;//跳出
   }
  }
   /*****关于通过特殊功能寄存器AUXR设定定时器/计数器模式为1T或12T模式不需分频或需12分频8051系列单片机定时器初值(定时计数初值)计算的知识点*****/
  /****
  时钟周期(又称振荡周期):单片机晶振频率的倒数 例:单片机晶振频率12MHz 则时钟周期=[1/(12*10^6)Hz]s=0.000000083s=0.000083ms=0.083us
  机器周期:单片机执行一条指令过程中需要完成一个基本操作(如:取指、译码、执行等基本操作)所需的时间 8051系列单片机的一个机器周期由6个S周期(状态周期)组成 一个时钟周期定义为一个节拍(用P表示) 二个节拍定义为一个状态周期(用S表示) 那么8051单片机的机器周期由6个状态周期组成 也就是说一个机器周期=6个状态周期=12个时钟周期=[12x[1/(12*10^6)Hz]s]s=0.000001s=0.001ms=1us
  指令周期:单片机取出一条指令且执行完这条指令所需的时间
  以上三者间的关系:指令周期>机器周期>时钟周期
  一、以下是8051单片机定时器用12分频计算定时器初值的一种计算公式(以单片机晶振频率为12MHz 定时器0工作模式为16位定时模式1 需要定时1ms来计算):
   0、计算nT单片机机器周期T公式:T=n*(1/晶振频率)=几us
   1、一个机器周期=12个时钟周期=12乘以单片机晶振频率的倒数=12*[1/(12*10^6)Hz]s=0.000001s=0.001ms=1us
   2、定时时间=定时计数*一个机器周期 1ms=定时计数*1us 定时计数=1ms/1us=1000us/1us=1000次
   3、定时器初值(定时计数初值)=2^n-定时计数 n为几位定时器 此处n=16 则定时器初值(定时计数初值)=2^16-1000=65536-1000=64536 把64536转化成十六进制 拆开成高八位和低八位 高八位放TH0=0xfc或(65536-64536)/256 低八位放TL0=0x18或(65536-64536)%256
  二、以下是8051单片机定时器用12分频或不分频计算定时器初值的另外一种计算公式(以单片机晶振频率为12MHz 定时器0工作模式为16位定时模式1 需要定时1ms来计算):
  (一)、以下是8051单片机定时器用12分频计算定时器初值:
   定时器初值(定时计数初值)=2^n-(晶振频率/几分频/定时频率) n为几位定时器 该公式常用于脉冲宽度调制中运算 例如:利用8051系列单片机晶振频率为12MHz的定时器0的16位定时模式1来产生1KHz方波脉冲(相当于定时1ms) 由此可知:定时时间=1/定时频率=1/1000Hz=0.001s=1ms=1000us 进而可得:定时器初值(定时计数初值)=2^n-(晶振频率/几分频/定时频率)=2^16-(12MHz/12/1KHz)=2^16-(12*10^6)Hz/12/1000Hz)=65536-1000=64536 把64536转化成十六进制 拆开成高八位和低八位 高八位放TH0=0xfc或(65536-64536)/256或Value >> 8 低八位放TL0=0x18或(65536-64536)%256或=Value 
  (二)、以下是8051单片机定时器不用分频计算定时器初值:
  定时器初值(定时计数初值)=2^n-(晶振频率/几分频/定时频率) n为几位定时器 该公式常用于脉冲宽度调制中运算 例如:利用8051系列单片机晶振频率为12MHz的定时器0的16位定时模式1来产生1KHz方波脉冲(相当于定时1ms) 由此可知:定时时间=1/定时频率=1/1000Hz=0.001s=1ms=1000us 进而可得:定时器初值(定时计数初值)=2^n-(晶振频率/几分频/定时频率)=2^16-(12MHz/1/1KHz)=2^16-(12*10^6)Hz/1/1000Hz)=65536-12000=53536 把53536转化成十六进制 拆开成高八位和低八位 高八位放TH0=0xd1或(65536-53536)/256或Value >> 8 低八位放TL0=0x20或(65536-53536)%256或=Value
  (三)、TH0 = Value >> 8;TL0 = Value;该两句代码解释如下:
     1、TH0 = Value >> 8相当于TH0 = (65536-10000)/256=55536/256=216.9375 分析:65536-10000=55536转化成二进制为11011000 11110000 55536/256=216.9375转化成二进制为11011000 由此可看出Value为(65536-10000)=55536的二进制数11011000 11110000右移8位就可以得到55536/256=216.9375的二进制数11011000
     2、TL0 = Value相当于TL0 = (65536-10000)%256=55536%256=240 分析:65536-10000=55536转化成二进制为11011000 11110000 55536%256=240转化成二进制为11110000 由此可看出Value为(65536-10000)=55536的二进制数11011000 11110000取低8位就可以得到55536%256=240的二进制数11110000
  ****/
  void Timer0Init(void)//定时器0的16位定时模式1用12分频定时1ms初始化函数 晶振为12MHz
 {
   AUXR &= 0x7f;//设定定时器/计数器为12分频
   TMOD &= 0xf0;//设定定时器/计数器工作模式清0
   TMOD |= 0x01;//设定定时器/计数器为定时器 工作模式为16位定时器0模式1
   TH0 = 0xfc;//设定定时器0高8位初值 
   TL0 = 0x18;//设定定时器0低8位初值
   TF0 = 0;//定时器0溢出中断标志位清0
   ET0 = 1;//打开定时器中断开关
   EA = 1;//打开定时器中断总开关
   TR0 = 1//打开定时器0开关
  } 
  void Timer0(void) interrupt 1//定时器0定时1ms中断函数 晶振为12MHz
 {
   TR0 = 0;//关定时器0开关
   NixieTubeDisplayData();//数码管显示数据函数
   TH0 = 0xfc;//设定定时器0高8位初值
   TL0 = 0x18;//设定定时器0低8位初值
   TR0 = 1;//开定时器0开关
  }

你可能感兴趣的:(c语言,单片机)