|
大家好 我是一位在校学生 有两个程序出现了问题 询问老师也没有解决方法
所以请各位大大帮下忙
第一个函数 为计时器 每一秒 pic都会向电脑发送时间
如
00:00
00:01
00:02
00:03
用timer1来计时
当发生中断时候 数值加1
第二个函数为两部分组成
1 在AN0 接收电压
电压 若为 0到 四分之一电压 则 RB0=1
电压 若为 四分之一电压到 四分之二电压 则 RB0=1 RB1=1
电压 若为 四分之二电压到 四分之三电压 则 RB0=1 RB1=1 RB2=1
电压 若为 四分之三电压到 四分之四电压 则 RB0=1 RB1=1 RB2=1 RB3=1
2加入timer0
timer0只有发生中断时
RB的门 才会显示电压
#include "configurations_bits.h"
#define _XTAL_FREQ 4000000
void envoie (char nb); // 发送函数
void cal(char nb); // 将数字转化为时间
char sec=0,min=0; // 表面变量 sec为秒 min为分钟
bit c=0;
void timer1(void); //timer1
void main (void)
{
timer1();// 调用TIMER1
SPBRG=25; //设定串联传输
TXSTA=0x26;
RCSTA=0x90;
BAUDCTL=0x00;
GIE=1; //允许中断
PEIE=1;
TMR1IE=1;
while(1)
{
if(c==2) // 使用2x500ms 来获得1S的周期
{
cal(min); // 处理数字并发送
envoie(0x3A); 发送 :
cal(sec); //处理数字并发送
envoie(0x0D);//换行
envoie(0x0A);
sec++;// 计数
if(sec==60) //如果秒等于60 归零
{
sec=0;
min=min+1;
if(min==60)
{
min=0;
}
}
c=0; //归零
}
}
}
void envoie (char nb) //发送程序
{
TXREG=nb;
while (TRMT==0);
}
void cal(char nb) //处理并发送的·函数
{
short int a,b;
a=nb/10;
b=nb-a*10;
envoie(a+0x30);
envoie(b+0x30);
}
void timer1(void) // 设定TIMER1周期500ms
{
T1CON=0x31;
TMR1L=0xDC;
TMR1H=0x0B;
TMR1IF=0;
}
void interrupt interruption (void) //中断程序
{
if(TMR1IF==1)
{
c=c+1;
TMR1L=0xDC;
TMR1H=0x0B;
TMR1IF=0;
}
}
#include "configurations_bits.h"
#define _XTAL_FREQ 4000000
void confi_can ();
void confi_port();
char can ();
bit valide=0;
void timer0 ();
void interrupt inter ();
void interrupt inter () // 中断程序
{
if(T0IF==1) // 中断
{
TMR0=0; //重制 timer0
T0IF=0;
valide=1; // 决定值
}
}
void main ()
{
char a;
confi_can (); //设定can的寄存器
confi_port(); //设定要用的门
GIE=1; // 允许中断
PEIE=1;
ADIE=1;
T0IE=1;
timer0 (); //timer0
while(1)
{
if(valide==1) // 中断后启动if函数
{
a = can(); 将can所获得的值赋予a // 显示电压
if((0<a)&&(a<=63))
{
PORTB=0x01;
}
if((63<a)&&(a<=127))
{
PORTB=0x03;
}
if((127<a)&&(a<=191))
{
PORTB=0x07;
}
if((191<a)&&(a<=255))
{
PORTB=0x0f;
}
valide=0; // 重置
}
}
}
void confi_can ()
{
ADCON0=0b01000001; //已AN0为模拟电位入口
ADCON1=0b00000000;
ANSEL=0b00000001;
ANSELH=0b0000000;
}
void confi_port() // B门 0 1 2 3 为出口 连接着led
{
TRISA=0x01; // AN0对应A0 所以设定A0为入口
PORTA= 0x00;
TRISB=0xF0;
PORTB=0x00;
}
char can () // can模块函数
{
GO = 1;
while(ADIF==0);
ADIF==0;
return(ADRESH);
}
void timer0 () //timer0 函数
{
OPTION_REG=0b10000111;
TMR0=0;
T0IF=0;
}
出现的问题
第一个函数 pic只会发送一个 16位 数值为86 的东西 然后 停下
第二个函数 连接在RB0 1 2 3 的灯根本不会亮。。。
|
|