PIC16F877A单片机 我不想使用外部的石英晶振,怎样设置使用内部振荡器让单片机跑起来呢?
发布网友
发布时间:2022-05-05 06:51
我来回答
共1个回答
热心网友
时间:2023-10-13 21:08
给公司做一块电路板,通过定时器定时,但发现速度有点慢可能自动启用了内部RC振荡,可我怎么设都不能用外部晶振。芯片为PIC16F877A 晶振用的是4.194304M 两个启振电容为30P. 当中intnum计到20才为1秒 ,实际计算下来值为6刚好1秒。用示波器测晶振两个脚整个系统处于死状态。请各位老师指点一下我写的程序和教程上一样但延时出来的时间为什么不一样呢?是不是晶振一定要是4M的?
程序如下( 当中部分端口设置省略了但主要程序上传上来)
#include<pic.h>
__CONFIG(0x2f3e); //开HS高频振荡,看门狗开启
void init()
{ INTCON=0xc0;//总中断使能
PIE1=0x01;//打开定时器1
TMR1L=(65536-50000)%256;
TMR1H=(65536-50000)/256;//溢出时间为50ms
T1CON=0x21;//0010 0001 预分频为4倍
}
void interrupt time0()
{
TMR1IF=0;//中断标志必须软件清0
TMR1L=(65536-50000)%256;
TMR1H=(65536-50000)/256;//初值要重装
intnum++;
}
void main()
{
dksz(); //调用端口设置
init(); //定时器0初始
watch_init();//启动看门狗
while(1)
{
if(intnum==6)//刚好1秒 教程上20才为1秒不知为何有这么大出入
{
RA3=1; //红灯亮 RA2=0; //绿灯灭 RA1=0; //黄灯灭
}
}
解决方案:
#include<pic.h>
__CONFIG(0x3872); // HS, 关闭看门狗, LVP 关闭
void init()
{
ADCON1 = 0x06; // 关闭IO 端口摸拟功能
TRISA = 0x00;
TMR1L=(65536-50000)%256;
TMR1H=(65536-50000)/256;//溢出时间为50ms
T1CON=0x01;//0010 0001 预分频为1:1
INTCON=0xc0;//总中断使能
PIE1=0x01;//打开定时器1
}
void interrupt time0()
{
static char intnum = 0;
TMR1IF=0;//中断标志必须软件清0
TMR1L=(65536-50000)%256;
TMR1H=(65536-50000)/256;//初值要重装
if (++intnum == 20)
{
intnum = 0;
RA3 = ~RA3; // 输出取反测试
}
}
void main()
{
init(); //定时器0初始
while(1)
{
}
}
1, 定时器1, 单片机 工作为4M , 每个指令周期为1us , 分频要设置为1:1 分频.
2, 测试方法错误, 从单片机上电,到运行要一定的时间.追问答非所问!
热心网友
时间:2023-10-13 21:08
给公司做一块电路板,通过定时器定时,但发现速度有点慢可能自动启用了内部RC振荡,可我怎么设都不能用外部晶振。芯片为PIC16F877A 晶振用的是4.194304M 两个启振电容为30P. 当中intnum计到20才为1秒 ,实际计算下来值为6刚好1秒。用示波器测晶振两个脚整个系统处于死状态。请各位老师指点一下我写的程序和教程上一样但延时出来的时间为什么不一样呢?是不是晶振一定要是4M的?
程序如下( 当中部分端口设置省略了但主要程序上传上来)
#include<pic.h>
__CONFIG(0x2f3e); //开HS高频振荡,看门狗开启
void init()
{ INTCON=0xc0;//总中断使能
PIE1=0x01;//打开定时器1
TMR1L=(65536-50000)%256;
TMR1H=(65536-50000)/256;//溢出时间为50ms
T1CON=0x21;//0010 0001 预分频为4倍
}
void interrupt time0()
{
TMR1IF=0;//中断标志必须软件清0
TMR1L=(65536-50000)%256;
TMR1H=(65536-50000)/256;//初值要重装
intnum++;
}
void main()
{
dksz(); //调用端口设置
init(); //定时器0初始
watch_init();//启动看门狗
while(1)
{
if(intnum==6)//刚好1秒 教程上20才为1秒不知为何有这么大出入
{
RA3=1; //红灯亮 RA2=0; //绿灯灭 RA1=0; //黄灯灭
}
}
解决方案:
#include<pic.h>
__CONFIG(0x3872); // HS, 关闭看门狗, LVP 关闭
void init()
{
ADCON1 = 0x06; // 关闭IO 端口摸拟功能
TRISA = 0x00;
TMR1L=(65536-50000)%256;
TMR1H=(65536-50000)/256;//溢出时间为50ms
T1CON=0x01;//0010 0001 预分频为1:1
INTCON=0xc0;//总中断使能
PIE1=0x01;//打开定时器1
}
void interrupt time0()
{
static char intnum = 0;
TMR1IF=0;//中断标志必须软件清0
TMR1L=(65536-50000)%256;
TMR1H=(65536-50000)/256;//初值要重装
if (++intnum == 20)
{
intnum = 0;
RA3 = ~RA3; // 输出取反测试
}
}
void main()
{
init(); //定时器0初始
while(1)
{
}
}
1, 定时器1, 单片机 工作为4M , 每个指令周期为1us , 分频要设置为1:1 分频.
2, 测试方法错误, 从单片机上电,到运行要一定的时间.追问答非所问!