现在的位置: 首页 > 综合 > 正文

PIC16F877A定时器的学习

2018年03月16日 ⁄ 综合 ⁄ 共 1760字 ⁄ 字号 评论关闭

由于实时数据的仿真需要用到定时器产生数据,今天晚上完成PIC16F877A产生正弦波形,并将波形数据发送到上位机!

这是一个三角波的仿真程序,并通过串口发送到上位机

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

#include "main.h"
#include "t232.h"
#include "lcd.h"
#include "timer.h"

//define global variable

bank1 uchar flag =0 ;//利用flag判断中断时间是否到了!
bank1 char dat[6] ;

bank2 char str[]="shan dong qing gong ye xue yuan" ;
bank2 char str1[]="Starting........" ;
bank2 char str2[]="Capturing......." ;
bank2 char str3[]="Stop.........." ;
//bank2 float test = 0;
//bank2 float t1 ;
bank2 uchar t1 =0 ;
bank2 uchar t2=0 ;
bank1 uchar state = READY ;//当前状态
bank1 uchar frame[3] ;//帧缓冲
bank1 uchar temp ;
//ms级延时程序
void DelayMS(uint ms){
    uint i;
    while(ms--){
        for(i=0;i<100;i++);
    }
}

//10us级延时程序
void Delay10US(uint us){
  uchar i;
  for(i=0;i<us;i++);
}
void interrupt main_int()
{
 if(RCIE&&RCIF)
   {
     RCIF=0;
     if(OERR)
  {
         CREN=0;
         CREN=1;
        }
      else//不溢出,
        {
   temp=RCREG ;
//注意这里可以使用简单的IF语句,但为了扩展帧格式,使用switch语句
   switch(temp)
   {
    case '(':
     break ;
    case ')':
     break ;
    default:
     state=temp ;
   }
        }   
   }
 if(T0IF==1)
 {
  T0IF=0;//must clear zero manually
  flag=1 ;  
 }
}
void init_all()
{
 init_232() ;
 init_lcd() ;
 init_timer() ;
}
void main()
{
 
 init_all() ;

 while(1)
 {
  while((t1>=-20)&&(state==CAPTURE))
  {
   t1++ ;
   sprintf(dat,"(%d)",t1) ;
   send_str(dat) ;
   if(t1==20)
    break ;
  }
  while((t1<=20)&&(state==CAPTURE))
  {
   t1-- ;
   sprintf(dat,"(%d)",t1) ;
   send_str(dat) ;
   if(t1==-20)
    break ;
  }
  switch(state)
  {
   case READY :
    sendcmd(0x01) ;
    sendcmd(0x82) ;
    printlcd(str) ;
    lcd_shift(0,6) ;
    break ;
   case WAIT:
    sendcmd(0x01) ;
    sendcmd(0x82) ;
    printlcd(str1) ;
    break ;
   case CAPTURE:
    sendcmd(0x01) ;
    sendcmd(0x82) ;
    printlcd(str2) ;    
    break ;
   case END:
    sendcmd(0x01) ;
    sendcmd(0x80) ;
    printlcd(str3) ;
    delay_long() ;
    break ;
   default:
    break ;
  }
 }

 
}

抱歉!评论已关闭.