Proteus电路仿真及应用(51单片机系列)
RushSFV:
为什么要设置TH0,TL0:是因为一个空的盆要65536滴水滴进去才会满(产生中断),开始滴水之前可以先放入一部分水(设置TH0,TL0),叫做计数初值。如果现在要计数50000,那么可以先放入15536滴水,也就是计数初值为15536,再计数50000就可以溢出产生中断。
【回复】回复 @RB傻气 :因为 ~ 代表非的意思
一休想双休:
#include"reg51.h"
unsigned char s【】={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6f};
unsigned char num=99;
void delay(unsigned int n)
{
unsigned char i=0,j=0;
for (i=0;i<n;i++)
{
for (j=0;j<120;j++);
}
}
void key_scan()
{
unsigned char temp0=0,temp1=0,temp;
P1=0xf0;
if(P1!=0xf0)
{
delay(20);
temp=P1;
P1=0x0f;
if(P1!=0x0f)
{
delay(20);
temp1=P1;
}
}
temp=temp0+temp1;
if(temp==0xee)
{
num=0;
}
if(temp==0xed)
{
num=1;
}
}
void display()
{
P2=s【num】 ;
}void main()
{
while(1)
{
key_scan();
display();
}
}
大佬可以帮我看看哪里错误吗 我编程通过了 课是还是不亮 矩阵按键那一节
【回复】谢谢大佬 大佬长命百,岁万寿无疆,原地暴富远离烦恼
【回复】temp=P1有问题,应该是temp0=P1
【回复】回复 @35057472208_bili :哈哈哈哈你好可爱!
susan_uu:
老师我今天真是太激动了,大学四年做毕设才算认真学习了proteus,之前非常害怕编程,今天头一次这么明白,感谢你
【回复】看来是队友啊 毕设让我们相聚在此[呲牙]
【回复】回复 @容我想想emmm :流下了不学无术的眼泪[笑哭]
【回复】哈哈哈哈哈哈,好巧,我也是
DerTraumer:
感谢老师,希望能多出一些视频。我看的MOOC上的单片机视频都只讲原理,不讲外围电路和具体实验程序,看了老师的视频,终于会用学过的单片机原理了。前面学了一大堆单片机理论和C语言,现在能用它们做实验,非常高兴。
【回复】https://www.bilibili.com/read/cv15803652?spm_id_from=333.999.0.0
相信光-冲向光:
定时器:
#include"reg51.h"
unsigned char s【】={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
unsigned char count=0,num=0;
void inittimer()
{
TMOD=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
ET0=1;
EA=1;
TR0=1;
}
void display()
{
P2=s【num】;
if(num==10)
{
num=0;
}
}
void main()
{
inittimer();
while(1)
{
display();
}
}
void timer_isr() interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
count++;
if(count==20)
{
num++;
count=0;
}
}
【回复】不亮的看看显示数值的是不是拿错了
【回复】问什么我的仿真的时候显示屏不亮啊
【回复】回复 @一只TOTO狸 :https://www.bilibili.com/read/cv15803734?spm_id_from=333.999.0.0
知弦:
安装Proteus软件时,尽可能的安装在英文路径,如果是win10系统,在运行软件时需要用管理员身份运行。
【回复】下载的proteus根本找不到基本元器件啊[大哭][大哭][大哭]
【回复】我用win10,安装根本不出现添加注册表,然后安好了就打不开,是不是我杀毒软件没关完鸭
【回复】用管理员运行都打不开是什么原因[惊讶]
相信光-冲向光:
中断:
#include"reg51.h"
sbit ex=P3^2;
unsigned char s【】={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
unsigned char num=0;
void initex()
{
IT0=1;
EX0=1;
EA=1;
ex=1;
}
void display()
{
P2=s【num】;
if(num==10)
{
num=0;
}
}
void main()
{
initex();
while(1)
{
display();
}
}
void ex_isr() interrupt 0
{
num++;
}
【回复】回复 @Amerite :同样的问题
【回复】我的为什么能编译过去,但是到proteus里实现不了?
相信光-冲向光:
计数器:
#include"reg51.h"
unsigned char s【】={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
unsigned char num=0;
void initcounter()
{
TMOD=0x06;//0000 0110
TH0=256-3;
TL0=256-3;
ET0=1;
EA=1;
TR0=1;
}
void display()
{
P2=s【num】;
if(num==10)
{
num=0;
}
}
void main()
{
initcounter();
while(1)
{
display();
}
}
void counter_isr() interrupt 1
{
num++;
}
【回复】大佬,我想问问计数器的初值有什么作用啊
【回复】打的一模一样,编译没问题但是 开关没反应
孙漂漂吖:
keil下载链接:https://pan.baidu.com/s/1EHiycq98MqeaOdCtXJo8_A
提取码:aq76
【回复】回复 @南柯洹梦 :复制这段内容后打开百度网盘手机App,操作更方便哦 链接:https://pan.baidu.com/s/1AgadHEYNsexzv7VHj6nO0g 提取码:g86z
【回复】有教程吗,软件安装管家没有
【回复】链接失效了,可以再发一次吗
相信光-冲向光:
LCD1602:
#include"reg51.h"
sbit RS=P3^0;
sbit RW=P3^1;
sbit E=P3^2;
unsigned char str【】={"Hello world!"};
void delay(unsigned int t)
{
unsigned int i=0,j=0;
for(i=0;i<t;i++)
{
for(j=0;j<120;j++);
}
}
void writedat(unsigned char dat)
{
RS=1;
RW=0;
E=0;
P2=dat;
delay(5);
E=1;
E=0;
}
void writecom(unsigned char com)
{
RS=0;
RW=0;
E=0;
P2=com;
delay(5);
E=1;
E=0;
}
void initlcd()
{
writecom(0x38);
writecom(0x0c);
writecom(0x06);
writecom(0x01);
}
void display()
{
unsigned int i=0;
writecom(0x80);
delay(5);
while(str【i】!='\0')
{
writedat(str【i】);
delay(5);
i++;
}
}
void main()
{
initlcd();
while(1)
{
display();
}
}
【回复】照着做没有显示,这是为什么啊
【回复】回复 @炸天帮亚里士多德 : 把黑色加粗的括号用英文输入法打上去
【回复】回复 @Biwangchang :解决了吗,我也是
相信光-冲向光:
流水灯的代码
#include"reg51.h"
sbit LED0=P2^0;
void delay(unsigned int n)
{
unsigned int i=0,j=0;
for(i=0;i<n;i++)
{
for(j=0;j<120;j++);
}
}
void led()
{
int i=0;
for(i=0;i<8;i++)
{
P2=~(0x01<<i);
delay(250);
}
}
void main()
{
int i=0 ;
while(1)
{
//led();
for(i=0;i<8;i++)
{
P2=~(0x01<<i);
delay(250);
}
}
}
【回复】回复 @樱花う湖畔 :啊?我可以运行的啊
【回复】回复 @相信光-冲向光 :https://www.bilibili.com/read/cv15803618?spm_id_from=333.999.0.0
相信光-冲向光:
串口:
#include"reg51.h"
unsigned char recdat=0,flag=0;
void initscon()
{
SCON=0x50;
TMOD=0x20;
TH1=256-3;
TL1=256-3;
ES=1;
EA=1;
TR1=1;
}
void senddat()
{
SBUF=recdat;
while(!TI);
TI=0;
}
void main()
{
initscon();
while(1)
{
if(flag==1)
{
senddat();
flag=0;
}
}
}
void scon_isr() interrupt 4
{
recdat=SBUF;
RI=0;
flag=1;
}
【回复】回复 @微尘MT :@微尘MT 我的也是
【回复】我的串口一直输不进去,不知道为啥
【回复】我的窜口输入一个值不会停
小田74824:
老师,我照着p7数码管做了仿真,但是延时程序一点用都没有。delay()里输入什么数字都没用,到底是啥问题想不明白。
#include"reg51.h"
unsigned char s【】={0X3F,0X06,0X5B,0X4F,0X66,0X6D,0X7D,0X07,0X7F,0X6F}; //共阴0-9
void delay(unsigned int n)
{
unsigned int i=0,j=0;
for(i=0;i<n;i++)
{
for(j=0;j<120;j++);
}
}
void seg()
{
int i=0;
for(i=0;i<10;i++)
{
P2=s【i】; //0011 1111
delay(1000);
}
}
void main()
{
while(1)
{
seg();
}
}
【回复】你hex文件生成没?程序没问题,如果生成了,需要导入proteus才能进行仿真,并且保证硬件连接正确
沁墨殇璃:
#include"reg51.h"
unsigned char s【10】={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
unsigned char count=0;
unsigned char num=0;
void inittimer()
{
TMOD=0x01;
TH0=(65536-15536)/256; //(50ms=50000us) 256=2^8
TL0=(65536-15536)%256;
ET0=1; //?????????ж?
EA=1; //???????ж?
TR0=1; //????????0
}
void display()
{
P2=s【num】;
if(num==10);
{
num=0;
}
}
void main()
{
inittimer();
while(1)
{
display();
}
}
void timer_isr() interrupt 1
{
TH0=(65536-50000)/256; //(50ms=50000us) 256=2^8
TL0=(65536-50000)%256;
count++;
if(count==20);
{
num++;
count=0;
}
}
一样的程序为什么仿真无法出现计数器1s加一,求解
allmyfault158314:
#include "reg51.h"
unsigned char s【】 = {0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7E,0x6F};
unsigned count = 0, num = 0;
void inittimer()
{
TMOD = 0X01;
TH0 = (65536-50000)/256;
TL0 = (65536-50000)%256;
ET0 = 1;
EA = 1;
TR0 = 1;
}
void display()
{
P2 = s【num】;
if (num == 10)
{
num = 0 ;
}
}
void main()
{
inittimer();
while(1);
{
display();
}
}
void timer_isr() interrupt 1
{
TH0 = (65536-50000)/256;
TL0 = (65536-50000)%256;
count++;
if(count == 20)
{
num++;
count = 0;
}
}
老师我想问个问题,按照你的弄得,为撒我的会报错定时器.C(30): error C237: 'main': function already has a body。(而且以前能运行的程序也会出现这个错)
【回复】回复 @158gy158 :这个有啥毛病呢
【回复】回复 @知弦 :终于解决了,重新下载了一次
90257641510_bili:
#include<STC15F2K60S2.h>
typedef unsigned int uint;
void main()
{ uint mcc;
TMOD=0x90;
TH1=TL1=0;
while(P33);//高电平等待
TR1=1;
while(!P33);//低电平等待
while(P33);//T1已启动,等待结束高电平
TR1=0;
mcc=TH1*256+TL1;//mcc乘以机器周期即脉宽
}
老师给了个程序叫我们测脉宽,怎么加显示的程序进去呀,请问一下,急急急
【回复】你去看下数码管或者lcd1602的程序,改一下就行