找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1011|回复: 3
打印 上一主题 下一主题
收起左侧

PIC16F917单片机加入定时器后,主函数不能运行!

[复制链接]
跳转到指定楼层
楼主
ID:81163 发表于 2019-8-21 12:45 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
求教高手,PIC16F917,没加定时器时主函数里的按键和监测函数运行都是正常的,然后增加一个定时器做个蜂鸣器报警功能!结果主函数就运行了,后面再屏蔽掉定时器,主函数照样不运行!!不知道是怎么回事!求高手帮忙看看!
#include<pic.h>
#define uchar unsigned char
#define uint  unsigned int
#define        low        RD0                                
#define        lbt RD3                                
#define        high RD2                        
#define flt RD4                                
#define spk RD5                                
#define mot RD6                                
#define ctr RD7                                
#define        keyin RB0                        

const uint data[2]={64722,64436};                        //蜂鸣器频率

uint mode=0,lednum;
uint count=0;
uint vba,isp,k,t,flagb,flagf,jcout,i,p,j,s;

__CONFIG(0x30F5);

void delay(uint x);
void init();
uint get_ad(uchar y);
void monitor();
void key_scan();
void sentchar(uchar data1);
void printcom(const uchar *dat);
void printdata(uint dat);
uint filter();
void speakf();
void speakb();
//void interrupt time1();

void main()
{
        init();
        while(1)
        {
               RD1=!RD1;
                k++;
        //        s++;
                if(k==1000)
                {
                        k=0;
                        monitor();
                }
                if(s>=1000)
                {
                        s=0;
                        RD4=!RD4;
                        TMR1ON=!TMR1ON;
                }
                key_scan();
        }
        
        

}
void delay(uint x){--------}
void init()                                        //初始化:4MHZ,AD, PWM,uart,定时器012
{
        OSCCON=0x67;        
        TRISA=0x0f;
        TRISB=0x01;
        TRISC=0xc0;
        TRISD=0;
        PORTA=0;
        PORTB=0;
        PORTC=0;
        PORTD=0xE1;
        TXSTA=0x24;
        RCSTA=0x90;
        SPBRG=25;        
        RCIE=1;

        
        ANSEL=0x28;
        ADIE=1;
        ADCON0=0x05;
        ADCON1=0x9e;
        
        OPTION=0X07;
        TMR0=61;
        T0IE=1;
        INTCON=0xa0;
        GIE=1;
        PEIE=1;
        PIE1=0X03;
        T2CON=0X1C;
        TMR2IE=0;
        CCPR1L=0x5b;                        //C8
        CCP1CON=0x0C;
        TMR2=0;
        PR2=0x7C;
        T1CON=0x01;
        TMR1L=(65536-200)%256;
        TMR1H=(65536-200)/256;
        delay(10);
        T1CON=0X01;        
        PORTD=0x81;
}
uint get_ad(uchar y){----------}
void monitor(){----监测电池电压和总电流--}
void key_scan(){---一键开关机+功能切换----}
void sentchar(uchar data1){---串口----}
void printcom(const uchar *dat){        ---串口------}
void printdata(uint dat){---串口----}
void interrupt time1()
{
        if(TMR1IE&&TMR1IF)               
        {
               
                p=data[jcout];
                TMR1IF=0;
                TMR1L=p%256;
                TMR1H=p/256;
                spk=!spk;         
                s++;
        //        printdata(s);
        }
}
uint filter(){----ADC平均值-----}
void speakf() {-------}
void speakb(){------}


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:81163 发表于 2019-8-22 12:26 | 只看该作者
没人??
回复

使用道具 举报

板凳
ID:401564 发表于 2019-8-22 20:15 | 只看该作者
C不会,看不懂
但PIC用过
PIC的中断和8051的中断机制是不一样的,PIC的中断入口只有一个,就是说不管你是ADC的中断还是定时器中断或者是外部,都会使程序进入中断,然后,在进入中断之后再通过查询中断标志位来确定是什么中断
8051就不一样,对应的中断有对应的入口。
如果你开启了ADC的中断的话,进入中断函数就得先查询是ADC触发的中断还是定时器触发的中断,然后,再进行处理
回复

使用道具 举报

地板
ID:81163 发表于 2019-8-23 09:58 | 只看该作者
Y_G_G 发表于 2019-8-22 20:15
C不会,看不懂
但PIC用过
PIC的中断和8051的中断机制是不一样的,PIC的中断入口只有一个,就是说不管你是 ...

谢谢!我只开了定时器的中断,ADC等其他的中断都没开!测试出主函数运行了892次,期间定时器1运行了大约80多次,然后程序就飞了,主程序不再运行,定时器1一直不停的重复!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表