|
大家好 我是一位在校學生 有兩個程序出現了問題 詢問老師也沒有解決方法
所以請各位大大幫下忙
第一個函數 為計時器 每一秒 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 的燈根本不會亮。。。
|
|