要求:脉冲测量仪:利用MCS-51系统的T0和T1,测量脉冲周期和点空比,测量结果显示的LED或LCD显示器上。仿真说明1、在仿真图中,通过p32按键输入模拟脉冲(手动输入模拟)
2、也可将单刀双掷开关掷向脉冲一端,观察数值
LCD显示格式: 周期: xxxu HIGHT
占空比:xx% xxxu
(u表示单位us;
HIGHT表示高电平时间;
占空比=高电平时间/周期)
开发环境:protues7.8 keil
程序说明:
void delay(long num) 延时函数
void Interrupt_Init() 定时器中断设置
void w_data(uchar dat) 写数据
void w_cmd(uchar cmd) 写命令
void w_string(uchar addr_start,uchar *p) 发送字符串到LCD
void Init_LCD1602(void) 初始化1602LCD
void main() 主程序
void EXTI0 () interrupt 0 中断服务程序
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
源程序:(仅展示部分内容,全部需下载附件查看)
#include<reg52.h> #define uchar unsigned char #define uint unsigned int
sbit RS=P2^0; sbit RW=P2^1; sbit EN=P2^2; uchar count = 0; bit flag = 1; long PWM_PER; long Pwm_High; void delay(long num) { while(num--); }
void Interrupt_Init() { TMOD = 0x19; TH1 = 0; TL1 = 0; TH0 = 0; TL0 = 0; IT0 = 1; IT1 = 1; //TR0 = 1; EX0 = 1; EA = 1; }
void w_data(uchar dat) { RS=1; P0=dat; delay(500); EN=1; delay(500); EN=0; }
void w_cmd(uchar cmd) { RS=0; EN=0; P0=cmd; delay(500); EN=1; delay(500); EN=0; }
void w_string(uchar addr_start,uchar *p) { w_cmd(addr_start); while(*p!='\0') { w_data(*p++); } }
void Init_LCD1602(void) { RW=0; w_cmd(0x38); w_cmd(0x0C); w_cmd(0x06); w_cmd(0x01); w_cmd(0x0F); }
void main() { uint Pwm_percentage; Init_LCD1602(); Interrupt_Init(); w_string(0x80,"PER:"); w_string(0x80+9,"u"); w_string(0x80+11,"HIGHT"); w_string(0xc0,"DUT:"); w_string(0xc0+8,"%"); w_string(0xc0+15,"u");
while(1) {
if(flag) { w_cmd(0x84); w_data(0x30+PWM_PER/10000); w_data(0x30+PWM_PER%10000/1000); w_data(0x30+PWM_PER%1000/100); w_data(0x30+PWM_PER%100/10); w_data(0x30+PWM_PER%10);
w_cmd(0xC4); w_data(0x30+Pwm_percentage/100); w_data(0x30+Pwm_percentage%100/10); w_data(0x2e); w_data(0x30+Pwm_percentage%10); }
全部资料51hei下载地址:
protues仿真.zip
(49.5 KB, 下载次数: 63)
keil程序.zip
(34.83 KB, 下载次数: 57)
|