Protues开发板仿真平台制作
Protues开发板51开发板的制作
1 软件配置
2 软件配置
新建protues工程在所有的.C文件夹中,在仿真时可以看到执行的代码位置,目前按路径观察到单价位置方法还不清楚。
3 初步建的工程及所用器件列表
4 测试代码
/*1-VSS 2-VDD 3-V0 4-RS 5-R/W 6-E 7-14 DB0-DB7 15-BLA 16-BLK*/
/*-----------------------------------------------
名称:LCD1602
内容:通过标准程序动态显示字符
------------------------------------------------*/
#include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义
sbit RS = P2^4; //定义端口
sbit RW = P2^5;
sbit EN = P2^6;
#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
/******************************************************************/
/* 微秒延时函数 */
/******************************************************************/
void delay_us(unsigned int n) //延时 如果需要高精度延时 请嵌入汇编
{
if (n == 0)
{
return ;
}
while (--n);
}
/******************************************************************/
/* 毫秒函数声明 */
/******************************************************************/
void delay_ms(unsigned char i)
{
unsigned char a, b;
for (a = 1; a < i; a++)
{
for (b = 1; b; b++)
{ ; }
}
}
/******************************************************************/
/* 写入命令函数 */
/******************************************************************/
void LCD_write_com(unsigned char com)
{
RS_CLR;
RW_CLR;
EN_SET;
P0 = com;
delay_us(5);
EN_CLR;
}
/******************************************************************/
/* 写入数据函数 */
/******************************************************************/
void LCD_write_Data(unsigned char Data)
{
RS_SET;
RW_CLR;
EN_SET;
P0 = Data;
delay_us(5);
EN_CLR;
}
/******************************************************************/
/* 清屏函数 */
/******************************************************************/
void LCD_clear(void)
{
LCD_write_com(0x01);
delay_ms(5);}
/******************************************************************/
/* 写入字符串函数 */
/******************************************************************/
void LCD_write_str(unsigned char x,unsigned char y,unsigned char *s)
{
if (y == 0)
{
LCD_write_com(0x80 + x);
}
else
{
LCD_write_com(0xC0 + x);
}
while (*s)
{
LCD_write_Data( *s);
s ++;
}
}
/******************************************************************/
/* 写入字节函数 */
/******************************************************************/
void LCD_write_char(unsigned char x,unsigned char y,unsigned char Data)
{
if (y == 0)
{
LCD_write_com(0x80 + x);
}
else
{
LCD_write_com(0xC0 + x);
}
LCD_write_Data( Data);
}
/******************************************************************/
/* 初始化函数 */
/******************************************************************/
void LCD_init(void)
{
LCD_write_com(0x38); /*显示模式设置*/
delay_ms(5);
LCD_write_com(0x38);
delay_ms(5);
LCD_write_com(0x38);
delay_ms(5);
LCD_write_com(0x38);
LCD_write_com(0x08); /*显示关闭*/
LCD_write_com(0x01); /*显示清屏*/
LCD_write_com(0x06); /*显示光标移动设置*/
delay_ms(5);
LCD_write_com(0x0C); /*显示开及光标设置*/
}
/******************************************************************/
/* 主函数 */
/******************************************************************/
void main(void)
{
unsigned char i;
unsigned char *p;
delay_ms(100);
LCD_init();
while (1)
{
i = 1;
p = "huaqinmcu";
LCD_clear();
LCD_write_str(2,0,"Welcome to");
delay_ms(250);
while (*p)
{
LCD_write_char(i,1,*p);
i ++;
p ++;
delay_ms(250);
}
delay_ms(250);
}
}
/*******************************************************************/
/* */
/* ME单片机学习/开发系统演示程序 - 8*8 LED 点阵 */
/* */
/* MCU:STC89C52 ,晶体频率:11.0592MHz */
/* */
/* */
/* */
/* */
/* */
/* */
/* */
/*******************************************************************/
#include <reg52.H>
#define uchar unsigned char
#define uint unsigned int
//0-9字模
unsigned char disp[][8]={
{0x0c,0x12,0x22,0x44,0x22,0x12,0x0c,0x00},
{0x00,0x00,0x3e,0x41,0x41,0x3e,0x00,0x00},//0
{0x00,0x40,0x44,0x7e,0x7f,0x40,0x40,0x00},//1
{0x00,0x00,0x66,0x51,0x49,0x46,0x00,0x00},//2
{0x00,0x00,0x22,0x41,0x49,0x36,0x00,0x00},//3
{0x00,0x10,0x1c,0x13,0x7c,0x7c,0x10,0x00},//4
{0x00,0x00,0x27,0x45,0x45,0x45,0x39,0x00},//5
{0x00,0x00,0x3e,0x49,0x49,0x32,0x00,0x00},//6
{0x00,0x03,0x01,0x71,0x79,0x07,0x03,0x00},//7
{0x00,0x00,0x36,0x49,0x49,0x36,0x00,0x00},//8
{0x00,0x00,0x26,0x49,0x49,0x3e,0x00,0x00},//9
};
#define rowp P0
#define colp P2
uchar speed=60; //显示速度
//延时函数
void delay1ms(uchar x)
{
int i,j;
for(i=0;i<x;i++)
for (j=0;j<120;j++);
}
//主程序
void main()
{
uchar i,j,k,scan;P2=0xef;
while(1)
{
for(i=0;i<11;i++)
for (k=0;k<speed;k++)
{
scan=0x01;
for(j=0;j<8;j++)
{
rowp=0x00;
colp=~scan;
rowp=disp[i][j];
delay1ms(2);
scan<<=1;
}
}
}
}
/*-----------------------------------------------
名称:数码管动态扫描
内容:数码管使用动态扫描显示,所以可以同时看到数码管同时显示数字或者字符,扫描原理可以参考说明书
------------------------------------------------*/
#include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义
unsigned char const EL[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};// 显示段码值01234567
unsigned char code seg[]={0,1,2,3,4,5,6,7};//分别对应相应的数码管点亮,即位码
/*------------------------------------------------
延时子程序
------------------------------------------------*/
void delay(unsigned int cnt)
{
while(--cnt);
}
/*------------------------------------------------
主函数
------------------------------------------------*/
main()
{
unsigned char i;
while(1)
{
P0=EL[i];//取显示数据,段码
P2=seg[i]; //取位码
delay(20000); //扫描间隙延时,时间太长会闪烁,太短会造成重影,这里使用长时间方便了解显示原理
i++;
if(8==i) //检测8位扫描完全?
i=0;
}
}
#include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义
#include<math.h>
#include<INTRINS.H>
#define uchar unsigned char
#define uint unsigned int;
/******************************************************************/
/* 定义端口 */
/******************************************************************/
sbit seg1=P2^0;
sbit seg2=P2^1;
sbit seg3=P2^2;
sbit DQ=P1^3;//ds18b20 端口
sfr dataled=0x80;//显示数据端口
/******************************************************************/
/* 全局变量 */
/******************************************************************/
uint temp;
uchar flag_get,count,num,minute,second;
uchar code tab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
//7段数码管段码表共阳
uchar str[6];
/******************************************************************/
/* 函数声明 */
/******************************************************************/
void delay1(uchar MS);
unsigned int ReadTemperature(void);
void Init_DS18B20(void);
unsigned char ReadOneChar(void);
void WriteOneChar(unsigned char dat);
void delay(unsigned int i);
/******************************************************************/
/* 主函数 */
/******************************************************************/
main()
{
unsigned char TempH,TempL;
TMOD|=0x01;//定时器设置
TH0=0xef;
TL0=0xf0;
IE=0x82;
TR0=1;
P2=0x00;
count=0;
while(1)
{
str[5]=0x39; //显示C符号
str[1]=tab[TempH/100]; //十位温度
str[2]=tab[(TempH%100)/10]; //十位温度
str[3]=tab[(TempH%100)%10]|0x80; //个位温度,带小数点
str[4]=tab[TempL];
if(flag_get==1) //定时读取当前温度
{
temp=ReadTemperature();
if(temp&0x8000)
{
str[0]=0x40;//负号标志
temp=~temp; // 取反加1
temp +=1;
}
else
str[0]=0;
TempH=temp>>4;
TempL=temp&0x0F;
TempL=TempL*6/10;//小数近似处理
flag_get=0;
}
}
}
/******************************************************************/
/* 定时器中断 */
/******************************************************************/
void tim(void) interrupt 1 using 1//中断,用于数码管扫描和温度检测间隔
{
TH0=0xef;//定时器重装值
TL0=0xf0;
num++;
if (num==50)
{num=0;
flag_get=1;//标志位有效
second++;
if(second>=60)
{second=0;
minute++;
}
}
count++;
if(count==1)
{P2=0;
dataled=str[0];}//数码管扫描
if(count==2)
{P2=1;
dataled=str[1];}
if(count==3)
{ P2=2;
dataled=str[2];
}
if(count==4)
{ P2=3;
dataled=str[3];
}
if(count==5)
{ P2=4;
dataled=str[4];
}
if(count==6)
{ P2=5;
dataled=str[5];
count=0;}
}
/******************************************************************/
/* 延时函数 */
/******************************************************************/
void delay(unsigned int i)//延时函数
{
while(i--);
}
/******************************************************************/
/* 初始化 */
/******************************************************************/
void Init_DS18B20(void)
{
unsigned char x=0;
DQ = 1; //DQ复位
delay(8); //稍做延时
DQ = 0; //单片机将DQ拉低
delay(80); //精确延时 大于 480us
DQ = 1; //拉高总线
delay(10);
x=DQ; //稍做延时后 如果x=0则初始化成功 x=1则初始化失败
delay(5);
}
/******************************************************************/
/* 读一个字节 */
/******************************************************************/
unsigned char ReadOneChar(void)
{
unsigned char i=0;
unsigned char dat = 0;
for (i=8;i>0;i--)
{
DQ = 0; // 给脉冲信号
dat>>=1;
DQ = 1; // 给脉冲信号
if(DQ)
dat|=0x80;
delay(5);
}
return(dat);
}
/******************************************************************/
/* 写一个字节 */
/******************************************************************/
void WriteOneChar(unsigned char dat)
{
unsigned char i=0;
for (i=8; i>0; i--)
{
DQ = 0;
DQ = dat&0x01;
delay(5);
DQ = 1;
dat>>=1;
}
delay(5);
}
/******************************************************************/
/* 读取温度 */
/******************************************************************/
unsigned int ReadTemperature(void)
{
unsigned char a=0;
unsigned int b=0;
unsigned int t=0;
Init_DS18B20();
WriteOneChar(0xCC); // 跳过读序号列号的操作
WriteOneChar(0x44); // 启动温度转换
delay(200);
Init_DS18B20();
WriteOneChar(0xCC); //跳过读序号列号的操作
WriteOneChar(0xBE); //读取温度寄存器等(共可读9个寄存器) 前两个就是温度
a=ReadOneChar(); //低位
b=ReadOneChar(); //高位
b<<=8;
t=a+b;
return(t);
}
5 Protues中常用器件对应位置。
51单片机(AT89C51)
STM32系列单片机(STM32)
电阻(RES) 可变电阻(POT-HG) 电感(IND) 电容(CAP)
LCD屏幕(LM016) OLED屏幕(OLED) 数码管(7seg)
晶振(CRYSTAL) 电池(battery) 天线(ANTENNA) 蜂鸣器(BUZZER)
按键(button) 自锁开关(switch) 拨码开关(dipsw) 排针(Header)
门电路(or gate) 与门(74ALS09) 非门(7405) 或门(4071) 异或门(4030)
锁存器(D Latch) D触发器(4013) JK触发器(4027)
DS18B20(DS18B20) DHT系列(DHT) SHT系列(SHT)
电机系列(MOTOR) 步进电机驱动芯片(ULN2003A)
全桥整流(2W005G) 线圈(TRAN-2P2S) 线圈(XFMR) 二极管(10A03)
LED灯系列(LED) 排阻(RESPACK) 三极管(PNP NPN)
红外接收头(IRLINK) 保险丝(FUSE) LM317稳压(LM317) 超声波测距(SRF04)
Torch_LDR,光敏传感器
1 SWITCH(一位开关)
SWITCH 一位开关
SW-SPST 一位开关
SW-SPDT 两位开关
2 CAP(无极性电容)
3 CAP-ELEC(极性电容)
4 CRYSTAL(晶振)
5 LED-BIBY(发光二极管)
6 RES(电阻)
7 BUTTON(按钮)
8 AT89C51(经典单片机)
9 BUS(总线)
右侧:
总线模式->蓝色粗线:总线
10 VCC(电源)
右侧:
终端模式->POWER:电源(默认+5v)
终端模式->GROUND:接地电源
11 GROUND(接地)
12 BUZZER(蜂鸣器)
device:通用蜂鸣器
active:有源蜂鸣器,通过直流操作由声卡发声
13 74HC273(常用锁存器)
14 7SEG-MPX4-CA(共阳极数码管)
cc表示共阴极,ca表示共阳极;
15 LM016L(常用液晶)
16 POT(滑动变阻器)
POT-HG 滑动电阻(调整精度为1%)
POT-LIN 滑动电阻(调整精度为10%)
POT-LOG 滑动电阻(调整精度为10%)
17 RP2(排电阻)
18 DAC0832(D/A转换器)
19 PNP(三极管)
20 NPN(三极管)
21 LAMP(灯泡)
22 默认终端(一条线加一个空心圆)
右侧:
终端模式->DEFAULT
23 双击导线形成的实心圆点
搭配网络标号使用(鼠标移动到导线上->右键属性->添加网络标号)
24 RX8(双列x8电阻网络)
25 SPEAKER(扬声器)
device:不能发出声音
active:活动的,可以发出声音
26 OSCILLOSCOPE(示波器)
右边仪器->选择
27 74HC154译码器
28 NOT-非门(一个三角形前面有个圆圈)
29 DIPSWC(拨码开关)
30 SW-SPDT(单刀双掷开关)
31 DIODE(二极管)
32 VSINE(交流电源)
33 MOC3052(双向光耦)
34 TRIAC(三端双向可控硅开关)
35 G2R继电器系列
36 RELAY(继电器)
37 7406(双极型晶体管)
38 MATRIX-8乘8点阵
39 TRAFFICLIGHTS(交通指示灯)
40 SW-ROT-3(单刀三掷开关)
41 PULSE(脉冲发生器)
右边->选择激励源模式
42 SINE(正弦波发生器)
43 DIODE-LED(发光二极管)
44 PHOTODIODE(光敏二极管)
45 DS18B20
46 传感器