📄 serial9600.c
字号:
#include <pic16f7x.h>
void usart_init();
void ad_init();
void long_delay();
void delay();
void ad();
unsigned int data[2];
unsigned int count = 0;
unsigned int flag = 0;
unsigned int start = 0;
unsigned int k = 0;
/*************************************************/
//主程序
void main()
{
usart_init(); //调用串口初始化
ad_init(); //调用AD初始化
TRISB = 0xFC; //RB0&1输出
data[1] = 0;
while (1)
//主循环
{
PORTB = 0x01; //空闲
while (start)
{
long_delay();
ad();
}
}
}
/*************************************************/
//串口初始化
void usart_init()
{
TRISC = 0xFF; //设置C口方向全为输入
RCSTA = 0x90; //使能串口工作,连续接收
TXSTA = 0x24; //设定TXSTA寄存器。
SPBRG = 0x19; //4MHZ, BRGH=1, 9600BPS
INTCON = 0xC0; //开放全局中断,使能外部中断
RCIE = 0x1; //使能USART接收中断
}
/*************************************************/
//ad模块初始化
void ad_init()
{
TRISA = 0x01; //设置RA0为输入,其他为输出
ADCON1 = 0x02; //转换结果左对齐,RA0做模拟输入口,其它做普通I/O
ADCON0 = 0x41; //系统时钟Fosc/8,选择RA0通道,允许ADC工作
delay(); //等待一段时间(a/d采样)
}
/*************************************************/
//ad转换子程序
void ad()
{
PORTB = 0x03; //正在转换
ADGO = 0x1; //开启转换过程
while (ADGO)
//等待转换完成
TXREG = ADRES;
//发送转换结果
}
/*************************************************/
//串口接收中断处理
void interrupt usart()
{
if (RCIE && RCIF)
//判断是否为串口接收中断
{
data[k] = RCREG; //保存接收到的数据
k+=1;
if (k > 1)
{
k = 0;
flag = 1;
}
while (flag)
{
flag = 0;
if (data[0] == 0x07)
start = 0x1;
if (data[0] == 0x09)
start = 0x0;
}
}
}
/*************************************************/
//短延时程序
void delay() //延时程序
{
unsigned int d = 100;
while (--d)
{
;
}
}
/*************************************************/
//长延时程序
void long_delay()
{
if (data[1] != 0)
{
count = data[1];
while (--count)
delay();
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -