STM8S REX_C900温控器硬件

开发环境:IAR for stm8 v6.5.3
*硬件平台:STM8S005K6T6 REX-C900温控

*功能说明:本例程,利用定时_TIM3中断定时。

代码如下:

#include<iostm8s005k6.h>
#include<stdbool.h>
unsigned  char  BCD_led[9]={0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00};          //显示缓存区。8_数码段。+1_LED状态输出指示段。
unsigned char  lab[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xd8,0x80,0x90};    //0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F
unsigned  char   *p=BCD_led,smm=0,s1=0;
bool lii=0;
void TIM3_Config(void)
{
CLK_PCKENR1 |= 0x40;               //打开外设时钟源TIM2.
asm("rim");
while(!(CLK_PCKENR1 & 0x01));     //这些具体数据,一定要看数据手册!
TIM3_CR1 = 0x00;
TIM3_PSCR = 0x08;                 //16/2^4
TIM3_ARRH = 0x00;
TIM3_ARRL = 0x08;                 //重装值
TIM3_CNTRH = 0x00;
TIM3_CNTRL = 0x00;                //计数器
TIM3_IER = 0x01;                  //开更新中断
TIM3_CR1 = 0x01;                  //定时器使能
}
void adc_int()                 //初始化A/D模块

  ADC_CR2 = 0x00;             // A/D结果数据左对齐
  ADC_CR1 = 0x00;             // ADC时钟=主时钟/2=1MHZ,ADC转换模式=单次,禁止ADC转换
  ADC_CSR = 0x0c;             // 选择通道12
  ADC_TDRL = 0x20;            
}
void adc_data()
{
  unsigned int a;
  ADC_CR1 = 0x01;                 // CR1寄存器的最低位置1,使能ADC转换
  for(a=0;a<200;a++);             // 延时一段时间,至少7uS,保证ADC模块的上电完成
  ADC_CR1 = ADC_CR1 | 0x01;       // 再次将CR1寄存器的最低位置1,使能ADC转换
  while((ADC_CSR & 0x80) == 0);  // 等待ADC结束
  a= ADC_DRH*4;            // 读出ADC结果的高8位
  a = (a + (ADC_DRL&0x03))*5;
  BCD_led[3]=lab[a/1000];
  BCD_led[2]=lab[a%1000/100];
  BCD_led[1]=lab[a%1000%100/10]; 
  BCD_led[0]=lab[a%1000%100%10];
  BCD_led[7]=BCD_led[3];
  BCD_led[6]=BCD_led[2];
  BCD_led[5]=BCD_led[1];
  BCD_led[4]=BCD_led[0];
}
void ioint(void)
{
  PB_DDR|=0x07;
  PB_CR1|=0x07;
  PC_DDR|=0xfc;
  PC_CR1|=0xfc;
  PD_DDR|=0x9e;
  PD_CR1|=0x9e;
  PA_DDR|=0x06;
  PA_CR1|=0x06;
}
void led_dsp(unsigned char sm)
{
 PC_ODR_ODR3=sm&0x01;                                      //BCD段码:a 0;DOWN
 PC_ODR_ODR4=(sm>>1)&0x01;                                 //BCD段码:b 1;
 PD_ODR_ODR4=(sm>>2)&0x01;                                 //BCD段码:c 2;
 PC_ODR_ODR7=(sm>>3)&0x01;                                 //BCD段码:d 3;
 PC_ODR_ODR2=(sm>>4)&0x01;                                 //BCD段码:e 4;
 PD_ODR_ODR2=(sm>>5)&0x01;                                 //BCD段码:f 5;
 PD_ODR_ODR3=(sm>>6)&0x01;                                 //BCD段码:G 6;
 PC_ODR_ODR5=(sm>>7)&0x01;                                 //BCD段码:P 7;HIGH小数点。 
}
void led_dsp2(unsigned char sm)
 {
  PA_ODR_ODR1=sm&0x01;
  PB_ODR_ODR2=(sm>>1)&0x01;
  PD_ODR_ODR1=(sm>>2)&0x01;
  PB_ODR_ODR1=(sm>>3)&0x01;
  }
void led(unsigned char ase)
{
  switch(ase)
  {
  case 1:
    PB_ODR_ODR2=1;
    led_dsp(*p);               //0;
    break;
  case 2:
    PB_ODR_ODR2=0;
    led_dsp(*(p+1));            //1;
    PB_ODR_ODR0=1;
    break;
  case 3:
    PB_ODR_ODR0=0;
    led_dsp(*(p+2));            //2;
    PC_ODR_ODR6=1;
    break;
  case 4:
     PC_ODR_ODR6=0;
     led_dsp(*(p+3));            //3;
     PD_ODR_ODR1=1;
     break;
  case 5:
     PD_ODR_ODR1=0;
     led_dsp(*(p+4));           //4;
     PB_ODR_ODR1=1;
     break;
  case 6:
     PB_ODR_ODR1=0;
     led_dsp(*(p+5));           //5;
     PA_ODR_ODR2=1;
     break;
  case 7:
     PA_ODR_ODR2=0;
     led_dsp(*(p+6));          //6;
     PD_ODR_ODR7=1;
     break;
  case 8:
     PD_ODR_ODR7=0;
     led_dsp(*(p+7));         //7;
     PA_ODR_ODR1=1; 
     break;
  case 9: 
     PA_ODR_ODR1=0;          //8;OUT_AT_ALM1_ALM2
     led_dsp(0xff);
     PC_ODR_ODR5=0;
     led_dsp2(*(p+8));
     break;
  default:
     PC_ODR_ODR5=1;
     led_dsp2(0x00);
     smm=0;
     s1++;
     if(s1==100)
      {
       lii^=1;
       if(lii==1)
       BCD_led[8]=0x00;
       else
       BCD_led[8]=0x0f;
       s1=0;
       adc_data();
      }
     break;  
  }
}
void main(void)
{
 ioint();
 adc_int();
 TIM3_Config();
 while(1); 
}
#pragma vector = TIM3_OVR_UIF_vector//中断服务函数,此地址在头文件里可以找到
__interrupt void TIM3_Int(void)
{
  smm++;
  led(smm);
  TIM2_SR1 = 0x00;//清除标志位,如果是没有TIM2_SR2的,直接是TIM2_SR = 0x00

}

以上在硬件上已经跑过,完全正常。

更多的关于本硬件的其它原码已压缩打包请点:http://download.csdn.net/download/hlala/10257147

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
代码 ADC BEEP TIM2 TIM3 TIM4 EPPROM 直接寄存器操作 /**************************************************************************************** *开发环境:IAR for stm8 v6.5.3 *硬件平台:STM8S005K6T6 REX-C900温控 *功能说明:本例程,利用定时_TIM2中断定时。 *作 者:刘拥军 ****************************************************************************************/ #include<iostm8s005k6.h> #include<stdbool.h> unsigned char BCD_led[9]={0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00}; //显示缓存区。8_数码段。+1_LED状态输出指示段。 unsigned char lab[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xd8,0x80,0x90}; //0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F unsigned char *p=BCD_led,smm=0,s1=0; bool lii=0; void TIM3_Config(void) { CLK_PCKENR1 |= 0x40; //打开外设时钟源TIM2. asm("rim"); while(!(CLK_PCKENR1 & 0x01)); //这些具体数据,一定要看数据手册! TIM3_CR1 = 0x00; TIM3_PSCR = 0x08; //16/2^4 TIM3_ARRH = 0x00; TIM3_ARRL = 0x08; //重装值 TIM3_CNTRH = 0x00; TIM3_CNTRL = 0x00; //计数器 TIM3_IER = 0x01; //开更新中断 TIM3_CR1 = 0x01; //定时器使能 } void adc_int() //初始化A/D模块 { ADC_CR2 = 0x00; // A/D结果数据左对齐 ADC_CR1 = 0x00; // ADC时钟=主时钟/2=1MHZ,ADC转换模式=单次,禁止ADC转换 ADC_CSR = 0x0c; // 选择通道12 ADC_TDRL = 0x20; } void adc_data() { unsigned int a; ADC_CR1 = 0x01; // CR1寄存器的最低位置1,使能ADC转换 for(a=0;a<200;a++); // 延时一段时间,至少7uS,保证ADC模块的上电完成 ADC_CR1 = ADC_CR1 | 0x01; // 再次将CR1寄存器的最低位置1,使能ADC转换 while((ADC_CSR & 0x80) == 0); // 等待ADC结束 a= ADC_DRH*4; // 读出ADC结果的高8位 a = (a + (ADC_DRL&0x03;))*5; ............................................................... ................................................................ ................................................................
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值