简易数字频率计电路图源码 proteus c语言
时间: 2023-07-23 08:02:52 浏览: 143
简易数字频率计电路图
### 回答1:
下面是一个使用 Proteus 软件实现的简易数字频率计电路图和源码:
电路图如下:
![电路图](https://i.imgur.com/mnFQz2R.png)
源码如下:
```c
#include <reg51.h>
// 定义 LCD1602 使用的 IO 口
sbit rs = P2^0;
sbit rw = P2^1;
sbit enable = P2^2;
// 定义 ADC0804 使用的 IO 口
sbit start_conversion = P3^7;
sbit output_enable = P3^6;
sbit interrupt = P3^5;
sbit clock = P3^4;
sbit address_bit0 = P3^3;
sbit address_bit1 = P3^2;
sbit address_bit2 = P3^1;
sbit address_bit3 = P3^0;
unsigned int count = 0;
unsigned char frequency[4];
void delay() {
unsigned int i;
for(i = 0; i < 60000; i++);
}
void lcd_command(unsigned char command) {
rs = 0;
rw = 0;
P0 = command;
enable = 1;
delay();
enable = 0;
}
void lcd_data(unsigned char data) {
rs = 1;
rw = 0;
P0 = data;
enable = 1;
delay();
enable = 0;
}
void lcd_init() {
lcd_command(0x38);
lcd_command(0x0C);
lcd_command(0x06);
lcd_command(0x01);
}
void lcd_print(unsigned char line, unsigned char data[]) {
unsigned int i;
lcd_command(line);
for(i = 0; i < 4; i++) {
if(data[i] != 0xFF) {
lcd_data(data[i]);
}
}
}
void adc_init() {
start_conversion = 0;
output_enable = 1;
interrupt = 0;
}
unsigned char read_adc() {
unsigned char data;
address_bit0 = 0;
address_bit1 = 0;
address_bit2 = 0;
address_bit3 = 0;
start_conversion = 1;
delay();
start_conversion = 0;
address_bit0 = 0;
address_bit1 = 0;
address_bit2 = 0;
address_bit3 = 1;
output_enable = 0;
clock = 1;
delay();
clock = 0;
delay();
data = P0;
output_enable = 1;
return data;
}
void timer0_init() {
TMOD = 0x01;
TH0 = 0xFC;
TL0 = 0x18;
ET0 = 1;
EA = 1;
TR0 = 1;
}
void timer0_isr() interrupt 1 {
count++;
TH0 = 0xFC;
TL0 = 0x18;
}
void main() {
lcd_init();
adc_init();
timer0_init();
while(1) {
if(count >= 10000) {
unsigned char i, j;
unsigned int f;
unsigned char freq_1, freq_2, freq_3, freq_4;
f = count * 10;
freq_1 = f / 1000;
freq_2 = (f % 1000) / 100;
freq_3 = (f % 100) / 10;
freq_4 = f % 10;
frequency[0] = freq_1 + 0x30;
frequency[1] = freq_2 + 0x30;
frequency[2] = freq_3 + 0x30;
frequency[3] = freq_4 + 0x30;
lcd_print(0x80, frequency);
count = 0;
}
}
}
```
说明:
该电路使用 ADC0804 将输入信号转换为数字信号,并通过定时器计算频率。然后将频率显示在 LCD1602 上。
### 回答2:
下面是一个简易数字频率计电路图的Protues仿真源代码:
```c
#include<reg51.h>
sbit IN=P2^0; //输入口定义
sbit RS=P2^6; //1602端口定义
sbit RW=P2^5;
sbit EN=P2^7;
void lcd_write_command(unsigned char command)
{
RS=0;
RW=0;
EN=1;
P0=command;
EN=0 ;
}
void lcd_write_data(unsigned char data1)
{
RS=1;
RW=0;
EN=1;
P0=data1;
EN=0;
}
void lcd_display_string(unsigned char x,unsigned char y,unsigned char *string)
{
unsigned char addr;
if(y==0)
addr=0x80+x;
else
addr=0x80+0x40+x;
lcd_write_command(addr);
while(*string!='\0')
{
lcd_write_data(*string);
string++;
}
}
void delay_ms(unsigned int ms) //延时函数,延时1ms
{
unsigned int i;
while(ms--)
{
for(i=0;i<110;i++);
}
}
void init_1602()
{
lcd_write_command(0x38); //2行,5*7点阵,8位数据接口
delay_ms(5);
lcd_write_command(0x0C); //开显示,无光标
delay_ms(5);
lcd_write_command(0x06); //写数据右移动,左移动光标不动
delay_ms(5);
lcd_write_command(0x01); //清屏幕
delay_ms(5);
}
void main(void)
{
unsigned char str[]="Freq: ";
unsigned int counter=0;
unsigned char freq_counter_str[5];
IN=1;
while(1)
{
IN=1;
while(IN);
counter++; //响应一次输入脉冲,计数器自增
lcd_display_string(0,0,str);
lcd_write_command(0x8D);
sprintf(freq_counter_str,"%05u",counter);
lcd_display_string(7,0,freq_counter_str);
delay_ms(60000); //等待1分钟
counter=0; //计数器清零
}
}
```
这段代码实现了一个简易的数字频率计算电路,使用Proteus进行仿真。在电路中,使用了P2^0作为输入口,表示输入脉冲信号。1602液晶屏使用了P2^6、P2^5和P2^7作为端口定义。在代码的主函数中,首先进行1602的初始化,然后在一个循环中检测到输入脉冲时,计数器自增,并显示在1602液晶屏上。使用sprintf函数将计数值转换为字符串,然后通过lcd_display_string函数在液晶屏上显示出来。最后,通过delay_ms函数等待1分钟,然后将计数器清零,继续循环。
### 回答3:
以下是在Proteus中使用C语言编写的简易数字频率计的电路图源码:
```c
#include <reg51.h>
sbit signal = P2^3; // 输入信号引脚
sbit led = P1^0; // 指示灯引脚
unsigned int count = 0; // 计数器
// 延时函数
void delay(unsigned int time) {
unsigned int i, j;
for(i = 0; i < time; i++) {
for(j = 0; j < 1275; j++);
}
}
// 外部中断0的中断服务程序
void external0_ISR() interrupt 0 {
count++; // 每次触发中断计数器加1
}
void main() {
TMOD = 0x01; // 定时器0工作在模式1(16位定时器)下
TH0 = 0xFC; // 设置定时器初值,用于500ms延时
TL0 = 0x66;
TR0 = 1; // 启动定时器0
EX0 = 1; // 使能外部中断0
IT0 = 1; // 设置外部中断0为上升沿触发方式
EA = 1; // 全局中断使能
while(1) {
if(count >= 2) { // 当计数器大于等于2时,表示4个脉冲信号出现,即频率大于2Hz
led = 1; // 点亮指示灯
count = 0; // 清零计数器
delay(200); // 延时200ms
led = 0; // 关闭指示灯
delay(200); // 延时200ms
}
}
}
```
在上述代码中,使用了外部中断0来接收输入信号的上升沿,并在中断服务程序中进行计数器的清零操作。如果计数器的值大于等于2,则表示输入信号的频率超过了2Hz,点亮指示灯,通过延时函数延时200ms后熄灭指示灯,再延时200ms。程序将不断循环执行以上操作,以实现简易的数字频率计功能。
阅读全文