标题:
这个单片机程序为什么按键没有反应?
[打印本页]
作者:
米霁113
时间:
2022-4-6 13:26
标题:
这个单片机程序为什么按键没有反应?
#include<reg51.h>
#include<intrins.h>
#include<math.h>
#define uchar unsigened char
#define uint unsigned int
#define AddWr 0x90
sbit SDA=P3^7;
sbit SCL=P3^6;
sbit RS=P2^0;
sbit RW=P2^1;
sbit E =P2^2;
sbit k1=P3^5;
sbit k2=P1^1;
sbit k3=P1^2;
sbit k4=P1^3;
sbit k5=P1^4;
unsigned int temp;
unsigned char way;
void delay_ms(unsigned int n) //12MHZ晶振时延时1ms,若用11.0592MHZ,则j=110
{
unsigned int i=0,j=0;
for(i=n;i>0;i--)
for(j=0;j<123;j++);
}
void delay_8591()
{
_nop_(); _nop_(); _nop_();_nop_(); _nop_(); //起始条件建立时间大于4.7us,延时
}
/*******************************************PCF8591DA转换模块**************************/////////////////////
/****************************************************************************************///////////
void start()//开始信号
{
SDA=1; //确保SDA线为高电平,开始 之前都确保为高电平
delay_8591();
SCL=1; //确保SCL为高电平
delay_8591();
SDA=0; //在SCL为高时拉低SDA线,即为起始信号
delay_8591();
SCL=0; //将SCL线拉低,为后面SDA的传数据时电平变化做准备
}
void stop() //停止信号
{
SDA=0; //确保SDA线为低电平
delay_8591();
SCL=1; //确保SCL线为高电平
delay_8591();
SDA=1; //在SCL为高时拉高SDA线,即为停止信号,此时SDA和SCL均为高,同时完成IIC初始化过程
delay_8591(); ;
}
void init() //初始化
{
SDA=1;
delay_8591();
SCL=1;
delay_8591();
}
void write_byte(unsigned char date) //写一字节数据
{
unsigned char i;
for(i=0;i<8;i++)
{
if(date&0x80) //判断最高位,并赋予SDA
SDA=1;
else
SDA=0;
delay_8591();
SCL=1; //SCL高电平,SDA数据稳定,发送,通知被控器开始接收数据位
delay_8591();
date=date<<1; //发送完成,发生时左移一位 移出的一位在CY中
SCL=0; //只有在scl=0时sda能变化值
}
delay_8591();
SDA=1; //将SDA拉高,开始为IIC设备应答做准备
delay_8591();
}
void respons()//应答 相当于一个智能的延时函数
{
unsigned char i;
SCL=1; //先拉高SCL,等待SDA应答
delay_8591();
while((SDA==1)&&(i<250))
i++;
SCL=0;
delay_8591();
}
void write_add(unsigned char date)
{
start();
write_byte(AddWr); //10010000 前四位固定 接下来三位全部被接地了 所以都是0 最后一位是写 所以为低电平
respons();
write_byte(0x40);
respons();
write_byte(date);
respons();
stop();
}
unsigned char code sin_tab[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,0xDF,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
}; //用于生成正弦波
void sin_8591() //正弦波
{
unsigned int i;
for(i=0;i<256;i++)
{
write_add(sin_tab[i]); //data byte
delay_ms(5);
}
}
void fangbo()
{
unsigned int i;
if(i<128)
write_add(0xff);
if(i>=128)
write_add(0x00);
i++;
if(i>256)
i=0;
}
void sanjiao()
{
unsigned int i;
while(1)
{
for(i=0;i<255;i++)
write_add(i);
for(i=255;i>0;i--)
write_add(i);
}
}
void juxing()
{
unsigned int i;
while(1)
{
for(i=0;i<256;i++)
{
write_add(i);
}
}
}
void main()
{
TH0 = (65536-5000)/256;
TL0 = (65536-5000)%256;
TH1 = (65536-5000)/256;
TL1 = (65536-5000)%256;
EA = 1;
ET0 = 1;
ET1 = 1;
TR0 = 1;
TR1 = 1;
init();
}
void anjian(void) interrupt 3
{
TH1=(65536-5000)/256; //5000us
TL1=(65536-5000)%256;
if(k1==0)
{
delay_ms(5);
way++;
if(way>=3)
way=0;
}
}
void wave(void) interrupt 1
{
TH0=(65536-5000)/256;
TL0=(65536-5000)%256;
if(way==0)
{
sin_8591();
}
if(way==1)
{
fangbo();
}
if(way==2)
{
sanjiao();
}
if(way==3)
{
juxing();
}
}
复制代码
作者:
lkc8210
时间:
2022-4-6 15:46
定时器没有设置运行模式,于是运行了13位定时器,把(65536-5000)放入13位定时器会产生500us左右的中断,当有键按下,中断中有delay,delay其间又定时器又有中断…
作者:
非凡科技
时间:
2022-4-6 22:46
中断不要用阻塞延时,楼上正解
作者:
米霁113
时间:
2022-4-8 12:10
lkc8210 发表于 2022-4-6 15:46
定时器没有设置运行模式,于是运行了13位定时器,把(65536-5000)放入13位定时器会产生500us左右的中断,当 ...
那该怎么解决呢?两个定时器冲突,求大神指点
作者:
zhxiufan
时间:
2022-4-8 12:29
主要问题是主程序里面少了一个while(1);加到最后吧。
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1