標(biāo)題:
關(guān)于pic單片機(jī)的2個(gè)程序出現(xiàn)問(wèn)題,連老師都無(wú)法解決
[打印本頁(yè)]
作者:
何梓銘
時(shí)間:
2018-5-25 13:10
標(biāo)題:
關(guān)于pic單片機(jī)的2個(gè)程序出現(xiàn)問(wèn)題,連老師都無(wú)法解決
大家好 我是一位在校學(xué)生 有兩個(gè)程序出現(xiàn)了問(wèn)題 詢問(wèn)老師也沒(méi)有解決方法
所以請(qǐng)各位大大幫下忙
第一個(gè)函數(shù) 為計(jì)時(shí)器 每一秒 pic都會(huì)向電腦發(fā)送時(shí)間
如
00:00
00:01
00:02
00:03
用timer1來(lái)計(jì)時(shí)
當(dāng)發(fā)生中斷時(shí)候 數(shù)值加1
第二個(gè)函數(shù)為兩部分組成
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只有發(fā)生中斷時(shí)
RB的門(mén) 才會(huì)顯示電壓
#include "configurations_bits.h"
#define _XTAL_FREQ 4000000
void envoie (char nb); // 發(fā)送函數(shù)
void cal(char nb); // 將數(shù)字轉(zhuǎn)化為時(shí)間
char sec=0,min=0; // 表面變量 sec為秒 min為分鐘
bit c=0;
void timer1(void); //timer1
void main (void)
{
timer1();// 調(diào)用TIMER1
SPBRG=25; //設(shè)定串聯(lián)傳輸
TXSTA=0x26;
RCSTA=0x90;
BAUDCTL=0x00;
GIE=1; //允許中斷
PEIE=1;
TMR1IE=1;
while(1)
{
if(c==2) // 使用2x500ms 來(lái)獲得1S的周期
{
cal(min); // 處理數(shù)字并發(fā)送
envoie(0x3A); 發(fā)送 :
cal(sec); //處理數(shù)字并發(fā)送
envoie(0x0D);//換行
envoie(0x0A);
sec++;// 計(jì)數(shù)
if(sec==60) //如果秒等于60 歸零
{
sec=0;
min=min+1;
if(min==60)
{
min=0;
}
}
c=0; //歸零
}
}
}
void envoie (char nb) //發(fā)送程序
{
TXREG=nb;
while (TRMT==0);
}
void cal(char nb) //處理并發(fā)送的·函數(shù)
{
short int a,b;
a=nb/10;
b=nb-a*10;
envoie(a+0x30);
envoie(b+0x30);
}
void timer1(void) // 設(shè)定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 (); //設(shè)定can的寄存器
confi_port(); //設(shè)定要用的門(mén)
GIE=1; // 允許中斷
PEIE=1;
ADIE=1;
T0IE=1;
timer0 (); //timer0
while(1)
{
if(valide==1) // 中斷后啟動(dòng)if函數(shù)
{
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門(mén) 0 1 2 3 為出口 連接著led
{
TRISA=0x01; // AN0對(duì)應(yīng)A0 所以設(shè)定A0為入口
PORTA= 0x00;
TRISB=0xF0;
PORTB=0x00;
}
char can () // can模塊函數(shù)
{
GO = 1;
while(ADIF==0);
ADIF==0;
return(ADRESH);
}
void timer0 () //timer0 函數(shù)
{
OPTION_REG=0b10000111;
TMR0=0;
T0IF=0;
}
出現(xiàn)的問(wèn)題
第一個(gè)函數(shù) pic只會(huì)發(fā)送一個(gè) 16位 數(shù)值為86 的東西 然后 停下
第二個(gè)函數(shù) 連接在RB0 1 2 3 的燈根本不會(huì)亮。。。
作者:
zl2168
時(shí)間:
2018-5-26 18:57
老師也沒(méi)有解決方法有兩種可能:一是老師水平較低;二是老師沒(méi)有空或不耐煩。大學(xué)生應(yīng)該以自學(xué)為主,越好的大學(xué)老師講得越少越簡(jiǎn)單,越差的大學(xué)老師講得越多越詳細(xì)。
作者:
xa108262
時(shí)間:
2018-5-26 21:48
第一個(gè)函數(shù): 請(qǐng)檢查你的串口接線,注意,單片機(jī)的tx接電腦的rx,同時(shí),看下串口調(diào)試軟件的串口號(hào)是否正確
第二個(gè)函數(shù):可以在線看下,是不是模數(shù)轉(zhuǎn)換那里配置有問(wèn)題,導(dǎo)致while(ADIF==0);死住,出不來(lái)了
僅供參考
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1