久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费
標題:
基于51單片機簡易波形發生器(代碼+proteus仿真圖)
[打印本頁]
作者:
shankmorder
時間:
2021-5-2 18:36
標題:
基于51單片機簡易波形發生器(代碼+proteus仿真圖)
分享一手簡易波形發生器的設計
#include <reg52.h>
#include <math.h>
typedef unsigned char u8;
typedef unsigned int u16;
#define ADDR1 0x2c //MAX517寫入地址
#define DataPort P0//定義端口
#define RS_CLR RS=0
#define RS_SET RS=1
#define RW_CLR RW=0
#define RW_SET RW=1
#define EN_CLR EN=0
#define EN_SET EN=1
sbit key_sin=P1^0;
sbit key_triangle=P1^1;
sbit key_square=P1^2;
sbit key_add=P1^3;
sbit key_minus=P1^4;
sbit SCL = P2^0;
sbit SDA = P2^1;
sbit RS = P2^5;
sbit RW = P2^6;
sbit EN = P2^7;
u16 duty_cycle;//占空比
u16 compare=128;//方波比較值
u8 wave_mode=0;//1:正弦波 2:三角波 3:方波
u8 code Table_sin[256]=//正弦表
{
0x80,0x83,0x86,0x89,0x8d,0x90,0x93,0x96,0x99,0x9c,0x9f,0xa2,0xa5,0xa8,0xab,0xae,0xb1,0xb4,0xb7,0xba,0xbc,0xbf,0xc2,0xc5,
0xc7,0xca,0xcc,0xcf,0xd1,0xd4,0xd6,0xd8,0xda,0xdd,0xdf,0xe1,0xe3,0xe5,0xe7,0xe9,0xea,0xec,0xee,0xef,0xf1,0xf2,0xf4,0xf5,
0xf6,0xf7,0xf8,0xf9,0xfa,0xfb,0xfc,0xfd,0xfd,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0xfd,
0xfd,0xfc,0xfb,0xfa,0xf9,0xf8,0xf7,0xf6,0xf5,0xf4,0xf2,0xf1,0xef,0xee,0xec,0xea,0xe9,0xe7,0xe5,0xe3,0xe1,0xde,0xdd,0xda,
0xd8,0xd6,0xd4,0xd1,0xcf,0xcc,0xca,0xc7,0xc5,0xc2,0xbf,0xbc,0xba,0xb7,0xb4,0xb1,0xae,0xab,0xa8,0xa5,0xa2,0x9f,0x9c,0x99,
0x96,0x93,0x90,0x8d,0x89,0x86,0x83,0x80,0x80,0x7c,0x79,0x76,0x72,0x6f,0x6c,0x69,0x66,0x63,0x60,0x5d,0x5a,0x57,0x55,0x51,
0x4e,0x4c,0x48,0x45,0x43,0x40,0x3d,0x3a,0x38,0x35,0x33,0x30,0x2e,0x2b,0x29,0x27,0x25,0x22,0x20,0x1e,0x1c,0x1a,0x18,0x16,
0x15,0x13,0x11,0x10,0x0e,0x0d,0x0b,0x0a,0x09,0x08,0x07,0x06,0x05,0x04,0x03,0x02,0x02,0x01,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x02,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0d,0x0e,0x10,0x11,0x13,0x15,
0x16,0x18,0x1a,0x1c,0x1e,0x20,0x22,0x25,0x27,0x29,0x2b,0x2e,0x30,0x33,0x35,0x38,0x3a,0x3d,0x40,0x43,0x45,0x48,0x4c,0x4e,
0x51,0x55,0x57,0x5a,0x5d,0x60,0x63,0x66,0x69,0x6c,0x6f,0x72,0x76,0x79,0x7c,0x80
};
bit write_addr(u8,bit);//第一個參數表示地址,第二個參數表示 讀:1 寫:0
bit write_data(u8);//第一個參數表示數據,第二個參數表示 命令字
void stop();
void Delay(u16);
//系統延時函數
void Delay(u16 time)
{
while ( --time!= 0 );
}
//函數:I2C_Delay()
//功能:I2C 延時函數
void I2C_Delay(u16 I2C_VALUE)
{
while(--I2C_VALUE!=0);
}
//函數:I2C_Init()
//功能:I2C 總線初始化,使總線處于空閑狀態
//說明:在 main()函數的開始處,通常應當要執行一次本函數
void I2C_Init()
{
SCL = 1;
I2C_Delay(5);
SDA = 1;
I2C_Delay(5);
}
//函數:I2C_Start()
//功能:產生I2C 總線的起始狀態
//說明:
//SCL處于高電平期間,當SDA 出現下降沿時啟動I2C 總線
//不論 SDA 和SCL 處于什么電平狀態,本函數總能正確產生起始狀態
//本函數也可以用來產生重復起始狀態
//本函數執行后,I2C 總線處于忙狀態
void I2C_Start()
{
SDA = 1;
I2C_Delay(5);
SCL = 1;
I2C_Delay(5);
SDA = 0;
I2C_Delay(5);
SCL = 0;
I2C_Delay(5);
}
//函數:I2C_Write()
//功能:向I2C 總線寫1 個字節的數據
//參數:char dat 要寫到總線上的數據
void I2C_Write(char dat)
{
u8 t = 8;
do
{
SDA = (bit)(dat & 0x80);
dat <<= 1;
SCL = 1;
I2C_Delay(5);
SCL = 0;
I2C_Delay(5);
} while ( --t != 0 );
}
//函數:I2C_GetAck()
//功能:應答
//參數:無
bit I2C_GetAck()
{
bit ack;
SDA = 1;
I2C_Delay(5);
SCL = 1;
I2C_Delay(5);
ack = SDA;
SCL = 0;
I2C_Delay(5);
return ack;
}
//函數:I2C_Stop()
//功能:產生I2C 總線的結束狀態
//參數:無
void I2C_Stop()
{
u16 t = 10;
SDA = 0;
I2C_Delay(5);
SCL = 1;
I2C_Delay(5);
SDA = 1;
I2C_Delay(5);
while ( --t != 0 ); //在下一次產生Start 之前,要加一定的延時
}
//第一個參數表示地址,第二個參數表示 讀:1 寫:0
bit write_addr(u8 addr,bit mod)
{
u8 address;
address=addr<<1;
if(mod)
address++;
I2C_Start();
I2C_Write(address);
Delay(10);
if(I2C_GetAck())
return 1;
return 0;
}
//寫數據
bit write_data(u8 dat)
{
I2C_Write(dat);
if(I2C_GetAck())
return 1;
return 0;
}
void stop()
{
I2C_Stop();
I2C_Init();
}
//LCD寫命令函數
void LCD_Write_Com(u8 com)
{
RS_CLR;
RW_CLR;
EN_SET;
DataPort=com;
Delay(500);
EN_CLR;
}
//LCD寫數據函數
void LCD_Write_Data(u8 dat)
{
RS_SET;
RW_CLR;
EN_SET;
DataPort=dat;
Delay(500);
EN_CLR;
}
//LCD清屏函數
void LCD_Clear(void)
{
LCD_Write_Com(0x01);
Delay(500);
}
//LCD寫字符函數
void LCD_Write_Char(u8 x,u8 y,u8 Char)
{
if(y==1)
LCD_Write_Com(0x80+x);//寫在第一排
else
LCD_Write_Com(0x80+0x40+x);//寫在第二排
LCD_Write_Data(Char);
}
//LCD寫字符串函數
void LCD_Write_String(u8 x,u8 y,u8 *s)
{
if(y==1)
LCD_Write_Com(0x80+x);//寫在第一排
else
LCD_Write_Com(0x80+0x40+x);//寫在第二排
while(*s)
{
LCD_Write_Data(*s);
s++;
}
}
//LCD初始化函數
void LCD_Init(void)
{
LCD_Write_Com(0x38); //顯示模式設置,設置 16×2 顯示、 5×7 點陣、 8 位數據口
LCD_Write_Com(0x08); //顯示關閉
LCD_Write_Com(0x01); //顯示清屏
LCD_Write_Com(0x06); //顯示光標移動設置:寫一個字符后地址指針加一,且光標加一
LCD_Write_Com(0x0C); //顯示開及光標設置:開顯示,不顯示光標
}
void Key_Scan()
{
if(key_sin==0)
{
Delay(100);//延時消抖
if(key_sin==0)
{
while(!key_sin);//等待按鍵松開
LCD_Write_String(0,1," Type:Sin ");
LCD_Write_String(0,2," Vpp:5V ");
wave_mode=1;
}
}
if(key_triangle==0)
{
Delay(100);//延時消抖
if(key_triangle==0)
{
while(!key_triangle);//等待按鍵松開
LCD_Write_String(0,1," Type:Triangle ");
LCD_Write_String(0,2," Vpp:5V ");
wave_mode=2;
}
}
if(key_square==0)
{
Delay(100);//延時消抖
if(key_square==0)
{
while(!key_square);//等待按鍵松開
LCD_Write_String(0,1," Type:Square ");
LCD_Write_String(0,2," Vpp:5V D:50.0% ");
wave_mode=3;
}
}
if(wave_mode==3)//如果當前狀態是方波
{
if(key_add==0)
{
Delay(100);//延時消抖
if(key_add==0)
{
while(!key_add);
compare++;
if(compare>=231)
compare=231;
duty_cycle=(u16)(compare/256.0*1000);
LCD_Write_Char(10,2,duty_cycle/100+'0');
LCD_Write_Char(11,2,duty_cycle%100/10+'0');
LCD_Write_Char(13,2,duty_cycle%10+'0');
}
}
if(key_minus==0)
{
Delay(100);//延時消抖
if(key_minus==0)
{
while(!key_minus);
compare--;
if(compare<=25)
compare=25;
duty_cycle=(u16)(compare/256.0*1000);
LCD_Write_Char(10,2,duty_cycle/100+'0');
LCD_Write_Char(11,2,duty_cycle%100/10+'0');
LCD_Write_Char(13,2,duty_cycle%10+'0');
}
}
}
}
void main(void)
{
u8 turn=0;
int i;
LCD_Init();
I2C_Init();
while(1)
{
Key_Scan();//按鍵掃描
if(wave_mode==1)//正弦波
{
i++;
if(i>=256)
i=0;
write_addr(ADDR1,0);
write_data(0);
write_data(Table_sin[i]);
stop();
}
if(wave_mode==2)//三角波
{
if(turn==0)//三角波反轉狀態位
{
i++;
if(i>=256)
turn=1;
}
if(turn==1)
{
i--;
if(i<=0)
turn=0;
}
write_addr(ADDR1,0);
write_data(0);
write_data(i);
stop();
}
if(wave_mode==3)//方波
{
i++;
if(i>=256)
i=0;
if(i<compare)
{
write_addr(ADDR1,0);
write_data(0);//清除原有的數據
write_data(255);//寫高電平1
stop();
}
else
{
write_addr(ADDR1,0);
write_data(0);//清除原有的數據
write_data(0);//寫低電平0
stop();
}
}
}
}
復制代碼
0.png
(62.71 KB, 下載次數: 145)
下載附件
2021-5-3 01:02 上傳
作者:
CRANE888
時間:
2021-12-14 17:10
有源文件嗎
作者:
CRANE888
時間:
2021-12-14 17:14
大佬您好,請問您有“基于51單片機簡易波形發生器(代碼+proteus仿真圖)”的源文件嗎?
歡迎光臨 (http://www.zg4o1577.cn/bbs/)
Powered by Discuz! X3.1
主站蜘蛛池模板:
日韩三区
|
国精产品一品二品国精在线观看
|
久久久精品视频一区二区三区
|
欧美成人精品一区
|
久久久久国产精品一区
|
拍真实国产伦偷精品
|
国产一区二区精品在线
|
亚洲欧美国产精品久久
|
亚洲成人精品在线
|
欧洲精品在线观看
|
久久久久久久久中文字幕
|
精品国产青草久久久久福利
|
99精品在线观看
|
91在线导航
|
黄色欧美在线
|
久久伊人精品
|
一本色道久久综合亚洲精品高清
|
亚洲福利精品
|
精品国产乱码久久久久久1区2区
|
久久国产精品无码网站
|
亚洲人人
|
国产成人久久av免费高清密臂
|
国产精品国产三级国产aⅴ无密码
|
免费成人在线网
|
人人鲁人人莫人人爱精品
|
亚洲福利网站
|
夜夜精品视频
|
国产日韩亚洲欧美
|
小草久久久久久久久爱六
|
91精品国产综合久久久动漫日韩
|
亚洲一区二区免费
|
夜夜操av
|
精品国产免费人成在线观看
|
美日韩精品
|
久优草
|
麻豆一区二区三区精品视频
|
亚洲成av人片在线观看无码
|
97精品国产97久久久久久免费
|
91久久久久
|
午夜三区
|
欧美激情一区二区三级高清视频
|