📄 c.c
字号:
//本程序演示在P1.3输出0~5V的电压
#include<REG51.H>
sfr AUXR=0x8E;//辅助寄存器
sfr BRT=0x9C;//独立波特率发生器
sfr CCON=0xD8;
sfr CMOD=0xD9;//PCA模式寄存器
sfr CL=0xE9;
sfr CH=0xF9;
sfr CCAP0L=0xEA;
sfr CCAP0H=0xFA;
sfr CCAPM0=0xDA;//比较/捕获模块寄存器
sfr CCAPM1=0xDB;
sbit CR=0xDE;
void init_pwm()
{
CMOD=0x04;//脉宽调制输入时钟为定时器0的溢出率
CH=0x00;
CL=0x00;
CCAP0L=0xCC;//占空比为C0/100=10%
CCAP0H=0xCC;
CCAPM0=0x42;//8位脉宽调制,无中断
AUXR=AUXR|0x80;//定时器0以1T方式工作
TMOD=0x02;//定时器0以方式2工作
TH0=240;//输出矩形波频率=晶振频率/256/(256-240)
TL0=240;
TR0=1;//定时器0开始工作
CR=1;//CCP0开始工作
}
void init_rs232()
{
AUXR=AUXR|0x01;//串口1使用独立波特率发生器
SCON=0x50;//串口以方式1工作
BRT=230;//波特率=晶振频率/12/32/(256-BRT)
ES=0;//禁止串口中断
AUXR=AUXR|0x10;//BRT开始工作
}
void send_byte(unsigned char x)//发送一个字节
{
TI=0;
SBUF=x;
while(!TI)
;
TI=0;
}
void main()
{
unsigned int vc;//以整数表示的电压值
float vf;//以浮点表示的电压值
init_pwm();//初始化脉宽调制
init_rs232();//初始化串口
while(1)
{
while(!RI)//等待串口接收字节
;
CCAP0H=0xFF-SBUF;//CCAP0H的值越大,占空比越小
RI=0;
vf=1.0*(0xFF-CCAP0H)/0xFF*5;//根据占空比,换算出电压值
vc=100*vf;//扩大100倍,转换为整数
send_byte(0x30+vc/100);//通过串口发送变量vc,格式为“X.XXV ”
send_byte('.');
send_byte(0x30+vc%100/10);
send_byte(0x30+vc%10);
send_byte('V');
send_byte(' ');
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -